type
status
date
slug
summary
tags
category
icon
password
1.简介内容
这是一个基于蓝牙实现数据收发的案例。运行后,可通过APP连接蓝牙设备并进行数据收发。
这个案例做了一些修改,原本发送随机数据到手机的特征修改为发送特定变量的数据
2.软硬件平台
硬件平台是nordic的nrf5x系列开发板nrf52832。
软件平台采用的是nrf5x系列芯片的RT-Thread嵌入式系统工程,使用了nimble软件包
3. 试验
3.1. 试验板
3.1.1. 程序配置设置
步骤跟第一章都是一样的,区别在于选择案例的时候要选择
3.2. 实验结果
把示例编译烧入板子后,来到串口控制台输入bleprph运行实例
当程序在开发板运行后,使用nRFconnect可以搜到对应的蓝牙
连接后即可进行数据收发测试
可以看到有2个特征
一个是只读的,另一个支持读写
点击只读的特征旁边的三角就可以读取设备上的数据
这时在支持读写的特征写入数据,然后读取第一个特征就可以把写入的数据读出来
4. 代码分析
相对于beacon,这个案例主要是增加了GATT相关的代码
其次是将广播配置为可连接和可发送响应广播
在这个初始化函数中,通过将
gatt_svr_svcs
结构体数组传递给协议栈,实现了 GATT 的初始化操作。gatt_svr_svcs
结构体数组包含了示例中定义的服务和特征信息,这些信息将被协议栈解析并注册到设备的 GATT 服务表中,从而使设备能够对外提供相应的服务和特征。- 每个元素定义了一个服务(Service)。
- 每个服务由多个特征(Characteristic)组成。
这个结构体数组主要由以下的几个元素组成
.type = BLE_GATT_SVC_TYPE_PRIMARY
- 定义服务的类型为主服务(Primary Service)。
- BLE 中服务类型有两种:主服务(Primary Service) 和 次服务(Secondary Service)。主服务是设备的核心功能,而次服务通常依附于主服务。
.uuid = &gatt_svr_svc_sec_test_uuid.u
- 服务的 UUID,标识服务的类型和用途。
.characteristics
- 指向一个特征数组,每个特征用
struct ble_gatt_chr_def
定义。 - 数组最后一个元素为
{ 0 }
,表示没有更多特征。
每个特征通过
struct ble_gatt_chr_def
结构体定义,主要字段解析如下:.uuid = &gatt_svr_chr_sec_test_rand_uuid.u
- 特征的 UUID,标识特征的类型和功能。
.access_cb = gatt_svr_chr_access_sec_test
- 特征的访问回调函数。
- 当客户端尝试读取、写入或订阅特征时,协议栈会调用此函数处理请求。
.flags
- 特征的权限标志,定义了特征的访问属性。例如:
BLE_GATT_CHR_F_READ
:表示特征支持被读取。BLE_GATT_CHR_F_WRITE
:表示特征支持被写入。BLE_GATT_CHR_F_NOTIFY
:表示特征支持通知客户端。- 在代码中:
- 第一个特征的标志是
BLE_GATT_CHR_F_READ
,表示支持读取。 - 第二个特征的标志是
BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE
,表示支持读取和写入。
在特征的访问回调函数里,我们可以开发一些功能,比如说当接收到来着app发送的数据,就能对其做相应的处理
可以看到代码中一开始有两个判断,分别对应两个特征。例如,当检测到可读写特征传来的数据时,会进入第二个判断,并检测到
BLE_GATT_ACCESS_OP_WRITE_CHR
写入事件。此时,程序会将传入的数据写入 gatt_svr_sec_test_static_val
,从而更新该特征的值。
继续往下看,在启动函数里发现多了一个gatts_register_cb回调函数这个回调函数的作用是在服务、特征、描述符被注册时,自动触发打印调试信息。
这里是将服务和特征的UUID打印出来
有关题目或文章的问题,欢迎您在底部评论区留言,一起交流~
- Author:小彦同学
- URL:https://alicization.site/article/2024/11/30/163aaa90-4859-8054-955d-d27c48d686e9
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!