Files
akmon/doc_ble/蓝牙协议.md
2026-01-20 08:04:15 +08:00

29 KiB
Raw Permalink Blame History

登录/注册 关于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
作者: 系统设计团队
审核: 技术负责人