17.Linux蓝牙串口相关协议与使用步骤
一、 蓝牙协议概念
1.先从现象说起
说现象前要讲一个概念,adapter可以对比日常wifi中的热点的概念。
从蓝牙模块的应用app说起
可以看到蓝牙搜索到的adapter分为BLE与SPP
2.蓝牙协议的分类
参考传送门:
经典蓝牙串口SPP
https://docs.petoi.com/v/chinese/li-cheng/10.-jing-dian-lan-ya-chuan-kou-spp
目前主要的蓝牙协议分为2类,基于RFCOMM的传统蓝牙(HS/BR/EDR)(对应的蓝牙串口就是上面的SPP)和基于GATT的蓝牙低功耗(BLE)。
1.rfcomm是什么,做什么
(1) RFCOMM,Radio Frequency Communication,串口线性仿真协议。
(2) 蓝牙技术为电缆的替代技术,为了替代串型电缆连接方式,为建立在串口之上的传统应用提供接口,RFCOMM应运而生。
(3) RFCOMM是一个简单传输协议,提供了基于L2CAP协议的串行(9针RS-232)仿真,支持在两个蓝牙设备间高达60路的通信连接。
(4) RFCOMM的目的:在两个不同设备上的应用之间保证一条完整的通信路径。
2.GATT
要了解GATT先需要了解ATT
ATT基于GATT属性概要在客户端和服务端之间传输属性数据(attribute)。
GATT封装了ATT,主要用来规范attribute中的数据内容,并将不同的attribute进行分组分类。负责协调蓝牙LE链路中配置文件的交换,配置文件包括诸如handle分配、UUID和权限等信息和数据。
3.BR/EDR与BLE
低功耗蓝牙(Bluetooth low energy,即LE)
基础/增强速率蓝牙(Bluetooth basic rate/enhanced data rate ,即BR/EDR)
传统蓝牙速度较快,具体应用协议多,如面向音频的A2DP,蓝牙串口SPP等。但功耗较高,且接入苹果设备需要MFi(Made For iOS)的芯片及认证。
蓝牙低功耗(BLE,Bluetooth Low Energy)可以自行定义各种GATT的Profile,自身也配置了常用的Profile(如设备信息、电池等),功耗低用途广,可以用在苹果设备上,缺点是比起传统蓝牙速度比较慢。蓝牙低功耗多用于手环/智能手表/信标等数据量低但是对功耗敏感的设备上。
3.蓝牙协议的框架解读
参考传送门:
Bluetooth技术学习笔记 ——RFCOMM(1)
https://blog.csdn.net/u012800825/article/details/88741103
BLE学习(1):蓝牙协议栈的介绍
https://blog.csdn.net/tilblackout/article/details/127921514
单双模的蓝牙协议栈的框图
补充SPP在BR/EDR蓝牙协议中的位置
Controller(s)为蓝牙控制器,就是蓝牙芯片。HCI为控制器接口,逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol
,即L2CAP
)。
二、Desktop SPP蓝牙调试
以汇承HC-04为例进行说明,HC-04 蓝牙串口通信模块是新一代的基于 SPP&BLE5.0 蓝牙协议的双模数传模块
HC-04说明书
http://www.hc01.com/downloads/HC-04_v2.4.pdf
1.从机(slave)配置
在x86 Ubuntu系统上,使用cutecom以及minicom都有问题,只能收还是只能发来着,这里将从机模块插到x86 Windows上,安装官方提供的驱动,以及上位机。
HC-04默认出厂参数: 波特率 9600N81,SPP 蓝牙名 HC-04,BLE 蓝牙名 HC-04LE;SPP 配对密码 1234, BLE 没有配对密码。上位机效果如下图
2.主机(host)操作步骤
a.安装好blueman的Desktop系统,可以使用界面进行配对,配对会弹出输入密码窗口。
配对会有弹窗报错connection failed,try to connect manually,不用理会。
b.手动连接
连接效果图,可以看出虚拟出了串口节点/dev/rfcomm0
b.cutecom连接串口,便可以进行串口通信
三、 SPP蓝牙命令调试
参考传送门:
树莓派连接蓝牙设备 | 编程读取数据
https://www.bilibili.com/read/cv8292866
archlinux 蓝牙串口
https://wiki.archlinuxcn.org/wiki/%E8%93%9D%E7%89%99#%E8%93%9D%E7%89%99%E4%B8%B2%E5%8F%A3
1.命令创建串口节点
配对好的蓝牙,可以使用rfcomm创建串口
# rfcomm bind rfcomm0 MAC_address_of_Bluetooth_device
创建成功后可以使用cutecom来打开
*ps:*遇到过一个发送会弹窗,no device的情况,原因为没插上天线,实质搜不到想要连接的蓝牙
*ps:*有的教程会要求往systemd蓝牙服务中添加/usr/bin/sdptool add SP
本文档只主板作为主机,故不详细解释,不进行更改,只做记录。
# cat /lib/systemd/system/bluetooth.service
[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth
[Service]
Type=dbus
BusName=org.bluez
###########下面两行为添加内容,修改后可能需要内核支持,具体情况查看systemd日志
ExecStart=/usr/lib/bluetooth/bluetoothd --compat --noplugin=sap -E
ExecStartPost=/usr/bin/sdptool add SP
NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
ProtectHome=true
ProtectSystem=full
[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service
2.一些调试命令
● hciconfig大致相当于ifconfig
# hciconfig
hci0: Type: Primary Bus: USB
BD Address: 30:7B:C9:5B:2A:E1 ACL MTU: 820:8 SCO MTU: 255:12
UP RUNNING PSCAN
RX bytes:2104 acl:17 sco:0 events:113 errors:0
TX bytes:3209 acl:17 sco:0 commands:90 errors:0
● systemctl status bluetooth 可以查看bluetooth的运行情况,可以看到启动bluetoothd过程中会启用SDP server
# systemctl status bluetooth
��● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset
Active: active (running) since Tue 2023-02-28 14:55:26 CST; 32min ago
Docs: man:bluetoothd(8)
Main PID: 357 (bluetoothd)
Status: "Running"
CGroup: /system.slice/bluetooth.service
��└��─357 /usr/lib/bluetooth/bluetoothd
Feb 28 14:55:26 norco systemd[1]: Starting Bluetooth service...
Feb 28 14:55:26 norco bluetoothd[357]: Bluetooth daemon 5.48
Feb 28 14:55:26 norco bluetoothd[357]: Starting SDP server
Feb 28 14:55:26 norco bluetoothd[357]: Bluetooth management interface 1.10 initi
Feb 28 14:55:26 norco systemd[1]: Started Bluetooth service.
● sdptool用于加深一些东西的理解
# sdptool -h
sdptool - SDP tool v5.48
Usage:
sdptool [options] <command> [command parameters]
Options:
-h Display help
-i Specify source interface
Commands:
search Search for a service
browse Browse all available services
records Request all records
add Add local service
del Delete local service
get Get local service
setattr Set/Add attribute to a SDP record
setseq Set/Add attribute sequence to a SDP record
Services:
DID SP DUN LAN FAX OPUSH FTP PRINT HS HSAG HF HFAG SAP PBAP MAP
NAP GN PANU HCRP HID KEYB WIIMOTE CIP CTP A2SRC A2SNK AVRCT AVRTG
UDIUE UDITE SEMCHLA SR1 SYNCML SYNCMLSERV ACTIVESYNC HOTSYNC
PALMOS NOKID PCSUITE NFTP NSYNCML NGAGE APPLE IAP ISYNC GATT
● sdptool browse MAC 用于查设备的提供的服务
# sdptool browse 04:22:08:03:10:CE
Browsing 04:22:08:03:10:CE ...
Service Name: SerialPort
Service RecHandle: 0x1000f
Service Class ID List:
"Serial Port" (0x1101)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Profile Descriptor List:
"Serial Port" (0x1101)
Version: 0x0102
Service Name: WeChat
Service RecHandle: 0x1000e
Service Class ID List:
UUID 128: e5b152ed-6b46-09e9-4678-665e9a972cbc
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 23
Profile Descriptor List:
"Serial Port" (0x1101)
Version: 0x0102
3.回头看协议框图
参考传送门:
BLE学习(1):蓝牙协议栈的介绍
https://www.bilibili.com/read/cv8292866
蓝牙协议栈概览
https://www.jianshu.com/p/29af94dc518c
SDP(SERVICE DISCOVERY PROTOCOL):服务发现协议,服务发现协议(SDP)为应用程序提供了一种方法来发现哪些服务可用,并确定这些可用服务的特征
GAP负责定义设备在蓝牙LE通信中的角色。它还管理连接的建立和安全。GAP直接与应用程序配置文件和App层连接。目前主要用来进行广播、扫描和发起连接。
HCI层以下为kernel驱动抽象出hci0
RFCOMM用来将无线的蓝牙信号抽象成虚拟串口,注意此串口与wifi蓝牙模块是串口还是USB接口的串口不是一个概念,SPP用来形成一个profile
四、BLE蓝牙调试
1.内核的配合
不是所有模块都支持BLE,这里使用模块rtl8733bu,蓝牙驱动更新版本到 VERSION “3.1.6d45ddf.20220519-142432”
下面的日志表示ok
# dmesg | grep rtl
[ 2.925781] usbcore: registered new interface driver rtl8150
[ 6.878077] rtk_btusb: config filename rtl8723fu_config
[ 6.902215] rtk_btusb: fw name is rtl8723fu_fw
2.从机的设置
这里以有人WH-BLE106为例
模块 6 位通讯密码,出厂默认为 000000
模块的缺省 UART 口参数为: 波特率 57600、无校验、8 位数据位、1 位停止位
WH-BLE106 模块具有多种工作模式,启动时模块自动进入设置的模式,用户可以通过串口命令把模块切 换到命令行(AT 指令)模式。
从其他模式切换到命令模式需要在串口上输入“+++a”,模块在收到“+++a”后会返回一个确认码“a+ok”, 当在串口发现这个打印信息后即说明模块进入了命令行模式。
以cutecom为例说明,蓝牙模块AT指令的使用
a.以None发送+++a 受到a+OK表示进入了AT指令模式
b.以CR/LF发送AT指令
c.常用以及可能用到的AT指令
AT+MODE?
AT+PASS=000000
AT+UART=460800,8,0,0
AT+ENTM 退出
AT+PASSEN 设置/查询是否使能密码配对验证
AT+PAIR 设置/查询设备模块是否开启配对
3.配对ble
前面的步骤做好,此步骤毫无波澜,无论是用blueman还是用bluetoothctl
4.ble调试工具的使用
参考传送门:
gatttool命令详解
https://blog.csdn.net/u010764600/article/details/119685484
【蓝牙】蓝牙,调试 hcitool与gatttool实例
https://www.cnblogs.com/chenxiaomeng/p/9128565.html
gatttool,这个命令实际上是一个gatt client,不知道大家有没有用过手机上的BLE调试工具,比如苹果上最好用的就是lightblue,安卓上类似的工具比较多,我个人比较常用的就是rfconnect。而现在将要介绍的这个命令gatttool的功能就类似于手机上的BLE调试工具。它可以扫描gatt server上的服务,可以给他们发送指令等。
上面的介绍和传送门全是废话,使用ubantu上面的bluez测试硬件设备的BLE功能时遇到了不少坑,在这里记录下,也希望可以帮助其他小伙伴少踩坑。网上一搜,很多资源都是在讲gatttool。但是这个工具总是在连接之后十几秒的时间就提示:GLib-WARNING **: Invalid file descriptor,进而断开BLE的连接,加上它已经是属于已弃用的Bluez工具(弃用工具看这里)。所以推荐使用Bluetoothctl工具。
真 参考传送门:
Bluetooth LEBluez中Bluetoothctl指令详解(连接iPhone为例)
https://blog.csdn.net/u010764600/article/details/119685484
############运行bluetoothctl###########
root@norco:~# bluetoothctl
[NEW] Controller C4:3C:B0:D4:68:FB norco [default]
[NEW] Device CA:89:CB:9A:0C:ED Mi Smart Band 4
[NEW] Device 4A:F9:B4:E0:44:D4 4A-F9-B4-E0-44-D4
[NEW] Device 65:2E:2B:A0:C2:64 65-2E-2B-A0-C2-64
[NEW] Device 6C:81:3B:96:3A:2E 6C-81-3B-96-3A-2E
[NEW] Device 56:C3:97:6C:AF:DB 56-C3-97-6C-AF-DB
[NEW] Device 7F:9E:C4:74:27:71 7F-9E-C4-74-27-71
[NEW] Device C1:05:1D:03:11:52 Mi Smart Band 6
[NEW] Device 5A:EE:E6:CE:66:D5 5A-EE-E6-CE-66-D5
[NEW] Device D4:AD:20:3D:1A:04 WH-BLE 106
[NEW] Device 64:98:94:EC:1C:97 64-98-94-EC-1C-97
[NEW] Device C4:22:08:03:10:CE HC-04BLE
[NEW] Device 5C:43:1A:38:56:A5 5C-43-1A-38-56-A5
[NEW] Device 04:22:08:03:10:CE HC-04
Agent registered
############配对WH-BLE 106###########
[bluetooth]# pair D4:AD:20:3D:1A:04
Attempting to pair with D4:AD:20:3D:1A:04
[CHG] Device D4:AD:20:3D:1A:04 Connected: yes
[NEW] Primary Service
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001
00001801-0000-1000-8000-00805f9b34fb
Generic Attribute Profile
[NEW] Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0002
00002a05-0000-1000-8000-00805f9b34fb
Service Changed
[NEW] Descriptor
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0002/desc0004
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
[NEW] Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0005
00002b29-0000-1000-8000-00805f9b34fb
Unknown
[NEW] Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0007
00002b2a-0000-1000-8000-00805f9b34fb
Unknown
[NEW] Primary Service
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010
0003cdd0-0000-1000-8000-00805f9b0131
Vendor specific
[NEW] Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011
0003cdd1-0000-1000-8000-00805f9b0131
Vendor specific
[NEW] Descriptor
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011/desc0013
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
[NEW] Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0014
0003cdd2-0000-1000-8000-00805f9b0131
Vendor specific
[CHG] Device D4:AD:20:3D:1A:04 UUIDs: 00001800-0000-1000-8000-00805f9b34fb
[CHG] Device D4:AD:20:3D:1A:04 UUIDs: 00001801-0000-1000-8000-00805f9b34fb
[CHG] Device D4:AD:20:3D:1A:04 UUIDs: 0003cdd0-0000-1000-8000-00805f9b0131
[CHG] Device D4:AD:20:3D:1A:04 ServicesResolved: yes
[CHG] Device D4:AD:20:3D:1A:04 Paired: yes
Pairing successful
[CHG] Device D4:AD:20:3D:1A:04 Trusted: yes
############连接WH-BLE 106###########
[WH-BLE 106]# connect D4:AD:20:3D:1A:04
Attempting to connect to D4:AD:20:3D:1A:04
Connection successful
############进入gatt菜单###########
[WH-BLE 106]# menu gatt
Menu gatt:
Available commands:
-------------------
list-attributes [dev] List attributes
select-attribute <attribute/UUID> Select attribute
attribute-info [attribute/UUID] Select attribute
read Read attribute value
write <data=xx xx ...> Write attribute value
acquire-write Acquire Write file descriptor
release-write Release Write file descriptor
acquire-notify Acquire Notify file descriptor
release-notify Release Notify file descriptor
notify <on/off> Notify attribute value
register-application [UUID ...] Register profile to connect
unregister-application Unregister profile
register-service <UUID> Register application service.
unregister-service <UUID/object> Unregister application service
register-characteristic <UUID> <Flags=read,write,notify...> Register application characteristic
unregister-characteristic <UUID/object> Unregister application characteristic
register-descriptor <UUID> <Flags=read,write...> Register application descriptor
unregister-descriptor <UUID/object> Unregister application descriptor
back Return to main menu
version Display version
quit Quit program
exit Quit program
help Display help about this program
############列出attributes###########
[WH-BLE 106]# list-attributes D4:AD:20:3D:1A:04
Primary Service
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001
00001801-0000-1000-8000-00805f9b34fb
Generic Attribute Profile
Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0002
00002a05-0000-1000-8000-00805f9b34fb
Service Changed
Descriptor
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0002/desc0004
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0005
00002b29-0000-1000-8000-00805f9b34fb
Unknown
Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0001/char0007
00002b2a-0000-1000-8000-00805f9b34fb
Unknown
Primary Service
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010
0003cdd0-0000-1000-8000-00805f9b0131
Vendor specific
Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011
0003cdd1-0000-1000-8000-00805f9b0131 #######记住末尾131的,别问为什么是这个服务#####
Vendor specific
Descriptor
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011/desc0013
00002902-0000-1000-8000-00805f9b34fb
Client Characteristic Configuration
Characteristic
/org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0014
0003cdd2-0000-1000-8000-00805f9b0131 #######记住末尾131的,别问为什么是这个服务,BLE串口服务Vendor specific#####
Vendor specific
############选择attributes###########
[WH-BLE 106]# select-attribute /org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011
############显示attributes###########
[WH-BLE 106:/service0010/char0011]# attribute-info
Characteristic - Vendor specific
UUID: 0003cdd1-0000-1000-8000-00805f9b0131
Service: /org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010
Notifying: no
Flags: notify
############开启notify###########
[WH-BLE 106:/service0010/char0011]# notify on
[CHG] Attribute /org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011 Notifying: yes
Notify started
############从机使用串口助手发送字符串1111111,可以收到###########
[CHG] Attribute /org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0011 Value:
31 31 31 31 31 31 31 1111111
############选择attributes###########
[WH-BLE 106]# select-attribute /org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0014
############写数据,从机可以收到###########
[WH-BLE 106:/service0010/char0014]# write 0x14
Attempting to write /org/bluez/hci0/dev_D4_AD_20_3D_1A_04/service0010/char0014