974 lines
31 KiB
Markdown
974 lines
31 KiB
Markdown
# 运动手环蓝牙通信协议设计文档
|
||
|
||
## 一、协议概述
|
||
|
||
### 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
|
||
**作者**: 系统设计团队
|
||
**审核**: 技术负责人
|