debian下蓝牙适配器的配置和使用
阅读原文时间:2023年07月15日阅读:1

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

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

查看手机蓝牙信息:

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

pc上安装蓝牙工具:

sudo apt-get install bluez bluez-hcidump

查看系统输出信息:

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

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

$ lsusb
Bus Device : ID 1d6b: Linux Foundation 2.0 root hub
Bus Device : ID 1d6b: Linux Foundation 1.1 root hub
Bus Device : ID 1d6b: Linux Foundation 1.1 root hub
Bus Device : ID 1d6b: Linux Foundation 1.1 root hub
Bus Device : ID 1d6b: Linux Foundation 1.1 root hub
Bus Device : ID 1a40: Terminus Technology Inc. -Port HUB
Bus 001 Device 031: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus Device : ID 046d:c05a Logitech, Inc. Optical Mouse M90
Bus Device : ID 413c: Dell Computer Corp. Keyboard
$ lsusb -s : -v

Bus Device : ID 0a12: Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Couldn't open device, some information will be missing
Device Descriptor:
bLength
bDescriptorType
bcdUSB 2.00
bDeviceClass Wireless
bDeviceSubClass Radio Frequency
bDeviceProtocol Bluetooth
bMaxPacketSize0
idVendor 0x0a12 Cambridge Silicon Radio, Ltd
idProduct 0x0001 Bluetooth Dongle (HCI mode)
bcdDevice 88.91
iManufacturer
iProduct
iSerial
bNumConfigurations
Configuration Descriptor:
bLength
bDescriptorType
wTotalLength
bNumInterfaces
bConfigurationValue
iConfiguration
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x81 EP IN
bmAttributes
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x02 EP OUT
bmAttributes
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x82 EP IN
bmAttributes
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x bytes
bInterval
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x03 EP OUT
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0000 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x83 EP IN
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0000 1x bytes
bInterval
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x03 EP OUT
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x83 EP IN
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x bytes
bInterval
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x03 EP OUT
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0011 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x83 EP IN
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0011 1x bytes
bInterval
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x03 EP OUT
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0019 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x83 EP IN
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0019 1x bytes
bInterval
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x03 EP OUT
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0021 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x83 EP IN
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0021 1x bytes
bInterval
Interface Descriptor:
bLength
bDescriptorType
bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass Wireless
bInterfaceSubClass Radio Frequency
bInterfaceProtocol Bluetooth
iInterface
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x03 EP OUT
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0031 1x bytes
bInterval
Endpoint Descriptor:
bLength
bDescriptorType
bEndpointAddress 0x83 EP IN
bmAttributes
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0x0031 1x bytes
bInterval

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

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

$ sudo hciconfig -a
hci0: Type: BR/EDR Bus: USB
BD Address: :1A:7D:DA:: ACL MTU: : SCO MTU: :
UP RUNNING PSCAN
RX bytes: acl: sco: events: errors:
TX bytes: acl: sco: commands: errors:
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 ()

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

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

$ sdptool browse local
Browsing FF:FF:FF::: …
Service Name: SIM Access Server
Service RecHandle: 0x10000
Service Class ID List:
"SIM Access" (0x112d)
"Generic Telephony" (0x1204)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel:
Profile Descriptor List:
"SIM Access" (0x112d)
Version: 0x0101

Service Name: Headset Audio Gateway
Service RecHandle: 0x10001
Service Class ID List:
"Headset Audio Gateway" (0x1112)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel:
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0102

Service Name: Hands-Free Audio Gateway
Service RecHandle: 0x10002
Service Class ID List:
"Handsfree Audio Gateway" (0x111f)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel:
Profile Descriptor List:
"Handsfree" (0x111e)
Version: 0x0105

Service Name: AVRCP TG
Service RecHandle: 0x10003
Service Class ID List:
"AV Remote Target" (0x110c)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM:
"AVCTP" (0x0017)
uint16: 0x103
Profile Descriptor List:
"AV Remote" (0x110e)
Version: 0x0103

Service Name: AVRCP CT
Service RecHandle: 0x10004
Service Class ID List:
"AV Remote" (0x110e)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM:
"AVCTP" (0x0017)
uint16: 0x103
Profile Descriptor List:
"AV Remote" (0x110e)
Version: 0x0100

Service Name: Dial-Up Networking
Service RecHandle: 0x10005
Service Class ID List:
"Dialup Networking" (0x1103)
"Generic Networking" (0x1201)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel:
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100

Service Name: OBEX Object Push
Service RecHandle: 0x10006
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel:
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX Object Push" (0x1105)
Version: 0x0100

Service Name: OBEX File Transfer
Service RecHandle: 0x10007
Service Class ID List:
"OBEX File Transfer" (0x1106)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel:
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX File Transfer" (0x1106)
Version: 0x0100

扫描蓝牙设备:

$ hcitool scan
Scanning …
C4::FE:F6::FF PC-
CC::AF:4F:: HR-6F1397D64651
18:DC:56:D2:1C:1A Coolpad 8297

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

$ hcitool name :DC::D2:1C:1A
Coolpad
$ sudo hcitool info :DC::D2:1C:1A
Requesting information …
BD Address: :DC::D2:1C:1A
Device Name: Coolpad
LMP Version: 4.0 (0x6) LMP Subversion: 0x0
Manufacturer: MediaTek, Inc. ()
Features page : 0xbf 0x3e 0x8d 0xfe 0xdb 0xff 0x5b 0x87
<-slot packets> <-slot packets>






<-slot EDR ACL>
<-slot EDR ACL>

<-slot EDR eSCO>



Features page : 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Features page : 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 :DC::D2:1C:1A
[sudo] password for host:
Ping: :DC::D2:1C:1A from :1A:7D:DA:: (data size ) …
bytes from :DC::D2:1C:1A id time .00ms
bytes from :DC::D2:1C:1A id time .16ms
bytes from :DC::D2:1C:1A id time .14ms
sent, received, % 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 :DC::D2:1C:1A;

# RFCOMM channel for the connection  
channel    ;

# 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 lm
hci0: Type: BR/EDR Bus: USB
BD Address: :1A:7D:DA:: ACL MTU: : SCO MTU: :
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: :1A:7D:DA:: ACL MTU: : SCO MTU: :
Link mode: MASTER

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

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

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

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

$ sudo hcitool con
Connections:
< ACL :DC::D2:1C:1A handle state lm MASTER AUTH ENCRYPT

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

$ sudo hcitool cmd 0x03 0x0013 0x41 0x42 0x43 0x44
< HCI Command: ogf 0x03, ocf 0x0013, plen

HCI Event: 0x0e plen
0C

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

-- ::22.929405 < HCI Command: Write Local Name (0x03|0x0013) plen name 'ABCDBCD' -- ::22.930381 > HCI Event: Command Complete (0x0e) plen
Write Local Name (0x03|0x0013) ncmd
status 0x00
-- ::22.930474 < HCI Command: Read Local Name (0x03|0x0014) plen -- ::22.947378 > HCI Event: Command Complete (0x0e) plen
Read Local Name (0x03|0x0014) ncmd
status 0x00 name 'ABCD'

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

$ sudo hciconfig hci0 name
hci0: Type: BR/EDR Bus: USB
BD Address: :1A:7D:DA:: ACL MTU: : SCO MTU: :
Name: 'ABCD'

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

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

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章