首页 > 代码库 > debian下蓝牙适配器的配置和使用

debian下蓝牙适配器的配置和使用

本文打算将蓝牙适配器和手机蓝牙进行配对。

 

买了个支持蓝牙4.0协议的蓝牙适配器,将其插入到pc(debian 7.4)的usb口。

 

查看手机蓝牙信息:

选择手机中"设置"->"关于手机"->"状态信息"可以看到蓝牙地址是18:DC:56:D2:1C:1A

 

pc上安装蓝牙工具:

sudo apt-get install bluez bluez-hcidump

 

查看系统输出信息:

$ dmesg | tail -n 4[25259.408121] usb 1-1.2: new full-speed USB device number 32 using ehci_hcd[25259.614615] usb 1-1.2: New USB device found, idVendor=0a12, idProduct=0001[25259.614621] usb 1-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0[25259.614626] usb 1-1.2: Product: CSR8510 A10

 

查看蓝牙适配器设备信息:

$ lsusbBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUBBus 001 Device 031: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)Bus 002 Device 003: ID 046d:c05a Logitech, Inc. Optical Mouse M90Bus 003 Device 002: ID 413c:2003 Dell Computer Corp. Keyboard$ lsusb -s 001:031 -vBus 001 Device 031: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)Couldnt open device, some information will be missingDevice Descriptor:  bLength                18  bDescriptorType         1  bcdUSB               2.00  bDeviceClass          224 Wireless  bDeviceSubClass         1 Radio Frequency  bDeviceProtocol         1 Bluetooth  bMaxPacketSize0        64  idVendor           0x0a12 Cambridge Silicon Radio, Ltd  idProduct          0x0001 Bluetooth Dongle (HCI mode)  bcdDevice           88.91  iManufacturer           0   iProduct                2   iSerial                 0   bNumConfigurations      1  Configuration Descriptor:    bLength                 9    bDescriptorType         2    wTotalLength          177    bNumInterfaces          2    bConfigurationValue     1    iConfiguration          0     bmAttributes         0xe0      Self Powered      Remote Wakeup    MaxPower              100mA    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        0      bAlternateSetting       0      bNumEndpoints           3      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x81  EP 1 IN        bmAttributes            3          Transfer Type            Interrupt          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0010  1x 16 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x02  EP 2 OUT        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0040  1x 64 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x82  EP 2 IN        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0040  1x 64 bytes        bInterval               1    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       0      bNumEndpoints           2      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0000  1x 0 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0000  1x 0 bytes        bInterval               1    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       1      bNumEndpoints           2      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0009  1x 9 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0009  1x 9 bytes        bInterval               1    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       2      bNumEndpoints           2      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0011  1x 17 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0011  1x 17 bytes        bInterval               1    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       3      bNumEndpoints           2      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0019  1x 25 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0019  1x 25 bytes        bInterval               1    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       4      bNumEndpoints           2      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0021  1x 33 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0021  1x 33 bytes        bInterval               1    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        1      bAlternateSetting       5      bNumEndpoints           2      bInterfaceClass       224 Wireless      bInterfaceSubClass      1 Radio Frequency      bInterfaceProtocol      1 Bluetooth      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x03  EP 3 OUT        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0031  1x 49 bytes        bInterval               1      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x83  EP 3 IN        bmAttributes            1          Transfer Type            Isochronous          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0031  1x 49 bytes        bInterval               1

 

安装bluez后,会提供两个工具hciconfig和hcitool进行蓝牙相关的配置。

查看当前蓝牙适配器参数配置:

$ sudo hciconfig -ahci0:    Type: BR/EDR  Bus: USB    BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8    UP RUNNING PSCAN     RX bytes:3639 acl:0 sco:0 events:169 errors:0    TX bytes:745 acl:0 sco:0 commands:47 errors:0    Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3     Link policy: RSWITCH HOLD SNIFF PARK     Link mode: SLAVE ACCEPT     Name: debian-0    Class: 0x420100    Service Classes: Networking, Telephony    Device Class: Computer, Uncategorized    HCI Version: 4.0 (0x6)  Revision: 0x22bb    LMP Version: 4.0 (0x6)  Subversion: 0x22bb    Manufacturer: Cambridge Silicon Radio (10)

蓝牙适配器的mac地址是: 00:1A:7D:DA:71:13,名称是debian-0。

查看蓝牙适配器提供的各种功能:

$ sdptool browse localBrowsing FF:FF:FF:00:00:00 ...Service Name: SIM Access ServerService RecHandle: 0x10000Service Class ID List:  "SIM Access" (0x112d)  "Generic Telephony" (0x1204)Protocol Descriptor List:  "L2CAP" (0x0100)  "RFCOMM" (0x0003)    Channel: 8Profile Descriptor List:  "SIM Access" (0x112d)    Version: 0x0101Service Name: Headset Audio GatewayService RecHandle: 0x10001Service Class ID List:  "Headset Audio Gateway" (0x1112)  "Generic Audio" (0x1203)Protocol Descriptor List:  "L2CAP" (0x0100)  "RFCOMM" (0x0003)    Channel: 12Profile Descriptor List:  "Headset" (0x1108)    Version: 0x0102Service Name: Hands-Free Audio GatewayService RecHandle: 0x10002Service Class ID List:  "Handsfree Audio Gateway" (0x111f)  "Generic Audio" (0x1203)Protocol Descriptor List:  "L2CAP" (0x0100)  "RFCOMM" (0x0003)    Channel: 13Profile Descriptor List:  "Handsfree" (0x111e)    Version: 0x0105Service Name: AVRCP TGService RecHandle: 0x10003Service Class ID List:  "AV Remote Target" (0x110c)Protocol Descriptor List:  "L2CAP" (0x0100)    PSM: 23  "AVCTP" (0x0017)    uint16: 0x103Profile Descriptor List:  "AV Remote" (0x110e)    Version: 0x0103Service Name: AVRCP CTService RecHandle: 0x10004Service Class ID List:  "AV Remote" (0x110e)Protocol Descriptor List:  "L2CAP" (0x0100)    PSM: 23  "AVCTP" (0x0017)    uint16: 0x103Profile Descriptor List:  "AV Remote" (0x110e)    Version: 0x0100Service Name: Dial-Up NetworkingService RecHandle: 0x10005Service Class ID List:  "Dialup Networking" (0x1103)  "Generic Networking" (0x1201)Protocol Descriptor List:  "L2CAP" (0x0100)  "RFCOMM" (0x0003)    Channel: 1Profile Descriptor List:  "Dialup Networking" (0x1103)    Version: 0x0100Service Name: OBEX Object PushService RecHandle: 0x10006Service Class ID List:  "OBEX Object Push" (0x1105)Protocol Descriptor List:  "L2CAP" (0x0100)  "RFCOMM" (0x0003)    Channel: 9  "OBEX" (0x0008)Profile Descriptor List:  "OBEX Object Push" (0x1105)    Version: 0x0100Service Name: OBEX File TransferService RecHandle: 0x10007Service Class ID List:  "OBEX File Transfer" (0x1106)Protocol Descriptor List:  "L2CAP" (0x0100)  "RFCOMM" (0x0003)    Channel: 10  "OBEX" (0x0008)Profile Descriptor List:  "OBEX File Transfer" (0x1106)    Version: 0x0100

 

 

扫描蓝牙设备:

$ hcitool scanScanning ...    C4:17:FE:F6:65:FF    PC-201209031236    CC:52:AF:4F:52:16    HR-6F1397D64651    18:DC:56:D2:1C:1A    Coolpad 8297

使用hcitool获取手机蓝牙信息:

$ hcitool name 18:DC:56:D2:1C:1ACoolpad 8297$ sudo hcitool info 18:DC:56:D2:1C:1ARequesting information ...    BD Address:  18:DC:56:D2:1C:1A    Device Name: Coolpad 8297    LMP Version: 4.0 (0x6) LMP Subversion: 0x0    Manufacturer: MediaTek, Inc. (70)    Features page 0: 0xbf 0x3e 0x8d 0xfe 0xdb 0xff 0x5b 0x87        <3-slot packets> <5-slot packets> <encryption> <slot offset>         <timing accuracy> <role switch> <sniff mode> <RSSI>         <channel quality> <SCO link> <HV2 packets> <HV3 packets>         <CVSD> <power control> <transparent SCO> <broadcast encrypt>         <EDR ACL 2 Mbps> <EDR ACL 3 Mbps> <enhanced iscan>         <interlaced iscan> <interlaced pscan> <inquiry with RSSI>         <extended SCO> <EV4 packets> <EV5 packets> <AFH cap. slave>         <AFH class. slave> <LE support> <3-slot EDR ACL>         <5-slot EDR ACL> <sniff subrating> <pause encryption>         <AFH cap. master> <AFH class. master> <EDR eSCO 2 Mbps>         <EDR eSCO 3 Mbps> <3-slot EDR eSCO> <extended inquiry>         <LE and BR/EDR> <simple pairing> <encapsulated PDU>         <non-flush flag> <LSTO> <inquiry TX power> <EPC>         <extended features>     Features page 1: 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00    Features page 2: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

 

配置蓝牙适配器使得能被其他设备搜索到:

$ sudo hciconfig hci0 iscan

这时在手机中搜索蓝牙设备可以搜索到"debian-0",但是使用手机配对时提示“PIN或者配对密钥不正确,无法和debian-0进行配对"。

 

在执行下面几条命令:

$ sudo hciconfig hci0 pscan$ sudo hciconfig hci0 noencrypt$ sudo hciconfig hci0 noauth

然后在手机里可以对"debian-0"配对即可配对成功。

此时可以在pc上执行l2ping命令 :

host@debian:~$ sudo l2ping  -c 3 18:DC:56:D2:1C:1A[sudo] password for host: Ping: 18:DC:56:D2:1C:1A from 00:1A:7D:DA:71:13 (data size 44) ...44 bytes from 18:DC:56:D2:1C:1A id 0 time 15.00ms44 bytes from 18:DC:56:D2:1C:1A id 1 time 26.16ms44 bytes from 18:DC:56:D2:1C:1A id 2 time 26.14ms3 sent, 3 received, 0% loss

 

如果不使用上面的hciconfig命令来进行配置,也可以使用blueman或者gnome-bluetooth来配置蓝牙,安装这些工具:

sudo apt-get install blueman gnome-bluetooth

这两个工具都是图形化界面,使用起来相当方便,只是需要从手机端发起配对请求,然后在pc端和手机端分别进行确认即完成配对。

然后可以在pc端用蓝牙来向手机发送文件。

 

上面这两种情况下都是在手机端发起配对请求,之后也只是能通过蓝牙发文件。

但我希望能够使用bluez系列工具中提供的命令行工具从pc端发起配对请求,以便于以后将蓝牙适配器用到嵌入式开发板上。

参考《在linux下蓝牙使用rfcomm连接》 、《BluetoothUser》以及《Bluetooth_Mouse》进行操作,但都没成功,

这是因为我使用的bluez版本是4.99,没有bluez5中的bluetoothctl工具,也没有bluez4中的hidd工具,也没有常用的bluez3中的/etc/bluetooth/hcid.conf配置文件,

进行配对时总是会因为pin或者key的问题而导致配对失败,导致网络上大部分教程都不适用于这个版本。

 

最终我选用了另一种方式,先从手机来对蓝牙设备进行配对,然后将其模式修改成master,再从pc下执行命令就可以了。

首先配置rfcomm,修改/etc/bluetooth/rfcomm.conf(其实我不确定是否需要该配置,只是在参考网络文章时修改了这个配置文件):

host@debian:~$ cat /etc/bluetooth/rfcomm.conf ## RFCOMM configuration file.#rfcomm0 {    # Automatically bind the device at startup    bind no;    # Bluetooth address of the device    device 18:DC:56:D2:1C:1A;    # RFCOMM channel for the connection    channel    1;    # Description of the connection    comment "Example Bluetooth device";}

重启蓝牙服务:

sudo /etc/init.d/bluetooth restart

可以使用hcidump(类似于tcpdump工具能够打印bluez中每步都执行了什么功能,可以用于调试):

sudo hcidump -Xt

按照前面的步骤从手机来对蓝牙适配器进行配对,可以配对成功。

查看hci0(类似于网卡的eth0接口)的连接模式(link mode,可以是master或者slave):

$ sudo hciconfig hci0 lmhci0:    Type: BR/EDR  Bus: USB    BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8    Link mode: SLAVE ACCEPT 

将其连接模式从SLAVE修改为master:

sudo hciconfig hci0 lm master

这时查看连接模式:

$ sudo hciconfig hci0 lm[sudo] password for host: hci0:    Type: BR/EDR  Bus: USB    BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8    Link mode: MASTER 

已经将link mode修改为master模式。

使用rfcomm来连接手机蓝牙设备:

$ sudo rfcomm connect hci0 18:DC:56:D2:1C:1AConnected /dev/rfcomm0 to 18:DC:56:D2:1C:1A on channel 1Press CTRL-C for hangup

连接成功,查看连接信息:

$ sudo hcitool  conConnections:    < ACL 18:DC:56:D2:1C:1A handle 72 state 1 lm MASTER AUTH ENCRYPT 

可以执行hcitool中的cmd命令,例如下面的命令将当前设备的名称改成"ABCD":

$ sudo hcitool cmd 0x03 0x0013 0x41 0x42 0x43 0x44< HCI Command: ogf 0x03, ocf 0x0013, plen 4  41 42 43 44 > HCI Event: 0x0e plen 4  01 13 0C 00 

此时在hcidump对应窗口显示下面的信息:

2014-06-18 15:04:22.929405 < HCI Command: Write Local Name (0x03|0x0013) plen 4    name ABCDBCD2014-06-18 15:04:22.930381 > HCI Event: Command Complete (0x0e) plen 4    Write Local Name (0x03|0x0013) ncmd 1    status 0x002014-06-18 15:04:22.930474 < HCI Command: Read Local Name (0x03|0x0014) plen 02014-06-18 15:04:22.947378 > HCI Event: Command Complete (0x0e) plen 252    Read Local Name (0x03|0x0014) ncmd 1    status 0x00 name ABCD

使用hciconfig工具也可以查看到当前蓝牙适配器名称:

$ sudo hciconfig hci0 namehci0:    Type: BR/EDR  Bus: USB    BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8    Name: ABCD

可以看到蓝牙适配器的名称已经被改成ABCD了。

还有其他很多命令都可以用hcitool hci0 cmd来进行配置,《利用 hcitool 通过hci 命令与芯片交互》中提供了其他的一些命令,感兴趣的话可以自己玩玩看。

也可以下载《蓝牙4.0规范》,从704-1103页有关于蓝牙命令的详细说明。