34.2. 蓝牙

蓝牙是用于连接各种设备(例如,移动电话、PDA、外围设备、便携式计算机,或者键盘或鼠标等系统部件)的无线技术。蓝牙 (Bluetooth) 取自丹麦国王 Harold Bluetooth 的名字,正是他结束了斯堪的纳维亚半岛分裂混战的状态。蓝牙徽标是以 Rune(古代北欧文字)的“H”(像一颗星星)和“B”的组合为基础设计的。

蓝牙在多个重要方面区别于 IrDA。首先,各个设备不需要直接“看到”对方;其次,可以在网络中连接多个设备。但最大数据传送速率是 720Kbps(在当前版本 1.2 中)。理论上,蓝牙甚至可以穿墙进行通讯。但实际上,这取决于墙和设备类的属性。有三种设备类的传送范围在 10 到 100 米之间。

34.2.1. 基础

以下几节介绍了蓝牙的基本工作原理。了解需要符合哪些软件要求、蓝牙如何与系统交互以及蓝牙配置文件的工作原理。

34.2.1.1. 软件

为了能够使用蓝牙,您需要蓝牙适配器(内置适配器或外部设备均可)、驱动器和蓝牙协议堆栈。Linux 内核已包含使用蓝牙所需的基本驱动程序。Bluez 系统用作协议堆栈。为了确保应用程序能使用蓝牙,必须安装基础包 bluez-libsbluez-utils。这些包提供了多个所需的服务和实用程序。此外,某些适配器(如 Broadcom AVM BlueFritz!)需要安装 bluez-firmware 包。bluez-cups 包支持通过蓝牙连接进行打印。如果想调试 Bluetooth 连接中的问题,请安装程序包 bluez-hcidump

34.2.1.2. 常规交互

蓝牙系统由 4 个提供所需功能的互相关联的层组成:

硬件

实现 Linux 内核支持所需的适配器和合适的驱动程序。

配置文件

用于控制蓝牙系统。

守护程序

由配置文件控制并提供功能的服务。

应用程序

应用程序允许用户使用和控制守护程序提供的功能。

当插入蓝牙适配器时,热插拔系统将装载相应的驱动程序。在装载驱动程序后,系统检查配置文件以查看是否要启动蓝牙。如果要启动蓝牙,则它确定要启动的服务。根据此信息,启动相应的守护程序。安装时检测蓝牙适配器。如果找到一个或多个蓝牙适配器,则启用蓝牙。否则取消激活蓝牙系统。此后添加的任何蓝牙设备都必须手工启用。

34.2.1.3. 配置文件

在蓝牙中,服务是通过配置文件(例如,文件传送配置文件、基本打印配置文件和个域网配置文件)进行定义的。为使某台设备能使用另一台设备的服务,这两台设备都必须理解同一个配置文件,即设备包和手册中通常缺少的一些信息。遗憾的是,某些制造商没有严格遵守各配置文件的定义。不过,设备间的通讯通常能顺畅进行。

在下文中,本地设备是在物理上与计算机连接的那些设备。而只能通过无线连接进行访问的所有其它设备都被称为远程设备。

34.2.2. 配置

本节介绍蓝牙配置。了解涉及哪些配置文件、需要哪些工具以及如何使用 YaST 或手工配置蓝牙。

34.2.2.1. 使用 YaST 配置蓝牙

使用 YaST 蓝牙模块(如 图 34.2 “YaST 蓝牙配置” 中所示)在系统上配置蓝牙支持。一旦热插拔在系统中检测到蓝牙适配器(例如,在引导时或插入适配器时),将使用该模块中配置的设置自动启动蓝牙。

图 34.2. YaST 蓝牙配置

YaST 蓝牙配置

配置的第一步是确定在您的系统中是否要启动蓝牙服务。如果已启用了蓝牙服务,则可以配置两项内容。首先配置设备名。这是您的计算机被发现时其它设备显示的名称。有两个占位符可用,其中 — %h 代表系统的主机名(这很有用,例如,如果主机名由 DHCP 动态分配),而 %d 插入接口号(只有在计算机中安装了多个蓝牙适配器才有用)。例如,如果在此字段中输入 Laptop %h 且 DHCP 将名称 unit123 指派给计算机,则其它远程设备将您的计算机识别为 Laptop unit123

参数安全性管理器与远程设备尝试连接时本地系统的行为相关。不同之处是在对 PIN 码的处理上。这种处理要么允许任何设备不使用 PIN 进行连接,要么确定在需要 PIN 时如何选择正确的 PIN。可在相应的输入字段中输入 PIN(储存在配置文件中)。如果设备尝试连接,则它首先使用这个 PIN。如果连接失败,则它切换为不使用 PIN 进行连接。为获得最大的安全性,最好选择始终要求用户提供 PIN。此选项允许您对不同的(远程)设备使用不同的 PIN。

单击高级守护程序配置进入用于选择和配置可用服务(在蓝牙中称为配置文件)的对话框。所有可用服务都显示在列表中,可以通过单击激活取消激活启用或禁用这些服务。单击编辑打开一个对话框,可以在这个对话框中为所选服务(守护程序)指定其它参数。除非您熟悉服务,否则请不要进行任何更改。在完成守护程序的配置后,单击确定退出此对话框。

回到主对话框中,单击安全性选项进入安全性对话框并指定加密、鉴定和扫描设置。然后,退出安全性对话框返回主对话框。在单击完成关闭主对话框后,就可以使用蓝牙系统了。

您还可以从主对话框进入设备和服务类对话框。蓝牙设备被分为不同的设备类。请在此对话框中为您的计算机选择正确的设备类,如台式计算机便携式计算机。与服务类不同,设备类不太重要,但也在这里进行设置。有时,远程蓝牙设备(如移动电话)如果可以检测到在系统中设置的正确服务类,则只允许特定的功能。对于要在允许与计算机之间传送文件之前获得名为对象传送类的移动电话而言,往往是这种情况。您可以选择多个类。但无需为了“以防万一”而选择所有的类。在大多数情况下,默认的选择就足够了。

要使用蓝牙设置网络,则激活高级守护程序配置对话框中的 PAND,然后单击编辑设置守护程序的方式。对于一个有效的蓝牙网络连接,一个 pand 必须在监听方式下运行,而对应的同级必须在搜索方式下运行。默认情况下,预设为监听方式。调整本地 pand 的行为。此外,在 网卡模块中配置 bnepX 接口(其中 X 代表系统中的设备号)。

34.2.2.2. 手工配置蓝牙

Bluez 系统各个部件的配置文件都位于目录 /etc/bluetooth 中。唯一的例外是用于启动组件的文件 /etc/sysconfig/bluetooth,该文件由 YaST 模块修改。

只有用户 root 可以修改下面介绍的配置文件。目前,尚没有用于更改所有设置的图形用户界面。可以使用 YaST 蓝牙模块设置最重要的设置(在 第 34.2.2.1 节 “使用 YaST 配置蓝牙” 中有述)。所有其它设置都只能在出现特殊情况时由有经验的用户进行设置。通常,默认设置可以满足要求。

使用 PIN 号码可以基本防止不需要的连接。移动电话在建立第一个联系时(或在电话上建立设备联系时)通常查询 PIN。为使两台设备能进行通讯,这两台设备必须用相同的 PIN 对自身进行标识。在计算机上,PIN 位于文件 /etc/bluetooth/pin 中。

[Important]蓝牙连接的安全性

尽管有 PIN,但两台设备之间的数据传送也不是完全安全的。默认情况下,蓝牙连接的鉴定和加密处于取消激活状态。对某些蓝牙设备而言,激活鉴定和加密可能产生通信问题。

可以在配置文件 /etc/bluetooth/hcid.conf 中更改各种设置,例如设备名和安全性方式。通常,默认设置可以满足要求。此文件包含介绍各个设置选项的注释。

所包含文件中有两部分分别被指定为 optionsdevice。前者包含 hcid 用于启动的一般信息。后者包含各个本地蓝牙设备的设置。

options 部分中最重要的设置之一是 security auto;。如果设置为 auto,则 hcid 尝试对进来的连接使用本地 PIN。如果失败,则它切换到 none 并建立连接。为提高安全性,应将默认设置设置为 user,以确保每次建立连接时都要求用户输入 PIN。

device 部分设置在另一个设备中显示该计算机所使用的设备名。本部分定义设备类,例如 DesktopLaptopServer。还在这里启用或禁用鉴定和加密。

34.2.3. 系统部件和实用程序

蓝牙的可操作性取决于各种服务的交互。至少需要两个后台守护程序:hcid(主机控制器接口守护程序)和 sdpd(服务发现协议守护程序),前者充当蓝牙设备的接口并控制蓝牙设备,而设备可以通过后者找到主机提供的服务。如果在启动系统时未自动激活 hcid 和 sdpd,则可以使用命令 rcbluetooth start 激活这两个守护程序。必须以 root 用户身份执行此命令。

下面几段简要介绍了可用于使用蓝牙的最重要的 Shell 工具。尽管现在可以使用各种图形组件来控制蓝牙,但这些程序也值得您去关注。

某些命令只能以 root 用户身份执行。这包含用于测试远程设备连接的命令 l2pingdevice_address

34.2.3.1. hcitool

hcitool 可用于确定是否检测到本地和远程设备。命令 hcitool dev 列出本地设备。输出为每个检测到的本地设备生成一行,形式为 interface_name device_address

可以使用命令 hcitool inq 搜索远程设备。对于每个检测到的远程设备,返回 3 个值:设备地址、时钟偏移和设备类。设备地址很重要,因为其它命令用它来标识目标设备。时钟偏移主要用于技术目的。而设备类以十六进制值的形式指定设备类型和服务类型。

命令 hcitoolname device-address 可用于确定远程设备的设备名。对于远程计算机,设备类和设备名对应于其 /etc/bluetooth/hcid.conf 中的信息。使用本地设备地址将生成错误输出。

34.2.3.2. hciconfig

命令 /usr/sbin/hciconfig 提供有关本地设备的详细信息。如果不带任何参数执行 hciconfig,则输出将显示设备名 (hciX) 等设备信息、物理设备地址(12 位数字,形式为 00:12:34:56:78)和有关已传送数据量的信息。

hciconfig hci0 name 显示当您的计算机接收来自远程设备的请求时它返回的名称。除查询本地设备的设置外,hciconfig 还可用于修改这些设置。例如,hciconfig hci0 name TEST 将名称设置为 TEST

34.2.3.3. sdptool

程序 sdptool 可用于检查特定设备提供哪些服务。命令 sdptoolbrowse device_address 返回某个设备的所有服务。使用命令 sdptool search service_code 搜索特定的服务。此命令扫描所有可访问的设备来搜索请求的服务。如果其中一台设备提供服务,则此程序将输出此设备返回的完整服务名及简短说明。输入不带参数的 sdptool 可以查看所有可能的服务代码列表。

34.2.4. 图形应用程序

在 Konqueror 中,输入 URL bluetooth:/ 列出本地和远程蓝牙设备。双击某个设备可以获得此设备提供的服务的概述。如果将鼠标指针移过其中一个指定的服务,则浏览器的状态栏将显示将哪个配置文件用于此服务。如果您单击某个服务,则将打开一个对话框,询问您要执行的操作:保存、使用服务(必须启动应用程序来执行此操作)还是取消操作。如果您不希望此对话框再次显示,而是要始终执行所选的操作,则选中特定复选框。对于某些服务,尚不提供支持。而对于其它服务,可能需要安装附加包。

34.2.5. 示例

本节介绍两个典型的可能蓝牙方案的示例。第一个示例说明如何通过蓝牙在两台主机之间建立网络连接。第二个示例介绍计算机和移动电话之间的连接。

34.2.5.1. 两台主机间的网络连接

在第一个示例中,在主机 H1H2 之间建立网络连接。这两台主机包含蓝牙设备地址 baddr1baddr2(通过上面介绍的 hcitooldev 命令在这两台主机上确定)。应用 IP 地址 192.168.1.3 (H1) 和 192.168.1.4 (H2) 标识这两台主机。

蓝牙连接是借助 pand(personal area networking daemon,个人域网络守护程序)建立的。必须由用户 root 执行以下命令。这里主要介绍蓝牙特定的操作,不提供网络命令 ip 的详细说明。

输入命令 pand -s 在主机 H1 上启动 pand。随后,可以通过命令 pand-c baddr1 在主机 H2 上建立连接。如果您在其中一台主机上输入 ip link show 以列出可用的网络接口,则输出应包含如下所示的项:

 bnep0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000 
 link/ether 00:12:34:56:89:90 brd ff:ff:ff:ff:ff:ff

输出应包含本地设备地址 baddr1baddr2,而不是 00:12:34:56:89:90。现在,必须为此接口指派一个 IP 地址并将此接口激活。在 H1 上,可以通过以下两个命令完成此操作:

ip addr add 192.168.1.3/24 dev bnep0
ip link set bnep0 up

H2 上:

ip addr add 192.168.1.4/24 dev bnep0
ip link set bnep0 up

现在,可以从 H2 使用 IP 192.168.1.3 访问 H1。使用命令 ssh 192.168.1.4H1 访问 H2(假设 H2 运行 sshd,在 SUSE Linux 中默认激活此程序)。也可以以普通用户身份运行命令 ssh192.168.1.4

34.2.5.2. 将数据从移动电话传送到计算机

第二个示例说明如何将使用带有内置数码相机的移动电话拍摄的照片传送到计算机(传送多媒体讯息不会产生额外的费用)。尽管各种移动电话上的菜单结构有所不同,但过程通常十分类似。如有必要,请参见您的电话的手册。本示例介绍将 Sony Ericsson 移动电话中的照片传送到便携式计算机的过程。计算机上必须提供服务 Obex-Push,并且计算机必须向移动电话授予访问权限。第一步是在便携式计算机上使服务可用。需要在便携式计算机上运行特殊的服务守护程序才能从电话获取数据。如果安装了程序包 kbluetooth,则不需要启动特殊的守护程序。如果没有安装 kbluetooth,则请使用 bluez-utils 程序包中的 opd 守护程序。用以下命令启动该守护程序:

opd --mode OBEX --channel 10 --daemonize --path /tmp --sdp 

此命令使用了两个重要参数:--sdp 向 sdpd 注册服务,--path /tmp 指示程序保存接收到的数据的位置(在本例中保存到 /tmp)。您还可以指定具有写访问权限的任何其它目录。

如果使用 kbluetooth,则当在便携式计算机上接收到照片时,将提示您输入目录。

现在,移动电话必须联系上计算机。为此,打开电话中的连接菜单,然后选择蓝牙。如有必要,请在选择我的设备前单击打开。选择新设备并让电话搜索便携式计算机。如果检测到设备,其名称显示在屏幕上。选择与便携式计算机关联的设备。如果出现 PIN 查询,则输入 /etc/bluetooth/pin 中指定的 PIN。现在,您的电话就能识别便携式计算机了,并能与便携式计算机交换数据。退出当前菜单并转到图像菜单。选择要传送的图像并按更多。在下一个菜单中,按发送选择传送方式。选择通过蓝牙。便携式计算机将被作为目标设备列出。选择便携式计算机开始传送。图像随即被保存在使用 opd 命令指定的目录中。可以采用相同的方法将音频曲目传送到便携式计算机。

34.2.6. 查错

如果在建立连接时遇到困难,则根据以下列表继续操作。请记住,错误可能发生在连接的任何一端,或甚至两端都有错误。如果可能,请使用另一个蓝牙设备重现所发生的问题,以校验目前的设备是否有问题。

本地设备是否列在 hcitooldev 的输出中?

如果此输出中未列出本地设备,则可能是未启动 hcid 或设备未被识别为蓝牙设备。产生这种情况有多种原因。设备可能有问题或缺少正确的驱动程序。内置蓝牙的便携式计算机通常有一个用于无线设备(例如,WLAN 和蓝牙)的开关。请查看便携式计算机的手册以了解您的设备是否有这样一个开关。用命令 rcbluetoothrestart 重启动蓝牙系统,并检查 /var/log/messages 中是否报告了任何错误。

您的蓝牙适配器是否需要固件文件?

如果需要,请安装 bluez-bluefw 并用 rcbluetoothrestart 重启动蓝牙系统。

hcitoolinq 的输出是否返回其它设备?

请多次测试此命令。连接可能受到干扰,因为其它设备也在使用蓝牙的频段。

PIN 是否匹配?

检查计算机的 PIN 号码(在 /etc/bluetooth/pin 中)是否与目标设备的 PIN 号码相匹配。

远程设备是否能“看到”您的计算机?

尝试从远程设备建立连接。检查此设备是否能看到您的计算机。

是否可以建立网络连接(请参见 第 34.2.5.1 节 “两台主机间的网络连接”)?

第 34.2.5.1 节 “两台主机间的网络连接” 中所述的设置可能由于几种原因而不起作用。例如,这两台计算机中的一台可能不支持 ssh 协议。尝试 ping192.168.1.3ping192.168.1.4。如果有效,则检查 sshd 是否是活动的。另一个问题可能是,在这两台设备中,有一台设备的网络设置与示例中的地址 192.168.1.X 冲突。如果是这种情况下,请尝试使用不同的地址,例如 10.123.1.210.123.1.3

便携式计算机是否显示为目标设备(请参见 第 34.2.5.2 节 “将数据从移动电话传送到计算机”)?移动设备是否识别便携式计算机上的 Obex-Push 服务?

我的设备中,选择相应的设备并查看服务的列表。如果未显示 Obex-Push(甚至在更新列表后也未显示),则问题是由便携式计算机上的 opd 引起的。opd 是否是活动的?您是否对指定的目录具有写访问权限?

第 34.2.5.2 节 “将数据从移动电话传送到计算机” 中所述的情况在反方向上是否可行?

如果安装了 obexftp 包,则可在某些设备上使用命令 obexftp -b device_address -B 10 -p image。已对多部 Siemens 和 Sony Ericsson 移动电话进行了测试,可以正常工作。请参见 /usr/share/doc/packages/obexftp 中的文档。

如果安装了 bluez-hcidump 程序包,则可以使用 hcidump -X 检查在设备之间发送的数据。有时输出有助于提示发生问题的地方,但是请注意它实际上只是“明文”的一部分。

34.2.7. 参见信息

其它某些文档(最新)可从 /usr/share/doc/packages/bluez-utils/(提供德语和英语版本)获取。

对于蓝牙的使用和配置,http://www.holtmann.org/linux/bluetooth/ 提供了各种说明的广泛概述。其它有用的信息和说明: