type
status
date
slug
summary
tags
category
icon
password
1.简介内容
这是一个基于蓝牙实现串口通信的案例,实现了利用蓝牙技术实现设备与手机之间的双向数据传输。运行后,用户可以通过 APP 连接蓝牙设备,并通过虚拟串口实现数据的实时收发。
在这个示例中,蓝牙设备提供了两个关键特征:一个用于发送数据(TX 特征),另一个用于接收数据(RX 特征)。
2.软硬件平台
硬件平台是nordic的nrf5x系列开发板nrf52832。
软件平台采用的是nrf5x系列芯片的RT-Thread嵌入式系统工程,使用了nimble软件包
3. 试验
3.1. 试验板
3.1.1. 程序配置设置
步骤跟第一章都是一样的,区别在于选择案例的时候要选择uart
3.2. 实验结果
把示例编译烧入板子后,来到串口控制台输入bleuart运行实例
终端会接收用户输入的字符串,按下回车键后即可将数据发送到手机app
然后程序在运行后,手机打开nRFconnect可以搜到对应的蓝牙
在上图中,我们可以看到蓝牙设备的一些基本信息,例如设备的名字以及其对应的 UUID 等关键信息。
当我们点击右侧的“连接”按钮后,蓝牙设备会开始建立连接,并进行 GATT 服务和特征的发现流程。
在下图中,可以清晰地看到设备上配置的服务以及各个服务对应的特征信息。这些特征包含了设备提供的具体功能数据,供客户端进行读取、写入或通知等操作。
这时候在串口控制台输入一些数据回车发送
这时notify的特征就会收到数据
在app端点击RX旁边的箭头也可以发送数据给串口控制台
3.3. 抓包分析
示例刚启动的时候会发送广播数据包,该数据包包含3个主要内容
- 广播的类型
- UUID
- 发射功率
广播数据包是在蓝牙主机协议栈启动后,通过调用sync_cb函数中的广播配置来实现的
然后就是配置响应数据包
当app端点击连接后,监听的数据包会出现连接相关的请求
- 蓝牙连接从 CONNECT_IND 开始,随后进行链路层的功能协商(Feature、Length、Version)。
- 建立连接后,通过 ATT/GATT 协议 完成服务发现和属性访问。
其中蓝牙连接部分,nimble协议栈内部已经处理好了
而GATT中服务跟特征还需要手动配置一下
在示例里可以看到这两行代码,主要功能就是将gatt_svr_svcs结构体添加进GATT服务表
这个结构体里存放了服务特征的uuid以及属性
上图抓到的包中展示了GATT服务特征的属性设置
然后就是收发数据
通过ATT协议,app接收到了来自串口控制台的数据
app发送给串口控制台也是一样的,不同的是从机还会返回一个响应包
4. 代码分析
相比于ibeacon,uart的示例在原本的基础上增加了GATT以及跟终端控制台的适配
首先是初始化,需要服务跟特征配置好
TX 特征通过通知的形式将数据发送给手机,而 RX 特征则通过可写属性来接收数据。
在特征的回调函数中,当 RX 特征接收到数据时,会将数据写入到控制台设备中。同时,通过修改控制台输出的回调函数,将接收到的数据实时显示在控制台上。
bleuart_uart_proc() 函数的作用是将终端输入的字符串通过具有通知属性的特征发送到 APP。这个函数会不断监听终端输入,当检测到新的输入时,将其封装并通过蓝牙通知机制发送给连接的设备,从而实现实时的数据传输。
有关题目或文章的问题,欢迎您在底部评论区留言,一起交流~
- Author:小彦同学
- URL:https://alicization.site/article/2024/11/30/163aaa90-4859-80d7-9781-fa784ef7e24b
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!