Lazy loaded image
🗒️2.nimble案例分析—bleprph
00 min
2024-11-30
2024-12-22
type
status
date
slug
summary
tags
category
icon
password
 

1.简介内容

这是一个基于蓝牙实现数据收发的案例。运行后,可通过APP连接蓝牙设备并进行数据收发。
这个案例做了一些修改,原本发送随机数据到手机的特征修改为发送特定变量的数据

2.软硬件平台

硬件平台是nordic的nrf5x系列开发板nrf52832。
软件平台采用的是nrf5x系列芯片的RT-Thread嵌入式系统工程,使用了nimble软件包
 

3. 试验

 

3.1. 验板

notion image

3.1.1. 程序配置设置

步骤跟第一章都是一样的,区别在于选择案例的时候要选择
notion image

3.2. 实验结果

把示例编译烧入板子后,来到串口控制台输入bleprph运行实例
notion image
当程序在开发板运行后,使用nRFconnect可以搜到对应的蓝牙
连接后即可进行数据收发测试
notion image
可以看到有2个特征
一个是只读的,另一个支持读写
点击只读的特征旁边的三角就可以读取设备上的数据
notion image
这时在支持读写的特征写入数据,然后读取第一个特征就可以把写入的数据读出来
notion image
notion image

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 结构体定义,主要字段解析如下:
  1. .uuid = &gatt_svr_chr_sec_test_rand_uuid.u
      • 特征的 UUID,标识特征的类型和功能。
  1. .access_cb = gatt_svr_chr_access_sec_test
      • 特征的访问回调函数。
      • 当客户端尝试读取、写入或订阅特征时,协议栈会调用此函数处理请求。
  1. .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打印出来
notion image
 
 
💡
有关题目或文章的问题,欢迎您在底部评论区留言,一起交流~
上一篇
3.nimble案例分析—UART串口
下一篇
1.nimble案例分析—ibeacon

Comments
Loading...