784 lines
29 KiB
Markdown
784 lines
29 KiB
Markdown
|
||
登录/注册 关于ShowDoc
|
||
蓝牙协议
|
||
运动手环蓝牙通信协议设计文档
|
||
一、协议概述
|
||
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 (可写,需响应)
|
||
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: 序列号1
|
||
66 B2 F4 A0: 时间戳(1723456672, 2025-07-21 12:00:00)
|
||
4B: 心率75 bpm
|
||
55: 信号质量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: 序列号2
|
||
66 B2 F4 A0: 时间戳(1723456672)
|
||
62: 血氧98%
|
||
5A: 信号质量90%
|
||
4F: 脉率79 bpm
|
||
0C: 灌注指数12
|
||
00: 测量状态正常
|
||
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: 序列号3
|
||
66 B2 F4 A0: 时间戳(1723456672)
|
||
4B: 心率75 bpm
|
||
55: 心率信号质量85%
|
||
62: 血氧98%
|
||
5A: 血氧信号质量90%
|
||
50: RR间期80(800ms)
|
||
0C: 灌注指数12
|
||
02: 活动水平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: 序列号5
|
||
66 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: 序列号1
|
||
00: 动作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: 序列号2
|
||
01: 动作1(数据传输)
|
||
00 01: 包序号1
|
||
F1 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 消息通知
|
||
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
|
||
作者: 系统设计团队
|
||
审核: 技术负责人
|
||
|