Bluetooth (简体中文) - ArchWiki

# Bluetooth (简体中文)

翻译状态： 本文是英文页面 Bluetooth 的翻译，最后翻译时间：2017-03-21，点击这里可以查看翻译后英文页面的改动。

蓝牙是一个短距离无线通信标准，适用于手机、计算机和其他电子设备之间的通信。在 Linux 中，通常使用的蓝牙协议栈实现是 BlueZ.

## 安装

安装 bluez 和 bluez-utils 软件包。bluez 软件包提供蓝牙协议栈，bluez-utils 软件包提供 `bluetoothctl` 工具。 如果尚未加载通用蓝牙驱动则需先加载：

    # modprobe btusb

然后 启动 `bluetooth.service` systemd 单元。可以在系统引导时自动 启用 它。

注意:

- 默认情况下，蓝牙仅为 `lp` 用户组中的用户启用 bnep0 设备。如果想要加入蓝牙系统，需确认已将用户加入该组。可以修改`/etc/dbus-1/system.d/bluetooth.conf`文件中相应的组配置来实现。
- 有些蓝牙适配器是与无线网卡绑定在一起的（比如：英特尔迅驰）。这就要求无线网卡先被启用（典型情况是在笔记本电脑上用快捷键启用）以便蓝牙适配器对内核可见。
- 有些厂家（如 Broadcom）的蓝牙卡与网卡有冲突（不兼容）。这就需要确认在网络服务引导之前蓝牙设备已连接。

## 通过命令行工具配置蓝牙

### Bluetoothctl

通过命令行配对是最可靠的选择。准确的配对过程依不同设备类型及其所提供的输入功能而各不相同。下面提供使用`/usr/bin/bluetoothctl`配对的一般过程：

启动 `bluetoothctl` 交互命令。可以输入 `help` 列出所有有效的命令。

- 输入`power on` 命令打开控制器电源。默认是关闭的。
- 输入`devices` 命令获取要配对设备的 MAC 地址。
- 如果设备未在清单中列出，输入 `scan on` 命令设置设备发现模式。
- 输入`agent on` 命令打开代理。
- 输入 `pair MAC Address` 开始配对（支持 tab 键补全）。
- 如果使用无 PIN 码设备，再次连接可能需要手工认证。输入 `trust MAC Address` 命令。
- 最后，用 `connect MAC_address` 命令建立连接。

以下为一个交互实例：

    # bluetoothctl
    [NEW] Controller 00:10:20:30:40:50 pi [default]
    [bluetooth]# agent KeyboardOnly
    Agent registered
    [bluetooth]# default-agent
    Default agent request successful
    [bluetooth]# scan on
    Discovery started
    [CHG] Controller 00:10:20:30:40:50 Discovering: yes
    [NEW] Device 00:12:34:56:78:90 myLino
    [CHG] Device 00:12:34:56:78:90 LegacyPairing: yes
    [bluetooth]# pair 00:12:34:56:78:90
    Attempting to pair with 00:12:34:56:78:90
    [CHG] Device 00:12:34:56:78:90 Connected: yes
    [CHG] Device 00:12:34:56:78:90 Connected: no
    [CHG] Device 00:12:34:56:78:90 Connected: yes
    Request PIN code
    [agent] Enter PIN code: 1234
    [CHG] Device 00:12:34:56:78:90 Paired: yes
    Pairing successful
    [CHG] Device 00:12:34:56:78:90 Connected: no

为使系统重启后激活设备，需添加一条 udev 规则：

    /etc/udev/rules.d/10-local.rules

    # Set bluetooth power up
    ACTION=="add", KERNEL=="hci0", RUN+="/usr/bin/hciconfig hci0 up"

为使设备在系统挂起后唤醒时自动上电，应使用如下例所示 systemd 服务：

    /etc/systemd/system/bluetooth-auto-power@.service

    [Unit]
    Description=Bluetooth auto power on
    After=bluetooth.service sys-subsystem-bluetooth-devices-%i.device suspend.target

    [Service]
    Type=oneshot
    #We could also do a 200 char long call to bluez via dbus. Except this does not work since bluez does not react to dbus at this point of the resume sequence and I do not know how I get this service to run at a time it does. So we just ignore bluez and force %i up using hciconfig. Welcome to the 21st century.
    #ExecStart=/usr/bin/dbus-send --system --type=method_call --dest=org.bluez /org/bluez/%I org.freedesktop.DBus.Properties.Set string:org.bluez.Adapter1 string:Powered variant:boolean:true
    ExecStart=/usr/bin/hciconfig %i up

    [Install]
    WantedBy=suspend.target

使用你的蓝牙设备的设备名来启用一个此服务的实例，例如 bluetooth-auto-power@hci0.service。

除了添加自定义服务和 udev 规则之外，你也可以通过反注释 /etc/bluetooth/main.conf 文件中的 [Policy] 和 AutoEnable 两行，来启用 BlueZ 5.35 中引入的 AutoEnable 特性。

## 图形化前端

下面的软件包提供了一个图形化的界面来自定义蓝牙。

### GNOME Bluetooth

GNOME Bluetooth 是 GNOME 的 蓝牙管理工具。gnome-bluetooth 软件包提供后端。gnome-shell 提供状态监视小部件。gnome-control-center 提供图形化配置前端工具，可以在活动概览中输入Bluetooth或者用 `gnome-control-center bluetooth` 命令打开。可以用 `bluetooth-sendto` 命令直接向远端设备发送文件。

要接收文件，必须安装 gnome-user-share 软件包。然后在 设置 -> 共享 中授权配对的设备通过蓝牙接收文件。

提示： 若要在 Thunar 中文件属性的发送到菜单中增加蓝牙选项，参阅这里的命令。（需要设置的命令是 `bluetooth-sendto %F`)。

### Bluedevil

bluedevil 是 KDE 的蓝牙管理工具，可以用 bluedevil（KDE Plasma 5）或 bluedevil4[broken link: package not found]（KDE 4）安装。

确认`bluetooth`守护进程在运行。你可以在dolphin和系统通知区域里得到一个蓝牙图标，你可以通过点击这个图标来设置bluedevil、检测蓝牙设备等等。你也可以通过KDE的系统设置来配置bluedevil。

### Blueberry

Blueberry 是 GNOME Bluetooth 的另一替代方案，可工作于所有桌面环境。可安装 blueberry 软件包。它提供了配置工具（blueberry）和系统托盘程序（blueberry-tray）。

### Blueman

参阅 Blueman

## 使用 Obex 发送接收文件

### ObexFS

除了KDE和Gnome Bluetooth软件包之外，Obexfs是另一个选择，它可以允许你挂载你的手机作为文件系统的一部分。

注意: 如果要使用Obex，你需要一个能够提供Obex FTP服务的设备。

安装 obexfs，运行如下命令来挂载你的手机:

    $ obexfs -b MAC_address_of_device /mountpoint

使用完以后, 运行以下命令umount你的手机设备:

    $ fusermount -u /mountpoint

参阅 http://dev.zuckschwerdt.org/openobex/wiki/ObexFs 查看更多挂载选项

Note: Ensure that the bluetooth device you are mounting is not set to mount read-only. You should be able to do this from the device's settings. If the device is mounted read-only you may encounter a permissions error when trying to transfer files to the device.

### ObexFTP transfers

If your device supports the Obex FTP service but you do not wish to mount the device you can transfer files to and from the device using the obexftp command.

To send a file to a device run the command:

    $ obexftp -b MAC_address_of_device -p /path/to/file

To retrieve a file from a device run the command:

    $ obexftp -b MAC_address_of_device -g filename

Note: Ensure that the file you are retrieving is in the device's exchange folder. If the file is in a subfolder of the exchange folder then provide the correct path in the command.

### Obex Object Push

For devices that do not support Obex FTP service, check if Obex Object Push is supported.

    # sdptool browse XX:XX:XX:XX:XX:XX

Read the output, look for Obex Object Push, remember the channel for this service. If supported, one can use ussp-push to send files to this device:

    # ussp-push XX:XX:XX:XX:XX:XX@CHANNEL file wanted_file_name_on_phone

### 将你的电脑音响用作蓝牙音响

这么做可以将你电脑上的外放设备用作蓝牙音响，通过蓝牙为你的手机提供外放。

将以下内容添加到配置文件 `/etc/bluetooth/audio.conf` (如果文件不存在，创建一个):

    [General]
    Enable=Source

阅读更多:

- https://gist.github.com/joergschiller/1673341
- http://www.lightofdawn.org/blog/?viewDetailed=00031

## 音频

如要使用蓝牙耳机或蓝牙音响设备，你需要安装 pulseaudio-bluetooth 软件包。

请参阅 Bluetooth headset (简体中文) 查看更多关于蓝牙耳机、音响设备及相关问题排查的信息。

如要让你的电脑能够作为A2DP sink被探测到（可以作为蓝牙音响播放来自于你手机的音乐），在 `/etc/bluetooth/audio.conf`配置文件的`[General]`栏添加以下内容：`Enable=Source,Sink,Media,Socket`

## 配对

注意: 这一部分描述可能不是完全的准确。感谢Gattschardo解决了个人验证码部分

许多蓝牙(Bluetooth)设备要求在使用时配对。 实际上的过程取决于配对涉及到的设备和这些设备的输入功能。 在移动电话上的配对过程可能会像下面那样：

- 计算机向移动电话发送一个配对请求
- 移动电话上会提示输入一个由计算机给出的PIN（个人识别码）码
- 必须在计算机上重新输入同一个序列（指上文中的PIN）。

通过执行一下命令来搜索外部设备

     $ hcitool scan

在不使用gnome-bluez包的情况下配对设备，你需要使用一个包含在bluez包里的，叫做bluez-simple-agent的工具。你需要从常用的软件仓库里获取几个跟python相关的工具来使这种方法可用：dbus-python和pygobject。 如果你准备好了，你可以以root身份执行这个脚本：

     # bluez-simple-agent

如果它工作正常，你应当会在控制台得到消息："Agent registered" 。

现在你可以开始从你的移动电话开始配对工作，这个脚本会在控制台询问你PIN码，你输入进去然后按回车键确认，这样就完成了配对工作。接下来可以通过^C-c终止这个脚本的执行，只需要在配对的时候使用这个脚本，而连接设备时不需要用到它。

需要查看例子.请向下翻页到示例部分。

## 示例

### 西门子 S55

这是我链接我的S55的过程。（我还没搞明白怎么样通过电话来初始化连接。）

- 根据安装步骤

      $> hcitool scan
      Scanning ...
              XX:XX:XX:XX:XX:XX  NAME
      $> B=XX:XX:XX:XX:XX:XX

在另一个终端启动simple-agent

      $> su -c bluez-simple-agent
      Password:
      Agent registered

回到上一个终端

      $> obexftp -b $B -l "Address book"
      # Phone ask for pin, I enter it and answer yes when asked if I want to save the device
      ...
      <file name="5F07.adr" size="78712" modified="20030101T001858" user-perm="WD" group-perm="" />
      ...
      $> obexftp -b 00:01:E3:6B:FF:D7 -g "Address book/5F07.adr"
      Browsing 00:01:E3:6B:FF:D7 ...
      Channel: 5
      Connecting...done
      Receiving "Address book/5F07.adr"... Sending "Address book"... done
      Disconnecting...done
      $> obexftp -b 00:01:E3:6B:FF:D7 -p a
      ...
      Sending "a"... done
      Disconnecting...done

### 罗技鼠标 MX Laser / M555b

快速测试连接

    $> hidd --connect XX:XX:XX:XX:XX:XX

通过桌面想到设置鼠标一实现自动重连。 如果你的桌面环境不提供对此任务的支持，参阅Bluetooth mouse manual configuration向导.

### 摩托罗拉 V900

在安装blueman并且运行blueman-applet之后,在摩托罗拉设备的菜单connections -> bluetooth下单击"find me"。在blueman-applet搜索设备，找到摩托罗拉，然后单击blueman-applet中的“添加。单击“bond”，输入pin码，根据摩托罗达上的提示输入相同的pin码，在终端执行：

      cd ~/
      mkdir bluetooth-temp
      obexfs -n xx:yy:zz:... ~/bluetooth-temp
      cd ~/bluetooth-temp

然后浏览... 这样操作时只能访问音频、视频和图片。

### 摩托罗拉 RAZ

    > pacman -S obextool obexfs obexftp openobex bluez

    > lsusb
    Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 002: ID 03f0:171d Hewlett-Packard Wireless (Bluetooth + WLAN) Interface [Integrated Module]
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    > hciconfig hci0 up

    > hciconfig
    hci0:   Type: BR/EDR  Bus: USB
            BD Address: 00:16:41:97:BA:5E  ACL MTU: 1017:8  SCO MTU: 64:8
            UP RUNNING
            RX bytes:348 acl:0 sco:0 events:11 errors:0
            TX bytes:38 acl:0 sco:0 commands:11 errors:0

    > hcitool dev
    Devices:
            hci0    00:16:41:97:BA:5E

注意：确保手机上的蓝牙处于打开状态并且是可见的

    > hcitool scan
    Scanning ...
            00:1A:1B:82:9B:6D       [quirxi]

    > hcitool inq
    Inquiring ...
            00:1A:1B:82:9B:6D       clock offset: 0x1ee4    class: 0x522204

    > l2ping 00:1A:1B:82:9B:6D
    Ping: 00:1A:1B:82:9B:6D from 00:16:41:97:BA:5E (data size 44) ...
    44 bytes from 00:1A:1B:82:9B:6D id 0 time 23.94ms
    44 bytes from 00:1A:1B:82:9B:6D id 1 time 18.85ms
    44 bytes from 00:1A:1B:82:9B:6D id 2 time 30.88ms
    44 bytes from 00:1A:1B:82:9B:6D id 3 time 18.88ms
    44 bytes from 00:1A:1B:82:9B:6D id 4 time 17.88ms
    44 bytes from 00:1A:1B:82:9B:6D id 5 time 17.88ms
    6 sent, 6 received, 0% loss

    > hcitool name  00:1A:1B:82:9B:6D
    [quirxi]

    # hciconfig -a hci0
    hci0:   Type: BR/EDR  Bus: USB
            BD Address: 00:16:41:97:BA:5E  ACL MTU: 1017:8  SCO MTU: 64:8
            UP RUNNING
            RX bytes:9740 acl:122 sco:0 events:170 errors:0
            TX bytes:2920 acl:125 sco:0 commands:53 errors:0
            Features: 0xff 0xff 0x8d 0xfe 0x9b 0xf9 0x00 0x80
            Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
            Link policy:
            Link mode: SLAVE ACCEPT
            Name: 'BCM2045'
            Class: 0x000000
            Service Classes: Unspecified
            Device Class: Miscellaneous,
            HCI Version: 2.0 (0x3)  Revision: 0x204a
            LMP Version: 2.0 (0x3)  Subversion: 0x4176
            Manufacturer: Broadcoml / Corporation (15)

    > hcitool info 00:1A:1B:82:9B:6D
    Requesting information ...
            BD Address:  00:1A:1B:82:9B:6D
            Device Name: [quirxi]
            LMP Version: 1.2 (0x2) LMP Subversion: 0x309
            Manufacturer: Broadcom Corporation (15)
            Features: 0xff 0xfe 0x0d 0x00 0x08 0x08 0x00 0x00
                    <3-slot packets> <5-slot packets> <encryption> <slot offset>
                    <timing accuracy> <role switch> <hold mode> <sniff mode>
                    <RSSI> <channel quality> <SCO link> <HV2 packets>
                    <HV3 packets> <A-law log> <CVSD> <power control>
                    <transparent SCO> <AFH cap. slave> <AFH cap. master>

编辑你的main.conf并且输入对应与你手机的class( Class = 0x100100 ):

    > vim /etc/bluetooth/main.conf

      # Default device class. Only the major and minor device class bits are
      # considered.
      #Class = 0x000100
      Class =  0x100100

    > /etc/rc.d/dbus start
    :: Starting D-BUS system messagebus
    [DONE]

    > /etc/rc.d/bluetooth start
    :: Stopping bluetooth subsystem:  pand dund rfcomm hidd  bluetoothd
    [DONE]
    :: Starting bluetooth subsystem:  bluetoothd

通过bluez-simple-agent配对只需要做一次。当你的手机要求输入pin码时，输入0000

    > /usr/bin/bluez-simple-agent hci0 00:1A:1B:82:9B:6D
    RequestPinCode (/org/bluez/10768/hci0/dev_00_1A_1B_82_9B_6D)
    Enter PIN Code: 0000
    Release
    New device (/org/bluez/10768/hci0/dev_00_1A_1B_82_9B_6D)

现在你可以动过ObexFTP来访问你手机上的文件了：

    > obexftp -v -b 00:1A:1B:82:9B:6D -B 9 -l
    Connecting..\done
    Tried to connect for 448ms
    Receiving "(null)"...-<?xml version="1.0" ?>
    <!DOCTYPE folder-listing SYSTEM "obex-folder-listing.dtd">
    <folder-listing>
    <parent-folder />
    <folder name="audio" size="0" type="folder" modified="20101010T132323Z" user-perm="RW" />
    <folder name="video" size="0" type="folder" modified="20101010T132323Z" user-perm="RW" />
    <folder name="picture" size="0" type="folder" modified="20101010T132323Z" user-perm="RW" />
    </folder-listing>
    done
    Disconnecting..\done

你也可以把你的手机作为文件系统的一部分挂载在你的计算机上：

    > groupadd bluetooth
    > mkdir /mnt/bluetooth
    > chown root:bluetooth /mnt/bluetooth
    > chmod 775 /mnt/bluetooth
    > usermod -a -G bluetooth arno

    > obexfs -b 00:1A:1B:82:9B:6D /mnt/bluetooth/
    > l /mnt/bluetooth/
    total 6
    drwxr-xr-x 1 root root    0 10. Okt 13:25 .
    drwxr-xr-x 5 root root 4096 10. Okt 10:08 ..
    drwxr-xr-x 1 root root    0 10. Okt 2010  audio
    drwxr-xr-x 1 root root    0 10. Okt 2010  picture
    drwxr-xr-x 1 root root    0 10. Okt 2010  video

### 使用bluez-simple-agent来跟iPhone配对

假设有一个叫做hci0的蓝牙设备和一个在hcitool里显示为'00:00:DE:AD:BE:EF'的iPhone：

       # bluez-simple-agent hci0 00:00:DE:AD:BE:EF
       Passcode:

## 疑难解答

### passkey-agent

    $> passkey-agent --default 1234
    Can't register passkey agent
    The name org.bluez was not provided by any .service files

你可能在启动`/etc/rc.d/dbus`之前启动了 `/etc/rc.d/bluetooth`

    $> hciconfig dev
    # (no listing)

尝试运行 `hciconfig hc0 up`

### Blueman

如果blueman-applet启动失败，试着删除整个/var/lib/bluetooth目录然后重新启动电脑（或者仅仅重启hal、dbus和bluetooth这几个服务）。

    # rm -rf /var/lib/bluetooth
    # reboot

### gnome-bluetooth

如果你通过在蓝牙属性里接受文件时受到如下消息：

     Bluetooth OBEX start failed: Invalid path
     Bluetooth FTP start failed: Invalid path

那么运行

     # pacman -S xdg-user-dirs
     $ xdg-user-dirs-update

你可以通过下列方式修改路径：

     $ vi ~/.config/user-dirs.dirs

### Bluetooth USB 适配器

如果你在使用USB适配器，你应当确认你的适配器被正确识别。你可以在插入适配器时通过查看`/var/log/messages.log`，这应当会出现类似于下面所示的信息：

    # tail -f /var/log/messages.log
    May  2 23:36:40 tatooine usb 4-1: new full speed USB device using uhci_hcd and address 9
    May  2 23:36:40 tatooine usb 4-1: configuration #1 chosen from 1 choice
    May  2 23:36:41 tatooine hcid[8109]: HCI dev 0 registered
    May  2 23:36:41 tatooine hcid[8109]: HCI dev 0 up
    May  2 23:36:41 tatooine hcid[8109]: Device hci0 has been added
    May  2 23:36:41 tatooine hcid[8109]: Starting security manager 0
    May  2 23:36:41 tatooine hcid[8109]: Device hci0 has been activated

查看支持的硬件列表，请参考本页的resources。

如果你只得到了前面两行，说明了电脑发现了这个设备，但是你需要手动启动它。 例如：

    hciconfig -a hci0
    hci0:	Type: USB
    	BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0
    	DOWN
    	RX bytes:0 acl:0 sco:0 events:0 errors:0
    	TX bytes:0 acl:0 sco:0 commands:0 errors:
    sudo hciconfig hci0 up
    hciconfig -a hci0
    hci0:	Type: USB
    	BD Address: 00:02:72:C4:7C:06 ACL MTU: 377:10 SCO MTU: 64:8
    	UP RUNNING
    	RX bytes:348 acl:0 sco:0 events:11 errors:0
    	TX bytes:38 acl:0 sco:0 commands:11 errors:0

要验证这个设备被正确检测，你可以使用`bluez-utils`当中的`hcitool`。你可以通过下面方式获得受支持的设备、它们的识别码和硬件地址：

    $ hcitool dev
    Devices:
            hci0	00:1B:DC:0F:DB:40

可以通过`hciconfig`获得关于这个设备更详细的信息。

    $ hciconfig -a hci0
    hci0:   Type: USB
            BD Address: 00:1B:DC:0F:DB:40 ACL MTU: 310:10 SCO MTU: 64:8
            UP RUNNING PSCAN ISCAN
            RX bytes:1226 acl:0 sco:0 events:27 errors:0
            TX bytes:351 acl:0 sco:0 commands:26 errors:0
            Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80
            Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
            Link policy: RSWITCH HOLD SNIFF PARK
            Link mode: SLAVE ACCEPT
            Name: 'BlueZ (0)'
            Class: 0x000100
            Service Classes: Unspecified
            Device Class: Computer, Uncategorized
            HCI Ver: 2.0 (0x3) HCI Rev: 0xc5c LMP Ver: 2.0 (0x3) LMP Subver: 0xc5c
            Manufacturer: Cambridge Silicon Radio (10)

### hcitool scan: 没找到设备

- 在某些Dell的笔记本电脑(比如 Studio 15)上，你必须把蓝牙模式由HID改成HCI

    # hid2hci

- 有时候这个简单的命令也会有用：

    # hciconfig hci0 up

### 我的电脑不可见

如果不能从你的移动电话上找到你的电脑，打开PSCAN和ISCAN：

    # 打开 PSCAN 和 ISCAN
    $ hciconfig hci0 piscan
    # 确认操作有效
    $ hciconfig
    hci0:   Type: USB
            BD Address: 00:12:34:56:78:9A ACL MTU: 192:8 SCO MTU: 64:8
            UP RUNNING PSCAN ISCAN
            RX bytes:20425 acl:115 sco:0 events:526 errors:0
            TX bytes:5543 acl:84 sco:0 commands:340 errors:0

注意: 检查/etc/bluetooth/main.conf中的发现倒计时和配对倒计时

试着在 /etc/bluetooth/main.conf 改变设备的class

    # Default device class. Only the major and minor device class bits are
    # considered.
    #Class = 0x000100 (from default config)
    Class = 0x100100

这是目前唯一的能够使电脑对电话可见的方法。

### Nautilus无法浏览文件

如果Nautilus无法打开并且显示如下错误：

    Nautilus cannot handle obex: locations. Couldn't display "obex://[XX:XX:XX:XX:XX:XX]/".

安装gvfs-obexftp软件包：

    # pacman -S gvfs-obexftp

## 资源

- Official Linux Bluetooth protocol stack
- List of Linux supported Bluetooth Hardware >> The list is not available anymore!
- openSUSE Bluetooth Hardware Compatibility List (HCL)
- Gentoo wiki is usually good
- Accessing a Bluetooth phone on Linux Gazette
- Bluetooth computer visibility

Categories:

- 简体中文
- Bluetooth (简体中文)

Hidden category:

- Pages with broken package links