当前位置: 首页 > web >正文

CH579 CH573 CH582 CH592 蓝牙主机(Central)实例应用讲解(二)——Central消息事件机制初探

首先声明一点,本文中所提到的消息事件机制都是本团队在实际工作中总结出来的,错误可能不可避免,如有不对的地方欢迎指正。不过相信对很多刚刚接触蓝牙的朋友还是能提供一些帮助的。

一、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 GAPGAP_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 ClientGATT_InitClient();// Register to receive incoming ATT Indications/NotificationsGATT_RegisterForInd(centralTaskId);// Setup a delayed profile startuptmos_set_event(centralTaskId, START_DEVICE_EVT);
}
    if(events & START_DEVICE_EVT){// Start the DeviceGAPRole_CentralStartDevice(centralTaskId, &centralBondCB, &centralRoleCB);return (events ^ START_DEVICE_EVT);}

 

在事件回调centralEventCB中,触发GAP_DEVICE_INIT_DONE_EVENT后,

http://www.xdnf.cn/news/14344.html

相关文章:

  • Ansible
  • leetcode 2566. 替换一个数字后的最大差值 简单
  • ESP32的spi通讯(Arduino)
  • Ubuntu 实现 sudo 免密码关键步骤
  • 启动springboot项目提示没有主清单属性
  • C++ 内存泄露
  • 以下是 NumPy 在统计与矩阵运算中的核心用法总结
  • linux msyql8 允许远程连接
  • java中扩展运算符
  • 《开窍》读书笔记8
  • 无线USB转换器TOS-WLink露面1个月以来总结
  • Cesium快速入门到精通系列教程九:Cesium 中高效添加和管理图标/标记的标准方式​​
  • Verilog自适应位宽与指定位宽不同导致模块无法正常执行
  • csharp设计方法
  • 带中断计数器的UART接收中断程序 (8259@400H/402H)
  • RapidNJ软件的安装
  • 【Python 爬虫 防盗链】
  • 山东大学软件学院项目实训:基于大模型的模拟面试系统项目总结(九)
  • Apifox将base64转换为图片(调试时方便查看)
  • BeckHoff <---> Keyence (LJ-X8000) 2D相机 Profinet 通讯
  • IO之详解cin(c++IO关键理解)
  • 矩阵运算基础、矩阵求导
  • 《Apollo 配置中心在动态主题系统中的设计与扩展》
  • openeuler 系统—— 集成大模型分析日志中的错误信息生成故障原因报告
  • LeetCode - 34. 在排序数组中查找元素的第一个和最后一个位置
  • GTSAM中InitializePose3::initialize()使用详解
  • 数据目录:企业数据管理的核心引擎与最佳实践
  • 各种运算符的学习心得
  • 【JavaScript-Day 41】JS 事件大全:click, keydown, submit, load 等常见事件详解与实战
  • RK全志平台WiFiBT调试思路