首先声明一点,本文中所提到的消息事件机制都是本团队在实际工作中总结出来的,错误可能不可避免,如有不对的地方欢迎指正。不过相信对很多刚刚接触蓝牙的朋友还是能提供一些帮助的。
一、CH582芯片架构与BLE Central特性
一)、硬件基础
基于RISC-V内核,内置BLE 5.3双模射频
独立消息队列控制器(Message RAM)实现低延迟事件分发
硬件级AES-128加密加速,保障GATT事件安全
二)、协议栈定制优化
采用沁恒自研BLE协议栈(CH58xBLE_Lib)
Central模式下支持8个并发连接(每个连接独立事件通道)
动态内存分配策略减少事件丢失率(实测<0.1%)
二、消息事件处理流程详解
一)、事件分类与优先级
| 事件类型 | 触发源 | 处理优先级 |
|----------------------|----------------------|-----------------|
| 射频中断事件 | RF硬件中断 | 最高(0) |
| HCI命令响应 | 主机协议栈 | 高(1) |
| GATT操作回调 | 从机特征值变更| 中(2) |
| 定时器事件 | 系统看门狗 | 低(3) |
二)、关键API与回调机制
事件处理:通过Central_ProcessEvent处理包括Timers,messages以及用户自定义事件。
事件回调:centralEventCB
消息分发:central_ProcessTMOSMsg
本文只对Central的相关消息事件进行分析,对定时器事件、HAL层事件不作解释。
三、初始化及扫描从设备
HAL层及系统初始化完成后,会调用Central_Init(),这段代码首先就是注册事件处理函数,以及一些必要的初始化,最后启动START_DEVICE_EVT事件,也就是启动Central。完成这些操作后,会触发事件回调函数中的GAP_DEVICE_INIT_DONE_EVENT。
void Central_Init()
{
centralTaskId = TMOS_ProcessEventRegister(Central_ProcessEvent);
// Setup GAP
GAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);
GAP_SetParamValue(TGAP_CONN_EST_INT_MIN, DEFAULT_MIN_CONNECTION_INTERVAL);
GAP_SetParamValue(TGAP_CONN_EST_INT_MAX, DEFAULT_MAX_CONNECTION_INTERVAL);
GAP_SetParamValue(TGAP_CONN_EST_SUPERV_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);
// Setup the GAP Bond Manager
{
uint32_t passkey = DEFAULT_PASSCODE;
uint8_t pairMode = DEFAULT_PAIRING_MODE;
uint8_t mitm = DEFAULT_MITM_MODE;
uint8_t ioCap = DEFAULT_IO_CAPABILITIES;
uint8_t bonding = DEFAULT_BONDING_MODE;
GAPBondMgr_SetParameter(GAPBOND_CENT_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
GAPBondMgr_SetParameter(GAPBOND_CENT_PAIRING_MODE, sizeof(uint8_t), &pairMode);
GAPBondMgr_SetParameter(GAPBOND_CENT_MITM_PROTECTION, sizeof(uint8_t), &mitm);
GAPBondMgr_SetParameter(GAPBOND_CENT_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
GAPBondMgr_SetParameter(GAPBOND_CENT_BONDING_ENABLED, sizeof(uint8_t), &bonding);
}
// Initialize GATT Client
GATT_InitClient();
// Register to receive incoming ATT Indications/Notifications
GATT_RegisterForInd(centralTaskId);
// Setup a delayed profile startup
tmos_set_event(centralTaskId, START_DEVICE_EVT);
}
if(events & START_DEVICE_EVT)
{
// Start the Device
GAPRole_CentralStartDevice(centralTaskId, ¢ralBondCB, ¢ralRoleCB);
return (events ^ START_DEVICE_EVT);
}
在事件回调centralEventCB中,触发GAP_DEVICE_INIT_DONE_EVENT后,