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

这里定义的结构体
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 类:
- BLE 协议栈底层初始化(主机栈、HCI、GAP、GATT 层)
- 核心服务与特征管理(心率服务 HRS、设备信息服务 DIS、自定义设备信息特征)
- 广播与连接生命周期控制(快速广播、低功耗广播切换,连接建立 / 断开处理)
- BLE 安全配置(配对、绑定、加密密钥管理)
- 低功耗优化(广播超时切换低功耗模式)
- 事件响应与任务调度(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 ())
初始化是整个应用的启动基础,按「底层栈→服务→应用状态」的顺序执行:
- 事件队列与任务注册 :初始化异步事件队列,注册 BLE 主机栈任务(CFG_TASK_BLE_HOST)和 HCI 事件处理任务(CFG_TASK_HCI_ASYNCH_EVT_ID)。
- NVM 初始化 :注册 BLE 协议栈 NVM 缓冲区,恢复历史配对 / 配置数据。
- 主机栈初始化 :通过
HOST_BLE_Init() 配置协议栈参数(GATT 属性数量、MTU 大小、链接数等),初始化蓝牙堆内存。
- HCI/GAP/GATT 初始化 :调用
Ble_Hci_Gap_Gatt_Init() 完成底层协议配置:
- 写入设备 BD 地址(优先从 OTP / 芯片 UID 生成,默认使用 ST 厂商 ID)
- 配置射频功率、默认 PHY(1M/2M)
- 初始化 GAP 从机角色,设置设备名称与外观(心率传感器外观)
- 配置安全参数(IO 能力、配对码、加密密钥长度)
- 服务初始化 :启动 HRS(心率服务)和 DIS(设备信息服务)的应用层初始化。
- 广播启动与低功耗配置 :启动快速广播,创建广播超时定时器(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 标准安全框架,支持配对、绑定与加密:
- 安全参数配置 :在
Ble_Hci_Gap_Gatt_Init() 中设置 IO 能力、MITM 保护、绑定模式等参数。
- 配对流程处理 :
- 收到
ACI_GAP_PASS_KEY_REQ_VSEVT_CODE 事件时,返回固定配对码(CFG_FIXED_PIN)。
- 收到
ACI_GAP_NUMERIC_COMPARISON_VALUE_VSEVT_CODE 事件时,自动确认数值匹配。
- 绑定与密钥管理 :通过 NVM 存储配对密钥,断开后可恢复绑定;支持通过按键清除安全数据库(
aci_gap_clear_security_db() )。
- 安全请求触发 :已连接时,可通过按键触发从机安全请求(
aci_gap_slave_security_req() )。
事件处理机制
采用「事件队列 + 任务调度」的异步处理模式,核心流程如下:
- HCI 事件接收 :蓝牙控制器产生的事件(如连接、断开、配对)通过
BLECB_Indication() 封装为事件包,插入 BleAsynchEventQueue 队列。
- 事件任务触发 :队列非空时,设置
CFG_TASK_HCI_ASYNCH_EVT_ID 任务,由 Ble_UserEvtRx() 处理事件。
- 事件分发与响应 :
SVCCTL_App_Notification() 是事件处理核心,按事件类型分发:
- HCI 标准事件:连接完成、断开完成、PHY 更新等。
- 厂商自定义事件:配对完成、密钥请求、广播流程完成等。
- 服务通知 :连接 / 断开事件触发后,通知 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 移植方法
在上述的蓝牙实现中,根据不同设计功能,单独开发蓝牙应用服务的子插件,嵌入到这个蓝牙设计的过程,就能够实现自定义的功能开发。 |