Files
akmon/doc_zhipao/wearable_bluetooth_protocol.md
2026-01-20 08:04:15 +08:00

974 lines
31 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 运动手环蓝牙通信协议设计文档
## 一、协议概述
### 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
**作者**: 系统设计团队
**审核**: 技术负责人