用NRF52840芯片写一个服务service的基本框架

芯片:NRF52840,sdk版本:nRF5_SDK_17.0.2_ddde560

在写服务的时候,我们至少会注册三个回调函数,以串口透传服务为例

  1. 在初始化BLE协议栈里,我们会注册BLE事件回调函数


    这里是协议栈的事件监测回调函数,协议栈发出的事件都会被捕获到,一般处理BLE主从设备之间的连接状态的情况,
    比如 GAP层的 是否已连接,断连,
    PHY层的 PHY参数更新
    GATT层的 连接响应超时等等

  2. 注册串口服务service实例时的service事件回调函数


    这里处理服务service里对特征的操作事件,包括对特征characteristic的读/写,通知与指示事件
    注意:它和上面的监测函数可以同时捕获同一个事件,但是经笔者测试总是service事件回调函数会优先捕获到
    SD协议栈发出的event,所有event监测函数都可以监测到

  3. APP层初始化服务service结构体时注册的回调函数


    这里属于APP层,用来处理对特征characteristic数据具体的操作,用到芯片的外设模块处理


  • 理清了这三个回调函数的之间的关系和作用,对写一个服务就有了一个大致的框架,
    对服务的内容就只剩下要声明哪些数据变量

xxx服务ble_xxx.h 头文件

1、定义 xxx服务 实例

2、定义 xxx服务 对应结构体,包含该服务所需的全部数据

3、定义服务app层 特征值数据处理 结构体

app层的回调函数第二个参数,该结构体主要填入回调函数需要使用的数据

4、定义 APP层xxx服务 初始化结构体,即暴露部分init数据


xxx服务ble_xxx.c 文件

1、xxx服务实例 回调监测函数void ble_xxx_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)

2、on_connect() 和 on_disconnect

3、写操作 或者 cccd使能,都是BLE_GATTS_EVT_WRITE事件,本质上cccd使能也是写入数值0,1,2


4、读操作sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t* p_hvx_params)
该 API 函数会检查特征的 CCCD,以验证 通知或指示 已被客户端使能。
它还能够在发出PDU 之前更新属性值,以便应用程序可以通过调用单个API原子性地执行数据更新和服务器启动的事务。
产生的事件:
BLE_GATTS_EVT_HVN_TX_COMPLETE:通知发送完成。
BLE_GATTS_EVT_HVC:接收到对端设备返回的确认信息,这个事件是针对 指示的。

5、服务初始化

sd_ble_gatts_service_add 和 characteristic_add 一次只能添加一个
多个就多次使用

posted @ 2025-06-16 14:32  感兴趣就学  阅读(163)  评论(0)    收藏  举报