用NRF52840芯片写一个服务service的基本框架
芯片:NRF52840,sdk版本:nRF5_SDK_17.0.2_ddde560
在写服务的时候,我们至少会注册三个回调函数,以串口透传服务为例
-
在初始化BLE协议栈里,我们会注册BLE事件回调函数
![]()
![]()
这里是协议栈的事件监测回调函数,协议栈发出的事件都会被捕获到,一般处理BLE主从设备之间的连接状态的情况,
比如 GAP层的 是否已连接,断连,
PHY层的 PHY参数更新
GATT层的 连接响应超时等等 -
注册串口服务service实例时的service事件回调函数
![]()
![]()
这里处理服务service里对特征的操作事件,包括对特征characteristic的读/写,通知与指示事件
注意:它和上面的监测函数可以同时捕获同一个事件,但是经笔者测试总是service事件回调函数会优先捕获到
SD协议栈发出的event,所有event监测函数都可以监测到
![]()
-
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 一次只能添加一个
多个就多次使用








浙公网安备 33010602011771号