目的:实现Linux开发板与蓝牙串口设备的通信。
环境准备:安装有蓝牙驱动的linux开发板,支持蓝牙串口的设备,安装BlueZ
1.查询当前蓝牙服务:# sdptool browse local
如果出现Failed to connect to SDP server on FF:FF:FF:00:00:00: No such file or directory,则需要执行一下# bluetoothd,再次查询当前蓝牙服务# sdptool browse local,出现蓝牙服务列表
Browsing FF:FF:FF:00:00:00 ...
Service Name: Headset Audio Gateway
Service RecHandle: 0x10000
Service Class ID List:
"Headset Audio Gateway" (0x1112)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 12
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0102
Service Name: Hands-Free Audio Gateway
Service RecHandle: 0x10001
Service Class ID List:
"Handsfree Audio Gateway" (0x111f)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 13
Profile Descriptor List:
"Handsfree" (0x111e)
Version: 0x0105
Service Name: AVRCP TG
Service RecHandle: 0x10002
Service Class ID List:
"AV Remote Target" (0x110c)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 23
"AVCTP" (0x0017)
uint16: 0x103
Profile Descriptor List:
"AV Remote" (0x110e)
Version: 0x0104
Service Name: AVRCP CT
Service RecHandle: 0x10003
Service Class ID List:
"AV Remote" (0x110e)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 23
"AVCTP" (0x0017)
uint16: 0x103
Profile Descriptor List:
"AV Remote" (0x110e)
Version: 0x0100
可以看到在列表中,没有我们要的SSP服务,也就是串口服务,此时我们需要添加一个spp服务。
2.添加spp服务:执行# sdptool add SP,出现Serial Port service registered,表示已经添加成功,再次查询本地蓝牙服务,可以看到
Service Name: Serial Port
Service Description: COM Port
Service Provider: BlueZ
Service RecHandle: 0x10004
Service Class ID List:
"Serial Port" (0x1101)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Serial Port" (0x1101)
Version: 0x0100
3.设置蓝牙搜索可见:#hciconfig hci0 piscan
4.扫描蓝牙设备:#hcitool scan
5.新建端口:# mknod -m 666 /dev/rfcomm0 c 216 0
6.绑定设备:# rfcomm bind 0 要连接的蓝牙MAC地址 要绑定的设备通道号(一般为1,可输入# sdptool browse 蓝牙MAC地址 查询。
# rfcomm bind 0 00:80:25:43:2D:A7 1
7.连接设备:# rfcomm connect 0 要连接的蓝牙MAC地址 要绑定的设备通道号(同上)
此时如果出现Can't create RFCOMM TTY: Address already in use,需要释放一下
# rfcomm release 0,再次执行连接,出现Connected /dev/rfcomm0 to 00:80:25:43:2D:A7 on channel 1 Press CTRL-C for hangup,表示连接成功。按CTRL + C退出。
8.读端口数据:# cat /dev/rfcomm0,此时可能会提示cat: can't open '/dev/rfcomm0': No such file or directory,再重新执行一下步骤5 、6,再次运行# cat /dev/rfcomm0,即可接收到蓝牙设备发送的数据。
当结束数据接收时,需要重新连接,即步骤7,显示Can't create RFCOMM TTY: Address already in use,不用管他,再次读端口数据即可。