你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-WBA65RI评测】围绕BleApplicationContext_t的端侧蓝牙开发逻辑

[复制链接]
北方 发布时间:2025-9-28 15:39

1 围绕BleApplicationContext_t的端侧蓝牙开发逻辑

在蓝牙NUCLEO-WBA65RI开发中,st提供了完整的开发框架和逻辑,而对于开发的过程,需要围绕BleApplicationContext_t这个结构体的访问控制来实现的。

1.JPG

这里定义的结构体

typedef struct
{
  /* GAP service handle */
  uint16_t gapServiceHandle;

  /* GAP device name characteristic handle */
  uint16_t gapDevNameCharHandle;

  /* GAP appearance characteristic handle */
  uint16_t gapAppearanceCharHandle;

  /**
   * connection handle of the current active connection
   * When not in connection, the handle is set to 0xFFFF
   */
  uint16_t connectionHandle;

  /* Security requirements of the host */
  SecurityParams_t bleSecurityParam;

  APP_BLE_ConnStatus_t Device_Connection_Status;
  /* USER CODE BEGIN PTD_1 */
  UTIL_TIMER_Object_t           TimerAdvLowPower_Id;
  uint8_t connIntervalFlag;
  /* USER CODE END PTD_1 */
}BleApplicationContext_t;

2 基于心率计的蓝牙开发逻辑

围绕上述结构体,在app_ble.c中详细构建了整个实现的过程。

基于 STMicroelectronics 蓝牙协议栈的 BLE 心率传感器应用程序核心实现 ,主要完成 BLE 协议栈初始化、服务管理、连接处理、低功耗控制及安全配置等功能,最终实现一个可广播、可连接、能上报设备信息与心率数据的 BLE 从机(Peripheral)设备。

2.1 核心功能概览

代码围绕 BLE 从机设备的完整生命周期展开,核心功能可归纳为以下 6 类:

  1. BLE 协议栈底层初始化(主机栈、HCI、GAP、GATT 层)
  2. 核心服务与特征管理(心率服务 HRS、设备信息服务 DIS、自定义设备信息特征)
  3. 广播与连接生命周期控制(快速广播、低功耗广播切换,连接建立 / 断开处理)
  4. BLE 安全配置(配对、绑定、加密密钥管理)
  5. 低功耗优化(广播超时切换低功耗模式)
  6. 事件响应与任务调度(HCI 事件处理、定时器任务、按键交互)

2.2 关键数据结构

安全参数结构(SecurityParams_t)

存储 BLE 配对与加密相关配置,决定设备的安全策略:

字段 作用
ioCapability 设备 IO 能力(如无输入输出、仅显示等)
mitm_mode 是否需要中间人(MITM)保护
bonding_mode 绑定模式(是否保存配对信息)
Use_Fixed_Pin 是否使用固定配对码
Fixed_Pin 固定配对码值
encryptionKeySizeMin/Max 加密密钥长度范围
initiateSecurity 安全启动策略(主动发起 / 等待 / 无需安全)

BLE 应用上下文(BleApplicationContext_t)

维护 BLE 应用的全局状态,是核心数据载体:

  • 服务与特征句柄:GAP 服务、设备名称、外观特征的句柄
  • 连接状态:连接句柄(0xFFFF 表示未连接)、连接状态枚举(空闲 / 连接中 / 已连接)
  • 安全参数:关联 SecurityParams_t 实例
  • 低功耗控制:广播超时定时器、连接间隔标志

全局关键变量

  • 广播数据(a_AdvData):包含设备简称(HR_XX)、16 位服务 UUID(心率服务 0x180D)、厂商自定义数据
  • 设备名称(a_GapDeviceName):"Heart Rate Sensor"
  • 协议栈缓冲区:主机栈动态缓冲区(host_buffer)、GATT 缓冲区(gatt_buffer)、NVM 缓存(host_nvm_buffer)

2.3 代码逻辑拆解

初始化流程(核心入口:APP_BLE_Init ())

初始化是整个应用的启动基础,按「底层栈→服务→应用状态」的顺序执行:

  1. 事件队列与任务注册 :初始化异步事件队列,注册 BLE 主机栈任务(CFG_TASK_BLE_HOST)和 HCI 事件处理任务(CFG_TASK_HCI_ASYNCH_EVT_ID)。
  2. NVM 初始化 :注册 BLE 协议栈 NVM 缓冲区,恢复历史配对 / 配置数据。
  3. 主机栈初始化 :通过 HOST_BLE_Init() 配置协议栈参数(GATT 属性数量、MTU 大小、链接数等),初始化蓝牙堆内存。
  4. HCI/GAP/GATT 初始化 :调用 Ble_Hci_Gap_Gatt_Init() 完成底层协议配置:
    • 写入设备 BD 地址(优先从 OTP / 芯片 UID 生成,默认使用 ST 厂商 ID)
    • 配置射频功率、默认 PHY(1M/2M)
    • 初始化 GAP 从机角色,设置设备名称与外观(心率传感器外观)
    • 配置安全参数(IO 能力、配对码、加密密钥长度)
  5. 服务初始化 :启动 HRS(心率服务)和 DIS(设备信息服务)的应用层初始化。
  6. 广播启动与低功耗配置 :启动快速广播,创建广播超时定时器(60 秒后切换低功耗广播)。

广播与连接管理

(1)广播控制

  • 广播类型 :支持两种模式切换,通过 APP_BLE_Procedure_Gap_Peripheral() 触发:
    • 快速广播(PROC_GAP_PERIPH_ADVERTISE_START_FAST):短间隔(ADV_INTERVAL_MIN/MAX),适合快速被发现
    • 低功耗广播(PROC_GAP_PERIPH_ADVERTISE_START_LP):长间隔(ADV_LP_INTERVAL_MIN/MAX),降低功耗
  • 广播数据动态填充fill_advData() 函数将 BD 地址、设备类型、固件版本等信息写入厂商自定义数据段,便于主设备识别。
  • 超时切换 :60 秒未连接时,定时器触发 APP_BLE_AdvLowPower() 停止快速广播,启动低功耗广播。

(2)连接生命周期处理

  • 连接建立 :通过 HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE 事件捕获连接完成,更新连接句柄与状态(APP_BLE_CONNECTED_SERVER),通知 HRS/DIS 服务连接建立。
  • 连接参数更新 :支持通过按键触发 PROC_GAP_PERIPH_CONN_PARAM_UPDATE,动态切换连接间隔(50ms/1000ms)。
  • 连接断开 :通过 HCI_DISCONNECTION_COMPLETE_EVT_CODE 事件捕获断开,重置连接状态,自动重启快速广播。

服务与特征管理

代码基于 GATT 协议框架实现服务与特征的创建、更新与维护:

(1)标准服务

  • 心率服务(HRS) :通过 HRS_APP_Init() 初始化,维护心率数据传输,连接状态变化时通知服务更新连接句柄。
  • 设备信息服务(DIS) :通过 DIS_APP_Init() 初始化,提供设备制造商、型号等标准信息。

(2)自定义特征

  • 设备信息特征 :在 GAP 服务下添加 128 位 UUID 自定义特征,存储以下设备信息(共 22 字节):
    • 芯片 ID 与修订版、板卡 ID、硬件封装类型
    • 固件版本、应用 ID(心率传感器)
    • 主机栈版本与类型

安全机制实现

基于 BLE 标准安全框架,支持配对、绑定与加密:

  1. 安全参数配置 :在 Ble_Hci_Gap_Gatt_Init() 中设置 IO 能力、MITM 保护、绑定模式等参数。
  2. 配对流程处理
    • 收到 ACI_GAP_PASS_KEY_REQ_VSEVT_CODE 事件时,返回固定配对码(CFG_FIXED_PIN)。
    • 收到 ACI_GAP_NUMERIC_COMPARISON_VALUE_VSEVT_CODE 事件时,自动确认数值匹配。
  3. 绑定与密钥管理 :通过 NVM 存储配对密钥,断开后可恢复绑定;支持通过按键清除安全数据库(aci_gap_clear_security_db())。
  4. 安全请求触发 :已连接时,可通过按键触发从机安全请求(aci_gap_slave_security_req())。

事件处理机制

采用「事件队列 + 任务调度」的异步处理模式,核心流程如下:

  1. HCI 事件接收 :蓝牙控制器产生的事件(如连接、断开、配对)通过 BLECB_Indication() 封装为事件包,插入 BleAsynchEventQueue 队列。
  2. 事件任务触发 :队列非空时,设置 CFG_TASK_HCI_ASYNCH_EVT_ID 任务,由 Ble_UserEvtRx() 处理事件。
  3. 事件分发与响应SVCCTL_App_Notification() 是事件处理核心,按事件类型分发:
    • HCI 标准事件:连接完成、断开完成、PHY 更新等。
    • 厂商自定义事件:配对完成、密钥请求、广播流程完成等。
  4. 服务通知 :连接 / 断开事件触发后,通知 HRS/DIS 服务更新状态。

低功耗与交互优化

(1)低功耗设计

  • 广播超时切换:60 秒无连接时自动从快速广播切换到低功耗广播。
  • 连接状态优化:连接时停止广播定时器,断开后重启。

(2)用户交互(按键支持)

若启用按键(CFG_BUTTON_SUPPORTED == 1),支持 3 个按键功能:

  • 按键 1:未连接时重启快速广播;已连接时切换 PHY(1M/2M)。
  • 按键 2:未连接时清除安全数据库;已连接时发起安全请求。
  • 按键 3:已连接时更新连接参数(切换连接间隔)。

NVM 管理

通过 simple_nvm_arbiter 组件管理 BLE 协议栈的非易失性存储:

  • 注册 NVM 缓冲区:存储配对密钥、连接参数等需要持久化的数据。
  • 写入回调:BLE_NvmCallback() 处理 NVM 写入结果,失败时重试。
  • 主动存储:通过 APP_BLE_HostNvmStore() 触发协议栈数据写入 NVM。

3 移植方法

在上述的蓝牙实现中,根据不同设计功能,单独开发蓝牙应用服务的子插件,嵌入到这个蓝牙设计的过程,就能够实现自定义的功能开发。

收藏 评论0 发布时间:2025-9-28 15:39

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版