当前位置: 首页 > news >正文

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




相关文章:

  • GGUF 和 llama.cpp 是什么关系
  • 【记一次】AI微调训练步数计算方式
  • 在使用 RabbitMQ 时,手动确认消息和死信队列
  • 告别命令行,我用图形界面畅玩 DeepSeek-R1 1.5B
  • Redis为什么用跳表实现有序集合?
  • 深入解析 Uniswap:自动做市商模型的数学推导与智能合约架构
  • vue有几个版本
  • 【IDEA】IDEA常用快捷键(适应包括xml所有类型文件)
  • Redis 知识点梳理
  • 宠物AI识别技术颠覆自助洗宠场景,解决4大难题
  • systemd-networkd 的 /etc/systemd/network/*.network 的配置属性名称是不是严格区分大小写?是
  • 设计模式之装饰器模式
  • 项目日记 -云备份 -服务器配置信息模块
  • 区块链项目价值跃迁:从技术叙事到资本共振的包装艺术
  • 【Text2reward】环境状态信息学习笔记
  • python __name__与__main__深刻理解(涵详细解释、应用场景、代码举例、高级用法)
  • 基于WebRtc,GB28181,Rtsp/Rtmp,SIP,JT1078,H265/WEB融合视频会议接入方案
  • 工单分类总结
  • Leetcode Hot 100 35.搜索插入位置
  • 体育直播模板nba英超直播欧洲杯直播模板手机自适应
  • 习近平同俄罗斯总统普京茶叙
  • 山寨“小米”智能马桶、花洒销售额过亿,被判赔3500万元
  • 【社论】以法治力量促进民企长远健康发展
  • 马上评|孩子亲近自然只能靠公园露营了吗
  • 对话|蓬皮杜策展人布莱昂:抽象风景中的中国审美
  • 百济首次实现季度营业利润扭亏,泽布替尼销售额近57亿元