# 运动手环蓝牙通信协议设计文档 ## 一、协议概述 ### 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 命令类型定义 ```c // 基础控制命令 (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 心跳保活机制 ```c // 心跳数据包 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 心率数据 ```c 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 血氧数据 ```c 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 实时生命体征组合数据 ```c // 心率+血氧组合实时数据 (节省传输带宽) 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 运动数据 ```c 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 实时监测启动协议 ```c // 实时监测配置包 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 心率实时监测流程 ```c // 心率实时数据增强版 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 血氧实时监测流程 ```c // 血氧实时数据增强版 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 测量控制命令 ```c // 测量配置命令 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 质量评估算法 ```c // 信号质量评估结构 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 紧急报警 ```c 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 录音数据传输 ```c // 录音开始包 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校验和 ```c // 录音数据包 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 消息通知 ```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 来电通知 ```c 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 错误码定义 ```c #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 错误响应格式 ```c 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协商 ```c // 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 基础连接测试 1. **连接建立测试** - 验证BLE广播 - 验证服务发现 - 验证特征值读写 2. **心跳测试** - 定时PING包发送 - ACK响应验证 - 超时断线重连 ### 8.2 数据传输测试 1. **健康数据测试** - 心率数据实时传输 - 步数数据同步 - 大批量历史数据传输 2. **紧急功能测试** - SOS报警触发 - 录音数据传输 - 网络中断处理 ### 8.3 异常场景测试 1. **网络异常** - 断线重连 - 数据重传 - 缓存溢出处理 2. **电量不足** - 低电量模式 - 紧急数据保护 - 优雅关机 ## 九、版本更新机制 ### 9.1 固件更新协议 ```c // 固件更新请求 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更新流程 1. **版本检查**: 手机端查询手环固件版本 2. **更新准备**: 手环端进入更新模式 3. **数据传输**: 分包传输固件数据 4. **校验确认**: 校验固件完整性 5. **重启应用**: 重启到新固件 ## 十一、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表 ```c // 主要服务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: 硬件故障 ``` #### 数据包结构模板 ```c 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; ``` #### 错误代码定义 ```c #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校验计算算法 ```c 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连接参数推荐 ```c // 连接间隔配置 #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 ``` #### 实时监测采样率配置 ```c #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 **作者**: 系统设计团队 **审核**: 技术负责人