31 KiB
31 KiB
运动手环蓝牙通信协议设计文档
一、协议概述
1.1 协议简介
- 协议名称:Wearable Band Bluetooth Protocol (WBBP)
- 协议版本:v1.0
- 通信方式:蓝牙低功耗 (BLE 4.0+)
- 传输层:GATT (Generic Attribute Profile)
- 应用场景:手环与智能手机之间的数据交换
1.2 设计原则
- 低功耗:优化数据包大小,减少传输频率
- 可靠性:包含确认机制和重传机制
- 扩展性:支持功能模块化扩展
- 安全性:数据加密和身份验证
二、BLE服务架构
2.1 主要服务定义
2.1.1 设备信息服务 (Device Information Service)
- UUID:
180A - 特征值:
- 制造商名称:
2A29 - 型号:
2A24 - 序列号:
2A25 - 固件版本:
2A26 - 硬件版本:
2A27
- 制造商名称:
2.1.2 电池服务 (Battery Service)
- UUID:
180F - 特征值:
- 电池电量:
2A19(可读,可通知)
- 电池电量:
2.1.3 自定义主服务 (Primary Custom Service)
- UUID:
6E400001-B5A3-F393-E0A9-E50E24DCCA9E - 特征值:
- 数据传输 (TX):
6E400002-B5A3-F393-E0A9-E50E24DCCA9E(可写,无响应) - 数据接收 (RX):
6E400003-B5A3-F393-E0A9-E50E24DCCA9E(可读,可通知) - 控制命令:
6E400004-B5A3-F393-E0A9-E50E24DCCA9E(可写,需响应)
- 数据传输 (TX):
2.1.4 健康数据服务 (Health Data Service)
- UUID:
6E400010-B5A3-F393-E0A9-E50E24DCCA9E - 特征值:
- 心率数据:
6E400011-B5A3-F393-E0A9-E50E24DCCA9E(可读,可通知) - 运动数据:
6E400012-B5A3-F393-E0A9-E50E24DCCA9E(可读,可通知) - 睡眠数据:
6E400013-B5A3-F393-E0A9-E50E24DCCA9E(可读,可通知)
- 心率数据:
2.1.5 紧急服务 (Emergency Service)
- UUID:
6E400020-B5A3-F393-E0A9-E50E24DCCA9E - 特征值:
- 紧急报警:
6E400021-B5A3-F393-E0A9-E50E24DCCA9E(可写,可通知) - 录音数据:
6E400022-B5A3-F393-E0A9-E50E24DCCA9E(可写,可通知)
- 紧急报警:
三、数据包格式
3.1 基础数据包结构
+--------+--------+--------+--------+--------+--------+--------+--------+
| STX | LEN | CMD | SEQ | DATA (0-16 bytes) | CRC |
+--------+--------+--------+--------+--------+--------+--------+--------+
| 1B | 1B | 1B | 1B | Variable | 1B |
+--------+--------+--------+--------+--------+--------+--------+--------+
字段说明:
- STX (Start of Text): 起始标志
0xAA - LEN: 数据包长度 (不含STX和CRC)
- CMD: 命令类型
- SEQ: 序列号 (0-255,用于确认和重传)
- DATA: 数据负载 (最大16字节,适配BLE MTU)
- CRC: 校验和 (XOR校验)
3.2 命令类型定义
// 基础控制命令 (0x00-0x0F)
#define CMD_PING 0x00 // 心跳/连接测试
#define CMD_DEVICE_INFO 0x01 // 设备信息查询
#define CMD_TIME_SYNC 0x02 // 时间同步
#define CMD_CONFIG_SET 0x03 // 配置设置
#define CMD_CONFIG_GET 0x04 // 配置查询
#define CMD_FIRMWARE_UPDATE 0x05 // 固件更新
#define CMD_RESET 0x06 // 设备重置
#define CMD_ACK 0x0F // 确认应答
// 健康数据命令 (0x10-0x2F)
#define CMD_HEART_RATE 0x10 // 心率数据
#define CMD_STEP_COUNT 0x11 // 步数数据
#define CMD_SLEEP_DATA 0x12 // 睡眠数据
#define CMD_SPORT_MODE 0x13 // 运动模式
#define CMD_BLOOD_OXYGEN 0x14 // 血氧数据
#define CMD_BODY_TEMP 0x15 // 体温数据
#define CMD_STRESS_LEVEL 0x16 // 压力水平
#define CMD_CALORIES 0x17 // 卡路里消耗
#define CMD_VITAL_SIGNS 0x18 // 生命体征组合数据
#define CMD_REAL_TIME_START 0x19 // 开始实时监测
#define CMD_REAL_TIME_STOP 0x1A // 停止实时监测
#define CMD_MEASUREMENT_CONFIG 0x1B // 测量配置
// 交互功能命令 (0x30-0x4F)
#define CMD_NOTIFICATION 0x30 // 通知推送
#define CMD_CALL_INCOMING 0x31 // 来电通知
#define CMD_MESSAGE 0x32 // 消息通知
#define CMD_ALARM 0x33 // 闹钟设置
#define CMD_FIND_DEVICE 0x34 // 查找设备
#define CMD_CAMERA_CONTROL 0x35 // 相机控制
#define CMD_MUSIC_CONTROL 0x36 // 音乐控制
// 紧急功能命令 (0x50-0x6F)
#define CMD_EMERGENCY_ALERT 0x50 // 紧急报警
#define CMD_VOICE_RECORD 0x51 // 录音数据
#define CMD_LOCATION_REQUEST 0x52 // 位置请求
#define CMD_SOS_STATUS 0x53 // SOS状态
// 系统配置命令 (0x70-0x8F)
#define CMD_DISPLAY_CONFIG 0x70 // 显示配置
#define CMD_VIBRATION_CONFIG 0x71 // 震动配置
#define CMD_LANGUAGE_SET 0x72 // 语言设置
#define CMD_WATCHFACE_SET 0x73 // 表盘设置
#define CMD_USER_PROFILE 0x74 // 用户资料
// 错误码 (0xF0-0xFF)
#define CMD_ERROR 0xF0 // 错误响应
#define CMD_UNSUPPORTED 0xF1 // 不支持的命令
#define CMD_INVALID_PARAM 0xF2 // 无效参数
#define CMD_TIMEOUT 0xF3 // 超时
四、具体协议实现
4.1 连接建立流程
手机端 手环端
| |
|------- 扫描设备 -------> |
| |
|<------ 广播响应 -------- |
| |
|------- 连接请求 -------> |
| |
|<------ 连接确认 -------- |
| |
|------- PING (CMD_PING) ---> |
| |
|<------ ACK (CMD_ACK) --- |
| |
|------- 时间同步 -------> |
| |
|<------ 同步确认 -------- |
4.2 心跳保活机制
// 心跳数据包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x04
uint8_t cmd; // CMD_PING (0x00)
uint8_t seq; // 序列号
uint8_t reserved; // 保留字节
uint8_t crc; // 校验和
} ping_packet_t;
// 心跳响应包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x05
uint8_t cmd; // CMD_ACK (0x0F)
uint8_t seq; // 序列号
uint8_t status; // 设备状态
uint8_t battery; // 电池电量 (0-100)
uint8_t crc; // 校验和
} ping_ack_packet_t;
4.3 健康数据传输
4.3.1 心率数据
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x08
uint8_t cmd; // CMD_HEART_RATE (0x10)
uint8_t seq; // 序列号
uint32_t timestamp; // 时间戳 (Unix时间)
uint8_t heart_rate; // 心率值 (bpm)
uint8_t quality; // 信号质量 (0-100)
uint8_t crc; // 校验和
} heart_rate_packet_t;
Hex样例:
AA 08 10 01 66 B2 F4 A0 4B 55 E2
解析:
AA: STX起始标志08: 包长度(8字节)10: 心率命令01: 序列号166 B2 F4 A0: 时间戳(1723456672, 2025-07-21 12:00:00)4B: 心率75 bpm55: 信号质量85%E2: CRC校验和
4.3.2 血氧数据
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0B
uint8_t cmd; // CMD_BLOOD_OXYGEN (0x14)
uint8_t seq; // 序列号
uint32_t timestamp; // 时间戳 (Unix时间)
uint8_t spo2_value; // 血氧饱和度 (%) 范围:85-100
uint8_t quality; // 信号质量 (0-100)
uint8_t pulse_rate; // 脉率 (bpm) 基于血氧测量
uint8_t perfusion_index; // 灌注指数 (0-20) PI值
uint8_t measurement_status; // 测量状态 (0:正常 1:低质量 2:无信号 3:运动干扰)
uint8_t crc; // 校验和
} blood_oxygen_packet_t;
Hex样例:
AA 0B 14 02 66 B2 F4 A0 62 5A 4F 0C 00 1D
解析:
AA: STX起始标志0B: 包长度(11字节)14: 血氧命令02: 序列号266 B2 F4 A0: 时间戳(1723456672)62: 血氧98%5A: 信号质量90%4F: 脉率79 bpm0C: 灌注指数1200: 测量状态正常1D: CRC校验和
4.3.3 实时生命体征组合数据
// 心率+血氧组合实时数据 (节省传输带宽)
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0E
uint8_t cmd; // CMD_VITAL_SIGNS (0x18) - 新增命令
uint8_t seq; // 序列号
uint32_t timestamp; // 时间戳
uint8_t heart_rate; // 心率值 (bpm)
uint8_t hr_quality; // 心率信号质量 (0-100)
uint8_t spo2_value; // 血氧饱和度 (%)
uint8_t spo2_quality; // 血氧信号质量 (0-100)
uint8_t rr_interval; // RR间期 (ms/10)
uint8_t perfusion_index; // 灌注指数
uint8_t activity_level; // 活动水平 (0-4)
uint8_t measurement_mode; // 测量模式 (0:自动 1:手动 2:连续 3:运动模式)
uint8_t crc; // 校验和
} vital_signs_packet_t;
Hex样例:
AA 0E 18 03 66 B2 F4 A0 4B 55 62 5A 50 0C 02 01 73
解析:
AA: STX起始标志0E: 包长度(14字节)18: 生命体征组合命令03: 序列号366 B2 F4 A0: 时间戳(1723456672)4B: 心率75 bpm55: 心率信号质量85%62: 血氧98%5A: 血氧信号质量90%50: RR间期80(800ms)0C: 灌注指数1202: 活动水平2(中等活动)01: 测量模式1(手动)73: CRC校验和
4.3.4 运动数据
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x10
uint8_t cmd; // CMD_STEP_COUNT (0x11)
uint8_t seq; // 序列号
uint32_t timestamp; // 时间戳
uint32_t steps; // 步数
uint16_t distance; // 距离 (米)
uint16_t calories; // 卡路里
uint8_t activity_type; // 活动类型 (0:静坐 1:走路 2:跑步 3:骑行)
uint8_t crc; // 校验和
} sport_data_packet_t;
运动步数Hex样例:
AA 10 11 05 66 B2 F4 A0 00 00 27 10 0C E4 01 C2 02 8F
解析:
AA: STX起始标志10: 包长度(16字节)11: 步数命令(CMD_STEP_COUNT)05: 序列号566 B2 F4 A0: 时间戳(1723456672, 2025-07-21 12:00:00)00 00 27 10: 步数10000步0C E4: 距离3300米(3.3公里)01 C2: 卡路里450卡02: 活动类型2(跑步)8F: CRC校验和
4.4 实时测试协议详解
4.4.1 实时监测启动协议
// 实时监测配置包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0A
uint8_t cmd; // CMD_REAL_TIME_START (0x19)
uint8_t seq; // 序列号
uint8_t monitor_type; // 监测类型位掩码 (bit0:心率 bit1:血氧 bit2:体温 bit3:运动)
uint16_t interval_ms; // 数据上报间隔 (毫秒) 建议:1000-5000ms
uint8_t duration_min; // 监测持续时间 (分钟) 0=无限制
uint8_t quality_threshold; // 信号质量阈值 (0-100) 低于此值不上报
uint8_t auto_stop_condition; // 自动停止条件 (0:手动停止 1:低电量 2:信号差 3:超时)
uint8_t notification_level; // 通知级别 (0:静默 1:普通 2:重要)
uint8_t reserved; // 保留字节
uint8_t crc; // 校验和
} realtime_config_packet_t;
// 实时监测响应包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x06
uint8_t cmd; // CMD_ACK (0x0F)
uint8_t seq; // 序列号
uint8_t result; // 结果 (0:成功 1:失败 2:不支持 3:电量不足)
uint16_t session_id; // 会话ID (用于标识本次监测)
uint8_t estimated_battery_min; // 预估电池可用时间 (分钟)
uint8_t crc; // 校验和
} realtime_start_ack_t;
4.4.2 心率实时监测流程
// 心率实时数据增强版
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0F
uint8_t cmd; // CMD_HEART_RATE (0x10)
uint8_t seq; // 序列号
uint16_t session_id; // 会话ID
uint32_t timestamp; // 时间戳
uint8_t heart_rate; // 心率值 (bpm)
uint8_t quality; // 信号质量 (0-100)
uint8_t rr_interval; // RR间期 (ms/10)
uint8_t hrv_score; // 心率变异性评分 (0-100)
uint8_t stress_level; // 压力等级 (0-4: 放松到高压力)
uint8_t confidence; // 测量置信度 (0-100)
uint8_t sensor_contact; // 传感器接触状态 (0:未接触 1:接触良好 2:接触不良)
uint8_t crc; // 校验和
} realtime_heart_rate_t;
// 心率测试状态枚举
typedef enum {
HR_STATUS_IDLE = 0, // 空闲
HR_STATUS_DETECTING = 1, // 检测中
HR_STATUS_STABLE = 2, // 稳定测量
HR_STATUS_UNSTABLE = 3, // 信号不稳定
HR_STATUS_ERROR = 4, // 测量错误
HR_STATUS_TIMEOUT = 5, // 测量超时
} heart_rate_status_t;
4.4.3 血氧实时监测流程
// 血氧实时数据增强版
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x12
uint8_t cmd; // CMD_BLOOD_OXYGEN (0x14)
uint8_t seq; // 序列号
uint16_t session_id; // 会话ID
uint32_t timestamp; // 时间戳
uint8_t spo2_value; // 血氧饱和度 (%) 范围:85-100
uint8_t quality; // 信号质量 (0-100)
uint8_t pulse_rate; // 脉率 (bpm)
uint8_t perfusion_index; // 灌注指数 (0-20)
uint8_t red_signal_strength; // 红光信号强度 (0-100)
uint8_t ir_signal_strength; // 红外光信号强度 (0-100)
uint8_t motion_artifact; // 运动伪影指数 (0-100)
uint8_t ambient_light; // 环境光干扰 (0-100)
uint8_t skin_tone_factor; // 肤色补偿因子 (0-100)
uint8_t measurement_progress; // 测量进度 (0-100)
uint8_t reliability_score; // 可靠性评分 (0-100)
uint8_t crc; // 校验和
} realtime_spo2_t;
// 血氧测试状态枚举
typedef enum {
SPO2_STATUS_IDLE = 0, // 空闲
SPO2_STATUS_INIT = 1, // 初始化
SPO2_STATUS_STABILIZING = 2, // 稳定中
SPO2_STATUS_MEASURING = 3, // 测量中
SPO2_STATUS_COMPLETED = 4, // 测量完成
SPO2_STATUS_LOW_SIGNAL = 5, // 信号太弱
SPO2_STATUS_MOTION_DETECT = 6, // 检测到运动
SPO2_STATUS_AMBIENT_HIGH = 7, // 环境光过强
SPO2_STATUS_ERROR = 8, // 测量错误
} spo2_status_t;
4.4.4 测量控制命令
// 测量配置命令
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0C
uint8_t cmd; // CMD_MEASUREMENT_CONFIG (0x1B)
uint8_t seq; // 序列号
uint8_t sensor_type; // 传感器类型 (1:心率 2:血氧 3:组合)
uint8_t sampling_rate; // 采样率 (0:25Hz 1:50Hz 2:100Hz 3:200Hz)
uint8_t led_intensity; // LED强度 (0-100)
uint8_t filter_mode; // 滤波模式 (0:关闭 1:低通 2:带通 3:自适应)
uint8_t calibration_mode; // 校准模式 (0:出厂 1:用户 2:实时)
uint8_t power_mode; // 功耗模式 (0:高性能 1:平衡 2:省电)
uint8_t ambient_rejection; // 环境光抑制 (0:关闭 1:开启)
uint8_t motion_tolerance; // 运动容忍度 (0-4)
uint8_t auto_gain_control; // 自动增益控制 (0:关闭 1:开启)
uint8_t crc; // 校验和
} measurement_config_t;
// 实时监测停止命令
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x06
uint8_t cmd; // CMD_REAL_TIME_STOP (0x1A)
uint8_t seq; // 序列号
uint16_t session_id; // 会话ID
uint8_t stop_reason; // 停止原因 (0:用户 1:超时 2:电量 3:错误)
uint8_t save_data; // 是否保存数据 (0:不保存 1:保存)
uint8_t crc; // 校验和
} realtime_stop_t;
4.4.5 质量评估算法
// 信号质量评估结构
typedef struct {
uint8_t signal_strength; // 信号强度 (0-100)
uint8_t noise_level; // 噪声水平 (0-100)
uint8_t motion_artifact; // 运动伪影 (0-100)
uint8_t contact_quality; // 接触质量 (0-100)
uint8_t baseline_stability; // 基线稳定性 (0-100)
uint8_t overall_quality; // 综合质量 (0-100)
} signal_quality_t;
// 质量评估函数示例
uint8_t calculate_signal_quality(const sensor_data_t *data) {
uint8_t quality = 0;
// 信号强度权重 30%
quality += (data->signal_strength * 30) / 100;
// 噪声水平权重 25% (取反)
quality += ((100 - data->noise_level) * 25) / 100;
// 接触质量权重 25%
quality += (data->contact_quality * 25) / 100;
// 基线稳定性权重 20%
quality += (data->baseline_stability * 20) / 100;
return quality;
}
4.5 紧急报警协议
4.5.1 紧急报警
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0C
uint8_t cmd; // CMD_EMERGENCY_ALERT (0x50)
uint8_t seq; // 序列号
uint32_t timestamp; // 报警时间戳
uint8_t alert_type; // 报警类型 (1:SOS 2:跌倒 3:心率异常)
uint8_t severity; // 严重程度 (1-5)
uint16_t location_x; // GPS坐标X (可选)
uint16_t location_y; // GPS坐标Y (可选)
uint8_t user_id; // 用户ID
uint8_t crc; // 校验和
} emergency_alert_packet_t;
Hex样例:
AA 0C 50 FF 66 B2 F4 A0 01 05 0A 28 0B 58 7C F2
解析:
AA: STX起始标志0C: 包长度(12字节)50: 紧急报警命令FF: 序列号255(紧急包)66 B2 F4 A0: 报警时间戳(1723456672)01: 报警类型1(SOS)05: 严重程度5(最高)0A 28: GPS坐标X(2600)0B 58: GPS坐标Y(2904)7C: 用户ID(124)F2: CRC校验和
4.5.2 录音数据传输
// 录音开始包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x08
uint8_t cmd; // CMD_VOICE_RECORD (0x51)
uint8_t seq; // 序列号
uint8_t action; // 动作 (0:开始 1:数据 2:结束)
uint16_t total_length; // 总长度
uint8_t sample_rate; // 采样率 (0:8K 1:16K)
uint8_t format; // 格式 (0:PCM 1:ADPCM)
uint8_t crc; // 校验和
} voice_header_packet_t;
录音开始包Hex样例:
AA 08 51 01 00 0C 80 01 00 D4
解析:
AA: STX起始标志08: 包长度(8字节)51: 录音命令01: 序列号100: 动作0(开始录音)0C 80: 总长度3200字节01: 采样率1(16K)00: 格式0(PCM)D4: CRC校验和
// 录音数据包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x14
uint8_t cmd; // CMD_VOICE_RECORD (0x51)
uint8_t seq; // 序列号
uint8_t action; // 动作 (1:数据)
uint16_t packet_index; // 包序号
uint8_t data[16]; // 音频数据
uint8_t crc; // 校验和
} voice_data_packet_t;
录音数据包Hex样例:
AA 14 51 02 01 00 01 F1 E2 D3 C4 B5 A6 97 88 79 6A 5B 4C 3D 2E 1F 08
解析:
AA: STX起始标志14: 包长度(20字节)51: 录音命令02: 序列号201: 动作1(数据传输)00 01: 包序号1F1 E2 D3...2E 1F: 16字节音频数据08: CRC校验和 uint8_t seq; // 序列号 uint8_t action; // 动作 (1:数据) uint16_t packet_index; // 包序号 uint8_t data[16]; // 音频数据 uint8_t crc; // 校验和 } voice_data_packet_t;
### 4.6 通知推送协议
#### 4.6.1 消息通知
```c
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 可变长度
uint8_t cmd; // CMD_NOTIFICATION (0x30)
uint8_t seq; // 序列号
uint8_t msg_type; // 消息类型 (1:短信 2:微信 3:QQ 4:邮件 5:其他)
uint8_t msg_id; // 消息ID
uint8_t title_len; // 标题长度
uint8_t content_len; // 内容长度
uint8_t data[]; // 标题+内容 (UTF-8编码)
// uint8_t crc; // 校验和 (在data末尾)
} notification_packet_t;
4.6.2 来电通知
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 可变长度
uint8_t cmd; // CMD_CALL_INCOMING (0x31)
uint8_t seq; // 序列号
uint8_t call_action; // 动作 (0:来电 1:接听 2:挂断 3:拒接)
uint8_t name_len; // 姓名长度
uint8_t number_len; // 号码长度
uint8_t data[]; // 姓名+号码 (UTF-8编码)
// uint8_t crc; // 校验和
} call_packet_t;
五、错误处理机制
5.1 错误码定义
#define ERR_SUCCESS 0x00 // 成功
#define ERR_INVALID_CMD 0x01 // 无效命令
#define ERR_INVALID_PARAM 0x02 // 无效参数
#define ERR_CRC_ERROR 0x03 // 校验错误
#define ERR_TIMEOUT 0x04 // 超时
#define ERR_BUSY 0x05 // 设备忙
#define ERR_LOW_BATTERY 0x06 // 电量不足
#define ERR_NOT_SUPPORTED 0x07 // 不支持
#define ERR_PERMISSION_DENIED 0x08 // 权限拒绝
#define ERR_MEMORY_FULL 0x09 // 存储满
#define ERR_UNKNOWN 0xFF // 未知错误
5.2 错误响应格式
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x06
uint8_t cmd; // CMD_ERROR (0xF0)
uint8_t seq; // 原序列号
uint8_t error_cmd; // 出错的命令
uint8_t error_code; // 错误码
uint8_t reserved; // 保留
uint8_t crc; // 校验和
} error_packet_t;
六、安全机制
6.1 配对认证流程
手机端 手环端
| |
|------- 配对请求 -------> |
| |
|<------ 配对码显示 ------ |
| |
|------- 配对码确认 -----> |
| |
|<------ 密钥交换 -------- |
| |
|------- 认证完成 -------> |
6.2 数据加密
- 加密算法: AES-128
- 密钥管理: 配对时生成,定期更新
- 加密范围: 敏感数据 (健康数据、录音、位置等)
6.3 防重放攻击
- 使用递增序列号
- 时间戳验证
- 会话令牌机制
七、性能优化
7.1 数据压缩
- 健康数据采用差值压缩
- 录音数据采用ADPCM压缩
- 批量传输减少包头开销
7.2 功耗优化
- 连接间隔动态调整
- 数据缓存与批量发送
- 睡眠模式管理
7.3 MTU协商
// MTU协商包
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x05
uint8_t cmd; // CMD_CONFIG_SET (0x03)
uint8_t seq; // 序列号
uint8_t config_type; // 配置类型 (0x01: MTU)
uint16_t mtu_size; // 期望MTU大小
uint8_t crc; // 校验和
} mtu_config_packet_t;
八、测试用例
8.1 基础连接测试
-
连接建立测试
- 验证BLE广播
- 验证服务发现
- 验证特征值读写
-
心跳测试
- 定时PING包发送
- ACK响应验证
- 超时断线重连
8.2 数据传输测试
-
健康数据测试
- 心率数据实时传输
- 步数数据同步
- 大批量历史数据传输
-
紧急功能测试
- SOS报警触发
- 录音数据传输
- 网络中断处理
8.3 异常场景测试
-
网络异常
- 断线重连
- 数据重传
- 缓存溢出处理
-
电量不足
- 低电量模式
- 紧急数据保护
- 优雅关机
九、版本更新机制
9.1 固件更新协议
// 固件更新请求
typedef struct {
uint8_t stx; // 0xAA
uint8_t len; // 0x0C
uint8_t cmd; // CMD_FIRMWARE_UPDATE (0x05)
uint8_t seq; // 序列号
uint8_t update_action; // 动作 (0:查询 1:开始 2:数据 3:结束 4:验证)
uint32_t firmware_size; // 固件大小
uint16_t firmware_crc; // 固件CRC
uint8_t version_major; // 主版本号
uint8_t version_minor; // 次版本号
uint8_t reserved; // 保留
uint8_t crc; // 校验和
} firmware_update_packet_t;
9.2 OTA更新流程
- 版本检查: 手机端查询手环固件版本
- 更新准备: 手环端进入更新模式
- 数据传输: 分包传输固件数据
- 校验确认: 校验固件完整性
- 重启应用: 重启到新固件
十一、Hex样例汇总表
11.1 健康数据协议样例
| 协议类型 | 命令码 | Hex样例 | 说明 |
|---|---|---|---|
| 心跳包 | 0x00 | AA 04 00 01 00 A5 |
PING心跳,序列号1 |
| 心率数据 | 0x10 | AA 08 10 01 66 B2 F4 A0 4B 55 E2 |
心率75bpm,质量85% |
| 步数数据 | 0x11 | AA 10 11 05 66 B2 F4 A0 00 00 27 10 0C E4 01 C2 02 8F |
步数10000步,距离3.3km,跑步模式 |
| 血氧数据 | 0x14 | AA 0B 14 02 66 B2 F4 A0 62 5A 4F 0C 00 1D |
血氧98%,脉率79bpm |
| 生命体征组合 | 0x18 | AA 0E 18 03 66 B2 F4 A0 4B 55 62 5A 50 0C 02 01 73 |
心率+血氧组合数据 |
| 紧急报警 | 0x50 | AA 0C 50 FF 66 B2 F4 A0 01 05 0A 28 0B 58 7C F2 |
SOS报警,最高优先级 |
| 录音开始 | 0x51 | AA 08 51 01 00 0C 80 01 00 D4 |
开始录音,16K采样率 |
| 录音数据 | 0x51 | AA 14 51 02 01 00 01 F1 E2 D3 C4...2E 1F 08 |
录音数据包,包序号1 |
11.2 控制命令样例
| 命令类型 | 命令码 | Hex样例 | 说明 |
|---|---|---|---|
| 设备信息查询 | 0x01 | AA 04 01 01 00 A6 |
查询设备基本信息 |
| 时间同步 | 0x02 | AA 08 02 01 66 B2 F4 A0 00 15 |
同步时间戳 |
| 实时监测开始 | 0x19 | AA 0A 19 01 03 E8 03 0A 32 00 01 B2 |
开始心率+血氧监测 |
| 实时监测停止 | 0x1A | AA 06 1A 01 00 01 00 01 23 |
停止监测,保存数据 |
| ACK确认 | 0x0F | AA 05 0F 01 00 50 B5 |
确认序列号1,电量80% |
| 错误响应 | 0xF0 | AA 06 F0 01 50 06 00 4D |
SOS命令电量不足错误 |
11.4 快速参考表
BLE服务和特征UUID表
// 主要服务UUID
#define WEARABLE_SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
#define HEALTH_SERVICE_UUID "180D0000-0000-1000-8000-00805F9B34FB"
#define EMERGENCY_SERVICE_UUID "19B10000-E8F2-537E-4F6C-D104768A1214"
// 特征UUID
#define HEART_RATE_CHAR_UUID "2A37" // 心率测量
#define BLOOD_OXYGEN_CHAR_UUID "2A5F" // 血氧饱和度
#define EMERGENCY_CHAR_UUID "2A65" // 紧急通信
#define CONTROL_CHAR_UUID "2A66" // 控制命令
#define CONFIG_CHAR_UUID "2A67" // 配置参数
命令码快速查找表
基础控制: 0x00-0x0F
├── 0x00: PING心跳包
├── 0x01: 设备信息查询
├── 0x02: 时间同步
├── 0x03: 固件版本
├── 0x04: 电池状态
├── 0x05: 设备重启
└── 0x0F: ACK确认帧
健康监测: 0x10-0x2F
├── 0x10: 心率数据
├── 0x11: 心率配置
├── 0x14: 血氧数据
├── 0x15: 血氧配置
├── 0x18: 生命体征组合
├── 0x19: 实时监测开始
├── 0x1A: 实时监测停止
├── 0x1B: 校准请求
└── 0x1C: 传感器状态
紧急功能: 0x50-0x6F
├── 0x50: SOS紧急报警
├── 0x51: 紧急录音数据
├── 0x52: 紧急位置信息
├── 0x53: SOS状态查询
├── 0x54: 跌倒检测
└── 0x55: 异常心率报警
错误响应: 0xF0-0xFF
├── 0xF0: 通用错误响应
├── 0xF1: 不支持的命令
├── 0xF2: 无效参数
├── 0xF3: 连接超时
├── 0xF4: 校验错误
└── 0xF5: 硬件故障
数据包结构模板
typedef struct {
uint8_t stx; // 起始标志 0xAA
uint8_t length; // 包长度 (不含STX)
uint8_t command; // 命令码
uint8_t sequence; // 序列号
uint8_t data[]; // 数据载荷
uint8_t crc; // XOR校验和
} __attribute__((packed)) BLE_Packet_t;
错误代码定义
#define BLE_SUCCESS 0x00 // 成功
#define BLE_ERROR_INVALID_PARAM 0x01 // 参数错误
#define BLE_ERROR_CONNECTION_LOST 0x02 // 连接丢失
#define BLE_ERROR_TIMEOUT 0x03 // 操作超时
#define BLE_ERROR_CHECKSUM 0x04 // 校验错误
#define BLE_ERROR_SEQUENCE 0x05 // 序列号错误
#define BLE_ERROR_BUFFER_FULL 0x06 // 缓冲区满
#define BLE_ERROR_NOT_SUPPORTED 0x07 // 不支持操作
#define BLE_ERROR_SENSOR_FAULT 0x08 // 传感器故障
#define BLE_ERROR_LOW_BATTERY 0x09 // 电量不足
XOR校验计算算法
uint8_t calculate_crc_xor(const uint8_t *data, uint8_t len) {
uint8_t crc = 0;
for (uint8_t i = 0; i < len; i++) {
crc ^= data[i];
}
return crc;
}
// 使用示例
uint8_t packet[] = {0xAA, 0x08, 0x10, 0x01, 0x66, 0xB2, 0xF4, 0xA0, 0x4B, 0x55};
uint8_t crc = calculate_crc_xor(packet + 1, 9); // 从LEN开始计算
常用数据包长度表
| 数据包类型 | 长度(字节) | 命令码 | 说明 |
|---|---|---|---|
| PING心跳包 | 4 | 0x00 | 最小数据包 |
| 设备信息 | 15 | 0x01 | 包含版本号等 |
| 心率数据 | 8 | 0x10 | 单次心率值 |
| 步数数据 | 16 | 0x11 | 步数+距离+卡路里 |
| 血氧数据 | 11 | 0x14 | SpO2+心率组合 |
| 生命体征 | 14 | 0x18 | 完整健康数据 |
| SOS报警 | 12 | 0x50 | 紧急求助 |
| 录音数据 | 20 | 0x51 | 音频片段(受MTU限制) |
BLE连接参数推荐
// 连接间隔配置
#define MIN_CONN_INTERVAL 6 // 7.5ms
#define MAX_CONN_INTERVAL 80 // 100ms
#define SLAVE_LATENCY 0 // 无延迟
#define CONN_SUP_TIMEOUT 400 // 4秒超时
// MTU协商
#define DEFAULT_MTU 23 // 默认MTU
#define PREFERRED_MTU 185 // 推荐MTU
#define MAX_MTU 247 // 最大MTU
实时监测采样率配置
#define SAMPLE_RATE_25HZ 0 // 25Hz采样
#define SAMPLE_RATE_50HZ 1 // 50Hz采样
#define SAMPLE_RATE_100HZ 2 // 100Hz采样
#define SAMPLE_RATE_200HZ 3 // 200Hz采样(高精度)
// 功耗模式
#define POWER_MODE_HIGH_PERF 0 // 高性能模式
#define POWER_MODE_BALANCED 1 // 平衡模式
#define POWER_MODE_LOW_POWER 2 // 省电模式
十、开发调试
10.1 调试接口
- 日志输出: 通过UART或BLE输出调试信息
- 状态监控: 实时监控连接状态、电量、内存使用
- 性能分析: 传输速率、响应时间、丢包率统计
10.2 测试工具
- 模拟器: PC端手环模拟器
- 抓包工具: BLE协议分析器
- 压力测试: 并发连接、大数据量传输测试
文档版本: v1.0
最后更新: 2025-07-21
作者: 系统设计团队
审核: 技术负责人