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

1741 lines
55 KiB
Markdown
Raw 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.
# 运动手环2.4G无线通信协议设计文档
## 一、协议概述
### 1.1 协议简介
- **协议名称**Wearable Band 2.4G Wireless Protocol (WB2GP)
- **协议版本**v1.0
- **通信方式**2.4GHz无线通信 (基于nRF24L01+或类似芯片)
- **网络拓扑**:星型网络 (网关为中心节点)
- **应用场景**手环与2.4G网关之间的数据交换
### 1.2 设计原则
- **低功耗**:支持超低功耗休眠和唤醒机制
- **实时性**紧急数据优先传输延迟低于100ms
- **可靠性**:自动重传、确认应答、信道跳频
- **可扩展性**支持一对多组网单网关最多64个设备
- **抗干扰**自适应信道选择抗2.4G频段干扰
### 1.3 系统架构
```
┌─────────────┐ 2.4G无线 ┌─────────────┐ 以太网/WiFi ┌─────────────┐
│ 手环设备 │ <============> │ 2.4G网关 │ <===============> │ 云端服务器 │
│ (终端节点) │ │ (协调器) │ │ (数据中心) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
数据采集 数据转发 数据处理
本地缓存 协议转换 长期存储
紧急处理 设备管理 业务逻辑
```
## 二、物理层规范
### 2.1 射频参数
- **工作频段**: 2.400-2.525 GHz (ISM频段)
- **信道数量**: 126个信道 (间隔1MHz)
- **调制方式**: GFSK (Gaussian Frequency Shift Keying)
- **发射功率**: 可调节 (-18dBm ~ +4dBm)
- **接收灵敏度**: -94dBm @ 250kbps
- **传输速率**: 250kbps / 1Mbps / 2Mbps (可配置)
### 2.2 信道分配
```c
// 信道分配方案
#define CHANNEL_MIN 2400 // 最小频率 (MHz)
#define CHANNEL_MAX 2525 // 最大频率 (MHz)
#define CHANNEL_COUNT 126 // 信道总数
#define CHANNEL_SPACING 1 // 信道间隔 (MHz)
// 预定义信道组
#define EMERGENCY_CHANNELS {2, 26, 80} // 紧急专用信道
#define DATA_CHANNELS {8, 32, 56, 80, 104} // 数据传输信道
#define CONTROL_CHANNELS {14, 38, 62, 86, 110} // 控制命令信道
```
### 2.3 功率管理
- **传输功率等级**:
- Level 0: -18dBm (室内近距离)
- Level 1: -12dBm (室内中距离)
- Level 2: -6dBm (室内远距离)
- Level 3: 0dBm (室外近距离)
- Level 4: +4dBm (室外远距离)
## 三、数据链路层
### 3.1 帧格式定义
#### 3.1.1 基础帧结构
```
+--------+--------+--------+--------+--------+--------+--------+--------+
| SYNC | LEN | ADDR_H | ADDR_L | CTRL | SEQ | PAYLOAD |
+--------+--------+--------+--------+--------+--------+--------+--------+
| 2B | 1B | 1B | 1B | 1B | 1B | 0-32 bytes |
+--------+--------+--------+--------+--------+--------+--------+--------+
+--------+--------+
| CRC16 | RSSI |
+--------+--------+
| 2B | 1B |
+--------+--------+
```
**字段说明**:
- **SYNC**: 同步字 `0x55AA` (网络识别)
- **LEN**: 数据包总长度 (含头部不含SYNC和CRC)
- **ADDR_H**: 目标地址高字节 (网关地址: 0x00, 广播: 0xFF)
- **ADDR_L**: 目标地址低字节 (设备地址: 0x01-0x3F)
- **CTRL**: 控制字节 (帧类型、ACK请求、重传标志等)
- **SEQ**: 序列号 (0-255用于去重和确认)
- **PAYLOAD**: 数据负载 (应用层数据)
- **CRC16**: 16位循环冗余校验
- **RSSI**: 接收信号强度指示 (由接收端填写)
#### 3.1.2 控制字节 (CTRL) 定义
```c
// CTRL字节位定义
#define CTRL_FRAME_TYPE_MASK 0x07 // 帧类型 (bit 0-2)
#define CTRL_ACK_REQUEST 0x08 // 请求ACK (bit 3)
#define CTRL_ACK_FRAME 0x10 // ACK帧 (bit 4)
#define CTRL_RETRANSMIT 0x20 // 重传标志 (bit 5)
#define CTRL_PRIORITY 0x40 // 高优先级 (bit 6)
#define CTRL_ENCRYPTED 0x80 // 加密标志 (bit 7)
// 帧类型定义
typedef enum {
FRAME_TYPE_DATA = 0x00, // 数据帧
FRAME_TYPE_COMMAND = 0x01, // 命令帧
FRAME_TYPE_ACK = 0x02, // 确认帧
FRAME_TYPE_BEACON = 0x03, // 信标帧
FRAME_TYPE_JOIN = 0x04, // 入网请求
FRAME_TYPE_EMERGENCY = 0x05, // 紧急数据
FRAME_TYPE_KEEPALIVE = 0x06, // 保活帧
FRAME_TYPE_BROADCAST = 0x07, // 广播帧
} frame_type_t;
```
### 3.2 地址分配机制
#### 3.2.1 网络地址规划
```c
// 地址范围定义
#define GATEWAY_ADDR 0x0000 // 网关地址
#define BROADCAST_ADDR 0xFFFF // 广播地址
#define DEVICE_ADDR_MIN 0x0001 // 设备最小地址
#define DEVICE_ADDR_MAX 0x003F // 设备最大地址 (63个设备)
#define EMERGENCY_ADDR 0x00E0 // 紧急设备地址段
#define TEMP_ADDR_MIN 0x8000 // 临时地址段
#define TEMP_ADDR_MAX 0x8FFF // 临时地址段结束
// 设备类型编码 (嵌入在地址中)
#define DEVICE_TYPE_WEARABLE 0x01 // 可穿戴设备
#define DEVICE_TYPE_SENSOR 0x02 // 传感器节点
#define DEVICE_TYPE_ACTUATOR 0x03 // 执行器节点
#define DEVICE_TYPE_REPEATER 0x04 // 中继器节点
```
#### 3.2.2 动态地址分配流程
```
手环设备 2.4G网关
| |
|---- JOIN_REQUEST (临时地址) -->|
| |
|<--- JOIN_RESPONSE (分配地址) ---|
| |
|---- JOIN_CONFIRM (确认) ------>|
| |
|<--- WELCOME (欢迎) ------------|
| |
|---- KEEPALIVE (保活) --------->|
```
## 四、网络层协议
### 4.1 入网流程
#### 4.1.1 入网请求包
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址 (网关)
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload: 入网请求数据
uint8_t device_type; // 设备类型
uint32_t device_id; // 设备唯一ID (MAC/序列号)
uint8_t protocol_ver; // 协议版本
uint8_t capabilities; // 设备能力
uint8_t battery_level; // 电池电量
uint8_t signal_strength;// 信号强度
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI (接收端填写)
} join_request_packet_t;
```
#### 4.1.2 入网响应包
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址 (请求设备临时地址)
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload: 入网响应数据
uint8_t result; // 入网结果 (0:成功, 其他:错误码)
uint16_t assigned_addr; // 分配的网络地址
uint8_t network_id; // 网络ID
uint16_t gateway_addr; // 网关地址
uint8_t channel_map[16];// 可用信道映射
uint32_t network_key; // 网络密钥 (加密)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} join_response_packet_t;
```
### 4.2 信道管理
#### 4.2.1 信道跳频机制
```c
// 跳频序列生成算法
uint8_t generate_hop_sequence(uint16_t device_addr, uint32_t time_slot) {
uint32_t seed = (device_addr << 16) | (time_slot & 0xFFFF);
uint8_t channel = (seed * 0x9E3779B9) >> 24; // 线性同余生成器
return CHANNEL_MIN + (channel % CHANNEL_COUNT);
}
// 信道质量评估
typedef struct {
uint8_t channel; // 信道号
uint8_t rssi_avg; // 平均RSSI
uint8_t packet_loss; // 丢包率 (%)
uint8_t interference; // 干扰水平
uint32_t last_used; // 最后使用时间
} channel_quality_t;
```
#### 4.2.2 自适应信道选择
```c
// 信道选择策略
typedef enum {
CHANNEL_SELECT_RANDOM = 0, // 随机选择
CHANNEL_SELECT_QUALITY = 1, // 质量优先
CHANNEL_SELECT_HOPPING = 2, // 跳频序列
CHANNEL_SELECT_FIXED = 3, // 固定信道
} channel_select_policy_t;
// 信道切换命令
typedef struct {
uint8_t cmd_type; // 命令类型
uint8_t new_channel; // 新信道
uint8_t switch_time; // 切换时间 (秒)
uint8_t reason; // 切换原因
} channel_switch_cmd_t;
```
### 4.3 路由与中继
#### 4.3.1 中继节点发现
```c
// 中继能力广播
typedef struct {
uint16_t relay_addr; // 中继节点地址
uint8_t relay_capacity; // 中继容量
uint8_t hop_count; // 跳数
uint8_t link_quality; // 链路质量
uint8_t battery_level; // 电池电量
} relay_info_t;
// 路由表项
typedef struct {
uint16_t dest_addr; // 目标地址
uint16_t next_hop; // 下一跳地址
uint8_t hop_count; // 跳数
uint8_t link_quality; // 链路质量
uint32_t last_updated; // 最后更新时间
} route_entry_t;
```
## 五、应用层协议
### 5.1 命令分类与编码
```c
// 命令大类定义
#define CMD_CLASS_SYSTEM 0x00 // 系统命令
#define CMD_CLASS_CONFIG 0x10 // 配置命令
#define CMD_CLASS_DATA 0x20 // 数据命令
#define CMD_CLASS_HEALTH 0x30 // 健康数据
#define CMD_CLASS_EMERGENCY 0x40 // 紧急命令
#define CMD_CLASS_NOTIFICATION 0x50 // 通知命令
#define CMD_CLASS_CONTROL 0x60 // 控制命令
#define CMD_CLASS_DEBUG 0x70 // 调试命令
// 系统命令 (0x00-0x0F)
#define CMD_PING 0x00 // 心跳
#define CMD_JOIN_NETWORK 0x01 // 入网
#define CMD_LEAVE_NETWORK 0x02 // 离网
#define CMD_TIME_SYNC 0x03 // 时间同步
#define CMD_FIRMWARE_UPDATE 0x04 // 固件更新
#define CMD_DEVICE_RESET 0x05 // 设备重置
#define CMD_DEVICE_INFO 0x06 // 设备信息
#define CMD_NETWORK_SCAN 0x07 // 网络扫描
// 数据命令 (0x20-0x3F)
#define CMD_DATA_UPLOAD 0x20 // 数据上传
#define CMD_DATA_DOWNLOAD 0x21 // 数据下载
#define CMD_DATA_SYNC 0x22 // 数据同步
#define CMD_DATA_CLEAR 0x23 // 数据清除
#define CMD_DATA_BACKUP 0x24 // 数据备份
#define CMD_DATA_RESTORE 0x25 // 数据恢复
// 健康数据命令 (0x30-0x3F)
#define CMD_HEART_RATE 0x30 // 心率数据
#define CMD_STEP_COUNT 0x31 // 步数数据
#define CMD_SLEEP_DATA 0x32 // 睡眠数据
#define CMD_SPORT_MODE 0x33 // 运动模式
#define CMD_BLOOD_OXYGEN 0x34 // 血氧数据
#define CMD_BODY_TEMP 0x35 // 体温数据
#define CMD_STRESS_LEVEL 0x36 // 压力水平
#define CMD_FALL_DETECTION 0x37 // 跌倒检测
#define CMD_VITAL_SIGNS 0x38 // 生命体征组合数据
#define CMD_REAL_TIME_START 0x39 // 开始实时监测
#define CMD_REAL_TIME_STOP 0x3A // 停止实时监测
#define CMD_MEASUREMENT_CONFIG 0x3B // 测量配置
// 紧急命令 (0x40-0x4F)
#define CMD_SOS_ALERT 0x40 // SOS报警
#define CMD_VOICE_RECORD 0x41 // 录音数据
#define CMD_LOCATION_REQUEST 0x42 // 位置请求
#define CMD_EMERGENCY_CONTACT 0x43 // 紧急联系人
#define CMD_MEDICAL_INFO 0x44 // 医疗信息
// 控制命令 (0x60-0x6F) - 网关主动发起
#define CMD_START_MEASUREMENT 0x60 // 要求开始测量
#define CMD_STOP_MEASUREMENT 0x61 // 要求停止测量
#define CMD_REQUEST_DATA 0x62 // 请求上报数据
#define CMD_SET_REPORT_INTERVAL 0x63 // 设置上报间隔
#define CMD_TIME_SYNC_REQ 0x64 // 时间同步请求
#define CMD_CONFIG_UPDATE 0x65 // 配置更新
#define CMD_STATUS_QUERY 0x66 // 状态查询
#define CMD_POWER_MANAGEMENT 0x67 // 电源管理
#define CMD_REMOTE_CONTROL 0x68 // 远程控制
#define CMD_SCHEDULE_TASK 0x69 // 定时任务
#define CMD_HEALTH_CHECK 0x6A // 健康检查
#define CMD_CALIBRATION 0x6B // 传感器校准
```
### 5.2 健康数据传输协议
### 5.2 健康数据传输协议
#### 5.2.1 实时心率数据
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload: 心率数据
uint8_t cmd; // CMD_HEART_RATE
uint32_t timestamp; // 时间戳
uint8_t heart_rate; // 心率值 (bpm)
uint8_t quality; // 信号质量 (0-100)
uint8_t status; // 状态 (0:正常 1:异常 2:未检测到)
uint8_t rr_interval; // RR间期 (ms/10)
uint8_t activity_level; // 活动水平 (0-4)
uint8_t reserved; // 保留字节
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} heart_rate_packet_t;
```
**2.4G心率数据Hex样例**:
```
55 AA 10 00 00 00 01 01 30 66 B2 F4 A0 4B 55 00 50 02 00 A3 B2 85
```
**解析**:
- `55 AA`: 同步字
- `10`: 包长度(16字节)
- `00 00`: 目标地址(网关)
- `00`: 控制字节(数据帧)
- `01`: 序列号1
- `30`: 心率命令
- `66 B2 F4 A0`: 时间戳(1723456672)
- `4B`: 心率75 bpm
- `55`: 信号质量85%
- `00`: 状态正常
- `50`: RR间期80(800ms)
- `02`: 活动水平2
- `00`: 保留字节
- `A3 B2`: CRC16校验
- `85`: RSSI(-133dBm)
#### 5.2.2 实时血氧数据
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节 (高优先级)
uint8_t seq; // 序列号
// Payload: 血氧数据
uint8_t cmd; // CMD_BLOOD_OXYGEN
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) PI值
uint8_t measurement_status; // 测量状态 (0:正常 1:低质量 2:无信号 3:运动干扰)
uint8_t red_signal; // 红光信号强度 (0-100)
uint8_t ir_signal; // 红外光信号强度 (0-100)
uint8_t motion_artifact; // 运动伪影指数 (0-100)
uint8_t ambient_light; // 环境光干扰 (0-100)
uint8_t reliability; // 可靠性评分 (0-100)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} blood_oxygen_packet_t;
```
**2.4G血氧数据Hex样例**:
```
55 AA 16 00 00 40 01 02 34 66 B2 F4 A0 62 5A 4F 0C 00 55 50 15 20 58 C2 F1 88
```
**解析**:
- `55 AA`: 同步字
- `16`: 包长度(22字节)
- `00 00`: 目标地址(网关)
- `40`: 控制字节(高优先级数据帧)
- `02`: 序列号2
- `34`: 血氧命令
- `66 B2 F4 A0`: 时间戳(1723456672)
- `62`: 血氧98%
- `5A`: 信号质量90%
- `4F`: 脉率79 bpm
- `0C`: 灌注指数12
- `00`: 测量状态正常
- `55`: 红光信号强度85%
- `50`: 红外光信号强度80%
- `15`: 运动伪影指数21
- `20`: 环境光干扰32
- `58`: 可靠性评分88%
- `C2 F1`: CRC16校验
- `88`: RSSI(-136dBm)
#### 5.2.3 生命体征组合数据 (优化版)
```c
// 2.4G优化版本:减少包数量,提高实时性
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节 (高优先级)
uint8_t seq; // 序列号
// Payload: 生命体征组合数据
uint8_t cmd; // CMD_VITAL_SIGNS
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; // 测量模式
uint8_t overall_status; // 整体状态 (位掩码: bit0-心率正常 bit1-血氧正常)
uint8_t battery_impact; // 电池影响评估 (预估剩余测量时间/分钟)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} vital_signs_2g_packet_t;
```
#### 5.2.4 实时监测控制协议
```c
// 实时监测启动命令 (2.4G专用)
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址 (手环地址)
uint8_t ctrl; // 控制字节 (需要ACK)
uint8_t seq; // 序列号
// Payload: 实时监测配置
uint8_t cmd; // CMD_REAL_TIME_START
uint8_t monitor_type; // 监测类型位掩码 (bit0:心率 bit1:血氧 bit2:体温)
uint16_t interval_ms; // 数据上报间隔 (毫秒) 2.4G建议:500-2000ms
uint8_t duration_min; // 监测持续时间 (分钟) 0=无限制
uint8_t quality_threshold; // 信号质量阈值
uint8_t transmission_power; // 传输功率等级 (0-4)
uint8_t channel_preference; // 首选信道 (0=自动选择)
uint8_t emergency_mode; // 紧急模式 (0:正常 1:紧急优先)
uint8_t data_compression; // 数据压缩 (0:关闭 1:轻度 2:重度)
uint8_t reserved[2]; // 保留字节
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} realtime_start_2g_t;
// 实时监测响应
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址 (网关地址)
uint8_t ctrl; // 控制字节 (ACK帧)
uint8_t seq; // 序列号
// Payload: 响应数据
uint8_t cmd; // CMD_ACK
uint8_t result; // 结果码
uint16_t session_id; // 会话ID
uint8_t estimated_battery_min; // 预估电池时间
uint8_t optimal_channel; // 建议最优信道
uint8_t current_load; // 当前网络负载 (0-100)
uint8_t signal_strength; // 信号强度
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} realtime_start_ack_2g_t;
```
#### 5.2.5 2.4G实时传输优化策略
```c
// 数据优先级定义
typedef enum {
PRIORITY_EMERGENCY = 0, // 紧急数据 (SOS、心率异常)
PRIORITY_VITAL = 1, // 生命体征数据
PRIORITY_HEALTH = 2, // 健康数据
PRIORITY_NORMAL = 3, // 普通数据
} data_priority_t;
// 传输策略配置
typedef struct {
uint8_t priority; // 数据优先级
uint8_t max_retries; // 最大重传次数
uint16_t timeout_ms; // 超时时间
uint8_t channel_policy; // 信道策略 (0:固定 1:跳频 2:质量优先)
uint8_t power_level; // 功率等级
} transmission_policy_t;
// 实时数据质量控制
typedef struct {
uint8_t min_quality; // 最小质量阈值
uint8_t sample_window; // 采样窗口 (秒)
uint8_t outlier_filter; // 异常值过滤 (0:关闭 1:开启)
uint8_t smoothing_level; // 平滑等级 (0-3)
} quality_control_t;
```
#### 5.2.6 运动数据批量上传
```c
typedef struct {
uint8_t cmd; // CMD_STEP_COUNT
uint32_t start_time; // 开始时间
uint32_t end_time; // 结束时间
uint16_t total_steps; // 总步数
uint16_t distance; // 总距离 (米)
uint16_t calories; // 总卡路里
uint8_t activity_type; // 活动类型
uint8_t avg_pace; // 平均配速
uint8_t max_pace; // 最大配速
uint8_t avg_heart_rate; // 平均心率
uint8_t max_heart_rate; // 最大心率
uint8_t zone_time[5]; // 各心率区间时间 (分钟)
} sport_summary_t;
// 分段运动数据
typedef struct {
uint32_t timestamp; // 时间戳
uint16_t step_count; // 步数
uint8_t heart_rate; // 心率
uint8_t activity_type; // 活动类型
} sport_segment_t;
// 批量运动数据包
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_DATA_UPLOAD
uint8_t data_type; // 数据类型 (运动数据)
uint16_t packet_index; // 包序号
uint16_t total_packets; // 总包数
uint8_t segment_count; // 本包段数
sport_segment_t segments[]; // 运动数据段
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} sport_data_packet_t;
```
#### 5.2.6 运动数据批量上传
```c
typedef struct {
uint8_t cmd; // CMD_STEP_COUNT
uint32_t start_time; // 开始时间
uint32_t end_time; // 结束时间
uint16_t total_steps; // 总步数
uint16_t distance; // 总距离 (米)
uint16_t calories; // 总卡路里
uint8_t activity_type; // 活动类型
uint8_t avg_pace; // 平均配速
uint8_t max_pace; // 最大配速
uint8_t avg_heart_rate; // 平均心率
uint8_t max_heart_rate; // 最大心率
uint8_t zone_time[5]; // 各心率区间时间 (分钟)
} sport_summary_t;
// 分段运动数据
typedef struct {
uint32_t timestamp; // 时间戳
uint16_t step_count; // 步数
uint8_t heart_rate; // 心率
uint8_t activity_type; // 活动类型
} sport_segment_t;
// 批量运动数据包
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_DATA_UPLOAD
uint8_t data_type; // 数据类型 (运动数据)
uint16_t packet_index; // 包序号
uint16_t total_packets; // 总包数
uint8_t segment_count; // 本包段数
sport_segment_t segments[]; // 运动数据段
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} sport_data_packet_t;
```
### 5.3 紧急报警协议
#### 5.3.1 SOS紧急报警
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址 (网关)
uint8_t ctrl; // 控制字节 (高优先级+ACK请求)
uint8_t seq; // 序列号
// Payload: SOS报警数据
uint8_t cmd; // CMD_SOS_ALERT
uint32_t alert_time; // 报警时间
uint8_t alert_type; // 报警类型 (1:手动SOS 2:跌倒检测 3:心率异常)
uint8_t severity; // 严重程度 (1-5级)
uint32_t device_id; // 设备ID
uint16_t location_x; // 位置坐标X
uint16_t location_y; // 位置坐标Y
uint8_t vital_signs[4]; // 生命体征 (心率/血氧/体温/活动量)
uint8_t battery_level; // 电池电量
uint8_t signal_quality; // 信号质量
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} sos_alert_packet_t;
```
**2.4G SOS报警Hex样例**:
```
55 AA 1C 00 00 68 FF 40 66 B2 F4 A0 01 05 00 7C 12 34 0A 28 0B 58 4B 62 24 03 50 55 D2 A4 82
```
**解析**:
- `55 AA`: 同步字
- `1C`: 包长度(28字节)
- `00 00`: 目标地址(网关)
- `68`: 控制字节(紧急高优先级+ACK请求)
- `FF`: 序列号255(紧急包)
- `40`: SOS报警命令
- `66 B2 F4 A0`: 报警时间戳(1723456672)
- `01`: 报警类型1(手动SOS)
- `05`: 严重程度5(最高)
- `00 7C 12 34`: 设备ID(8135220)
- `0A 28`: GPS坐标X(2600)
- `0B 58`: GPS坐标Y(2904)
- `4B 62 24 03`: 生命体征(心率75,血氧98,体温36,活动量3)
- `50`: 电池电量80%
- `55`: 信号质量85%
- `D2 A4`: CRC16校验
- `82`: RSSI(-130dBm)
uint32_t device_id; // 设备ID
uint16_t location_x; // 位置坐标X
uint16_t location_y; // 位置坐标Y
uint8_t vital_signs[4]; // 生命体征 (心率/血氧/体温/活动量)
uint8_t battery_level; // 电池电量
uint8_t signal_quality; // 信号质量
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} sos_alert_packet_t;
```
#### 5.3.2 录音数据传输
```c
// 录音数据传输协议 (支持分包)
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload: 录音数据头
uint8_t cmd; // CMD_VOICE_RECORD
uint8_t action; // 动作 (0:开始 1:数据 2:结束)
uint16_t session_id; // 会话ID
uint32_t total_size; // 总数据大小
uint16_t packet_index; // 包序号
uint16_t total_packets; // 总包数
uint8_t sample_rate; // 采样率 (0:8K 1:16K 2:32K)
uint8_t bit_depth; // 位深度 (0:8bit 1:16bit)
uint8_t compression; // 压缩格式 (0:PCM 1:ADPCM 2:G.711)
uint8_t data_len; // 本包数据长度
uint8_t audio_data[]; // 音频数据 (最大20字节)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} voice_data_packet_t;
```
### 5.4 网关控制协议 (网关主动发起)
#### 5.4.1 时间同步请求
网关定期向所有手环设备发送时间同步命令,确保时间一致性。
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 0x0E
uint16_t dest_addr; // 目标设备地址 (0xFFFF=广播)
uint8_t ctrl; // 控制字节 (命令帧+ACK请求)
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_TIME_SYNC_REQ (0x64)
uint32_t timestamp; // 网关当前时间戳 (Unix时间)
uint16_t timezone_offset; // 时区偏移 (分钟)
uint8_t dst_flag; // 夏令时标志 (0:标准时间 1:夏令时)
uint8_t sync_source; // 时间源 (0:NTP 1:GPS 2:手动 3:RTC)
uint8_t accuracy; // 时间精度 (秒)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} time_sync_request_t;
```
**时间同步请求Hex样例**:
```
55 AA 0E FF FF 09 01 64 66 B2 F4 A0 01 C2 00 01 01 C4 F2 88
```
**解析**:
- `55 AA`: 同步字
- `0E`: 包长度(14字节)
- `FF FF`: 广播地址
- `09`: 控制字节(命令帧+ACK请求)
- `01`: 序列号1
- `64`: 时间同步请求命令
- `66 B2 F4 A0`: 时间戳(1723456672, 2025-07-21 12:00:00)
- `01 C2`: 时区偏移+450分钟(东八区)
- `00`: 标准时间(非夏令时)
- `01`: 时间源1(GPS)
- `01`: 精度1秒
- `C4 F2`: CRC16校验
- `88`: RSSI
#### 5.4.2 开始测量指令
网关要求指定手环开始进行健康数据测量和上报。
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 0x10
uint16_t dest_addr; // 目标设备地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_START_MEASUREMENT (0x60)
uint8_t measure_type; // 测量类型位掩码 (bit0:心率 bit1:血氧 bit2:体温 bit3:运动)
uint16_t interval_sec; // 测量间隔 (秒)
uint16_t duration_min; // 测量持续时间 (分钟) 0=无限制
uint8_t quality_threshold; // 信号质量阈值 (0-100)
uint8_t priority; // 优先级 (0:低 1:中 2:高 3:紧急)
uint8_t report_mode; // 上报模式 (0:实时 1:批量 2:定时 3:触发)
uint16_t task_id; // 任务ID
uint8_t auto_stop_conditions; // 自动停止条件位掩码
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} start_measurement_cmd_t;
```
**开始测量指令Hex样例**:
```
55 AA 10 00 1A 09 02 60 07 00 3C 00 1E 46 02 01 00 7B 03 A8 E5 8C
```
**解析**:
- `55 AA`: 同步字
- `10`: 包长度(16字节)
- `00 1A`: 目标设备地址26
- `09`: 控制字节(命令帧+ACK请求)
- `02`: 序列号2
- `60`: 开始测量命令
- `07`: 测量类型(心率+血氧+体温)
- `00 3C`: 测量间隔60秒
- `00 1E`: 持续时间30分钟
- `46`: 质量阈值70%
- `02`: 优先级2(高)
- `01`: 上报模式1(批量)
- `00 7B`: 任务ID123
- `03`: 自动停止条件(低电量+信号差)
- `A8 E5`: CRC16校验
- `8C`: RSSI
#### 5.4.3 数据上报请求
网关主动请求手环上报缓存的历史数据。
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 0x12
uint16_t dest_addr; // 目标设备地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_REQUEST_DATA (0x62)
uint8_t data_type; // 数据类型 (1:心率 2:血氧 4:运动 8:睡眠)
uint32_t start_time; // 开始时间戳
uint32_t end_time; // 结束时间戳
uint8_t compression; // 是否压缩 (0:否 1:是)
uint8_t batch_size; // 批量大小 (每包记录数)
uint16_t max_packets; // 最大包数限制
uint8_t priority; // 传输优先级
uint8_t timeout_sec; // 超时时间 (秒)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} data_request_cmd_t;
```
**数据上报请求Hex样例**:
```
55 AA 12 00 1A 09 03 62 03 66 B0 00 00 66 B2 F4 A0 01 0A 00 64 02 1E B2 A5 8D
```
**解析**:
- `55 AA`: 同步字
- `12`: 包长度(18字节)
- `00 1A`: 目标设备地址26
- `09`: 控制字节(命令帧+ACK请求)
- `03`: 序列号3
- `62`: 数据请求命令
- `03`: 数据类型(心率+血氧)
- `66 B0 00 00`: 开始时间戳(1723200000)
- `66 B2 F4 A0`: 结束时间戳(1723456672)
- `01`: 启用压缩
- `0A`: 批量大小10条记录/包
- `00 64`: 最大包数100包
- `02`: 传输优先级2(高)
- `1E`: 超时时间30秒
- `B2 A5`: CRC16校验
- `8D`: RSSI
#### 5.4.4 配置更新指令
网关向手环推送新的配置参数。
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 可变长度
uint16_t dest_addr; // 目标设备地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_CONFIG_UPDATE (0x65)
uint8_t config_type; // 配置类型 (1:测量参数 2:上报间隔 3:电源管理 4:网络参数)
uint16_t config_id; // 配置ID
uint8_t config_version; // 配置版本
uint8_t apply_mode; // 应用模式 (0:立即 1:下次重启 2:定时)
uint32_t apply_time; // 应用时间 (定时模式用)
uint8_t backup_old; // 是否备份旧配置 (0:否 1:是)
uint8_t config_len; // 配置数据长度
uint8_t config_data[]; // 配置数据
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} config_update_cmd_t;
```
**配置更新指令Hex样例**:
```
55 AA 16 00 1A 09 04 65 02 01 F4 01 00 00 00 00 00 01 08 3C 00 46 02 14 05 00 D4 C8 8F
```
**解析**:
- `55 AA`: 同步字
- `16`: 包长度(22字节)
- `00 1A`: 目标设备地址26
- `09`: 控制字节(命令帧+ACK请求)
- `04`: 序列号4
- `65`: 配置更新命令
- `02`: 配置类型2(上报间隔)
- `01 F4`: 配置ID500
- `01`: 配置版本1
- `00`: 应用模式0(立即)
- `00 00 00 00`: 应用时间(立即模式无效)
- `01`: 备份旧配置
- `08`: 配置数据长度8字节
- `3C 00 46 02 14 05 00`: 配置数据(间隔60秒,质量70%,优先级2,模式5等)
- `D4 C8`: CRC16校验
- `8F`: RSSI
#### 5.4.5 状态查询指令
网关查询手环当前的工作状态和健康数据。
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 0x0A
uint16_t dest_addr; // 目标设备地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_STATUS_QUERY (0x66)
uint8_t query_type; // 查询类型位掩码 (bit0:基本状态 bit1:传感器状态 bit2:网络状态 bit3:电源状态)
uint8_t detail_level; // 详细程度 (0:简要 1:详细 2:完整)
uint8_t include_data; // 是否包含最新数据 (0:否 1:是)
uint16_t request_id; // 请求ID
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} status_query_cmd_t;
```
**状态查询指令Hex样例**:
```
55 AA 0A 00 1A 09 05 66 0F 02 01 01 2C 85 F6 90
```
**解析**:
- `55 AA`: 同步字
- `0A`: 包长度(10字节)
- `00 1A`: 目标设备地址26
- `09`: 控制字节(命令帧+ACK请求)
- `05`: 序列号5
- `66`: 状态查询命令
- `0F`: 查询类型(全部状态)
- `02`: 详细程度2(完整)
- `01`: 包含最新数据
- `01 2C`: 请求ID300
- `85 F6`: CRC16校验
- `90`: RSSI
#### 5.4.6 远程控制指令
网关对手环进行远程控制操作,如重启、校准、测试等。
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 0x0C
uint16_t dest_addr; // 目标设备地址
uint8_t ctrl; // 控制字节
uint8_t seq; // 序列号
// Payload
uint8_t cmd; // CMD_REMOTE_CONTROL (0x68)
uint8_t control_action; // 控制动作 (1:重启 2:校准 3:自检 4:恢复出厂 5:强制同步)
uint8_t target_module; // 目标模块 (0:全部 1:传感器 2:通信 3:存储 4:显示)
uint8_t execution_mode; // 执行模式 (0:立即 1:延迟 2:定时)
uint32_t execution_time; // 执行时间 (延迟秒数或定时时间戳)
uint8_t force_flag; // 强制标志 (0:正常 1:强制)
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} remote_control_cmd_t;
```
**远程控制指令Hex样例**:
```
55 AA 0C 00 1A 09 06 68 01 00 01 00 00 00 1E 00 A5 B8 91
```
**解析**:
- `55 AA`: 同步字
- `0C`: 包长度(12字节)
- `00 1A`: 目标设备地址26
- `09`: 控制字节(命令帧+ACK请求)
- `06`: 序列号6
- `68`: 远程控制命令
- `01`: 控制动作1(重启)
- `00`: 目标模块0(全部)
- `01`: 执行模式1(延迟)
- `00 00 00 1E`: 延迟30秒执行
- `00`: 正常模式(非强制)
- `A5 B8`: CRC16校验
- `91`: RSSI
## 十二、2.4G协议Hex样例汇总表
### 12.1 健康数据协议样例
| 协议类型 | 命令码 | Hex样例 | 说明 |
|---------|--------|---------|------|
| 入网请求 | 0x01 | `55 AA 0C 00 00 04 01 01 00 7C 12 34 01 02 50 55 A2 B4 85` | 设备申请入网 |
| 心率数据 | 0x30 | `55 AA 10 00 00 00 01 01 30 66 B2 F4 A0 4B 55 00 50 02 00 A3 B2 85` | 心率75bpm2.4G传输 |
| 血氧数据 | 0x34 | `55 AA 16 00 00 40 01 02 34 66 B2 F4 A0 62 5A 4F 0C 00 55 50 15 20 58 C2 F1 88` | 血氧98%,增强数据 |
| 生命体征组合 | 0x38 | `55 AA 12 00 00 40 03 38 66 B2 F4 A0 4B 55 62 5A 50 0C 02 01 03 3C B8 A5 8A` | 2.4G优化组合数据 |
| SOS紧急报警 | 0x40 | `55 AA 1C 00 00 68 FF 40 66 B2 F4 A0 01 05 00 7C 12 34 0A 28 0B 58 4B 62 24 03 50 55 D2 A4 82` | 紧急SOS最高优先级 |
### 12.2 网络管理协议样例
| 命令类型 | 命令码 | Hex样例 | 说明 |
|---------|--------|---------|------|
| 信标帧 | 0x03 | `55 AA 08 FF FF 03 01 00 01 02 55 A4 C2 92` | 网关广播信标 |
| 入网响应 | 0x01 | `55 AA 0E 80 00 02 01 00 00 01 00 00 02 FF FF FF 00 01 B5 D2 90` | 分配地址0x0001 |
| 保活帧 | 0x06 | `55 AA 06 00 00 00 02 06 50 85 A2 B4 88` | 设备保活电量80% |
### 12.3 网关控制协议样例 (网关主动发起)
| 命令类型 | 命令码 | Hex样例 | 说明 |
|---------|--------|---------|------|
| 时间同步请求 | 0x64 | `55 AA 0E FF FF 09 01 64 66 B2 F4 A0 01 C2 00 01 01 C4 F2 88` | 网关广播时间同步 |
| 开始测量指令 | 0x60 | `55 AA 10 00 1A 09 02 60 07 00 3C 00 1E 46 02 01 00 7B 03 A8 E5 8C` | 要求设备26开始测量 |
| 数据上报请求 | 0x62 | `55 AA 12 00 1A 09 03 62 03 66 B0 00 00 66 B2 F4 A0 01 0A 00 64 02 1E B2 A5 8D` | 请求历史数据上报 |
| 配置更新指令 | 0x65 | `55 AA 16 00 1A 09 04 65 02 01 F4 01 00 00 00 00 00 01 08 3C 00 46 02 14 05 00 D4 C8 8F` | 更新设备配置参数 |
| 状态查询指令 | 0x66 | `55 AA 0A 00 1A 09 05 66 0F 02 01 01 2C 85 F6 90` | 查询设备完整状态 |
| 远程控制指令 | 0x68 | `55 AA 0C 00 1A 09 06 68 01 00 01 00 00 00 1E 00 A5 B8 91` | 远程重启设备(延迟30秒) |
| ACK确认 | 0x02 | `55 AA 06 00 01 02 FF 00 01 55 C3 A5 85` | 确认序列号1 |
| 信道切换 | 0x07 | `55 AA 07 00 01 01 03 07 32 0A 01 D4 B2 8C` | 切换到信道50 |
### 12.4 实时监测协议样例
| 命令类型 | 命令码 | Hex样例 | 说明 |
|---------|--------|---------|------|
| 实时监测开始 | 0x39 | `55 AA 10 00 01 08 01 39 03 07 D0 0A 32 02 00 00 00 00 B8 C4 87` | 开始心率+血氧监测 |
| 实时监测停止 | 0x3A | `55 AA 08 00 01 08 02 3A 00 01 00 01 A5 B2 89` | 停止监测会话1 |
| 测量配置 | 0x3B | `55 AA 0E 00 01 08 03 3B 03 01 64 01 00 01 01 02 01 D2 A4 8B` | 配置传感器参数 |
### 12.4 2.4G帧格式详解
```
2.4G数据帧结构:
+--------+--------+--------+--------+--------+--------+--------+--------+
| SYNC_H | SYNC_L | LEN |ADDR_H |ADDR_L | CTRL | SEQ | CMD |
+--------+--------+--------+--------+--------+--------+--------+--------+
| 0x55 | 0xAA | 1B | 1B | 1B | 1B | 1B | 1B |
+--------+--------+--------+--------+--------+--------+--------+--------+
+--------+--------+--------+--------+--------+--------+
| PAYLOAD (可变长度) | CRC16 | RSSI |
+--------+--------+--------+--------+--------+--------+
| 0-32 bytes | 2B | 1B |
+--------+--------+--------+--------+--------+--------+
```
### 12.5 协议解析示例代码
```c
// 2.4G数据包解析函数
typedef enum {
PARSE_2G_SUCCESS = 0,
PARSE_2G_ERROR_SYNC,
PARSE_2G_ERROR_LENGTH,
PARSE_2G_ERROR_CRC
} parse_2g_result_t;
parse_2g_result_t parse_2g_packet(const uint8_t *data, uint16_t len, packet_2g_t *packet) {
if (len < 9) return PARSE_2G_ERROR_LENGTH;
// 检查同步字
if (data[0] != 0x55 || data[1] != 0xAA) return PARSE_2G_ERROR_SYNC;
// 获取包长度
uint8_t packet_len = data[2];
if (packet_len + 5 != len) return PARSE_2G_ERROR_LENGTH;
// 计算CRC16
uint16_t calc_crc = calculate_crc16(&data[2], packet_len);
uint16_t recv_crc = (data[len-3] << 8) | data[len-2];
// 检查CRC
if (calc_crc != recv_crc) return PARSE_2G_ERROR_CRC;
// 解析数据包
packet->sync = (data[0] << 8) | data[1];
packet->len = data[2];
packet->dest_addr = (data[3] << 8) | data[4];
packet->ctrl = data[5];
packet->seq = data[6];
packet->cmd = data[7];
memcpy(packet->payload, &data[8], packet_len - 6);
packet->crc16 = recv_crc;
packet->rssi = data[len-1];
return PARSE_2G_SUCCESS;
}
```
### 12.7 快速参考表
#### 2.4G命令码快速查找
```
系统命令: 0x00-0x0F
├── 0x00: PING心跳
├── 0x01: 入网管理
├── 0x03: 信标帧
└── 0x06: 保活帧
健康数据: 0x30-0x3F
├── 0x30: 心率数据
├── 0x34: 血氧数据
├── 0x38: 生命体征组合
├── 0x39: 实时监测开始
└── 0x3A: 实时监测停止
紧急功能: 0x40-0x4F
├── 0x40: SOS报警
├── 0x41: 录音数据
└── 0x42: 位置请求
网关控制: 0x60-0x6F (网关主动发起)
├── 0x60: 开始测量指令
├── 0x62: 数据上报请求
├── 0x64: 时间同步请求
├── 0x65: 配置更新指令
├── 0x66: 状态查询指令
└── 0x68: 远程控制指令
```
#### 帧类型定义
```c
#define FRAME_TYPE_DATA 0x00 // 数据帧
#define FRAME_TYPE_COMMAND 0x01 // 命令帧
#define FRAME_TYPE_ACK 0x02 // 确认帧
#define FRAME_TYPE_BEACON 0x03 // 信标帧
#define FRAME_TYPE_JOIN 0x04 // 入网请求
#define FRAME_TYPE_EMERGENCY 0x05 // 紧急数据
```
#### 控制字节位定义
```c
bit 0-2: (FRAME_TYPE_xxx)
bit 3: ACK请求标志
bit 4: ACK帧标志
bit 5:
bit 6:
bit 7:
```
#### 地址分配规则
- 网关地址: `0x0000`
- 广播地址: `0xFFFF`
- 设备地址: `0x0001-0x003F`
- 紧急地址: `0x00E0-0x00EF`
- 临时地址: `0x8000-0x8FFF`
#### 信道分配方案
- 紧急专用: 信道2, 26, 80
- 数据传输: 信道8, 32, 56, 80, 104
- 控制命令: 信道14, 38, 62, 86, 110
#### CRC16校验算法
```c
uint16_t calculate_crc16(const uint8_t *data, uint16_t length) {
uint16_t crc = 0xFFFF;
uint16_t polynomial = 0x1021;
for (uint16_t i = 0; i < length; i++) {
crc ^= (data[i] << 8);
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
}
}
return crc;
}
```
## 十一、可靠性机制
### 6.1 自动重传请求 (ARQ)
#### 6.1.1 重传策略
```c
// 重传参数配置
#define MAX_RETRIES 3 // 最大重传次数
#define ACK_TIMEOUT_MS 100 // ACK超时时间
#define RETRANS_BACKOFF_MS 50 // 重传退避时间
#define EMERGENCY_MAX_RETRIES 5 // 紧急数据最大重传次数
#define EMERGENCY_TIMEOUT_MS 50 // 紧急数据超时时间
// 重传队列管理
typedef struct {
uint8_t seq; // 序列号
uint8_t retry_count; // 重传计数
uint32_t timestamp; // 发送时间戳
uint16_t packet_len; // 数据包长度
uint8_t packet_data[]; // 数据包内容
} retrans_queue_item_t;
```
#### 6.1.2 确认应答 (ACK)
```c
typedef struct {
uint16_t sync; // 0x55AA
uint8_t len; // 数据包长度
uint16_t dest_addr; // 目标地址
uint8_t ctrl; // 控制字节 (ACK帧)
uint8_t seq; // 序列号
// Payload: ACK数据
uint8_t ack_seq; // 确认的序列号
uint8_t result; // 结果 (0:成功 其他:错误码)
uint8_t rssi_report; // RSSI报告
uint8_t reserved; // 保留
uint16_t crc16; // CRC校验
uint8_t rssi; // RSSI
} ack_packet_t;
```
### 6.2 数据完整性校验
#### 6.2.1 CRC校验算法
```c
// CRC-16-CCITT校验算法
uint16_t calculate_crc16(const uint8_t *data, uint16_t length) {
uint16_t crc = 0xFFFF;
uint16_t polynomial = 0x1021;
for (uint16_t i = 0; i < length; i++) {
crc ^= (data[i] << 8);
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
}
}
return crc;
}
```
#### 6.2.2 数据备份与恢复
```c
// 关键数据备份机制
typedef struct {
uint32_t backup_time; // 备份时间
uint16_t data_type; // 数据类型
uint16_t data_length; // 数据长度
uint16_t checksum; // 数据校验和
uint8_t backup_data[]; // 备份数据
} data_backup_t;
// 数据恢复请求
typedef struct {
uint8_t cmd; // CMD_DATA_RESTORE
uint32_t start_time; // 开始时间
uint32_t end_time; // 结束时间
uint16_t data_type; // 数据类型
uint8_t priority; // 优先级
} data_restore_request_t;
```
## 七、安全机制
### 7.1 网络接入安全
#### 7.1.1 设备认证
```c
// 设备证书结构
typedef struct {
uint32_t device_id; // 设备唯一ID
uint16_t vendor_id; // 厂商ID
uint16_t product_id; // 产品ID
uint32_t serial_number; // 序列号
uint8_t device_key[16]; // 设备密钥
uint32_t cert_crc; // 证书校验
} device_certificate_t;
// 认证挑战
typedef struct {
uint8_t cmd; // 认证命令
uint32_t challenge; // 随机挑战码
uint32_t timestamp; // 时间戳
uint8_t nonce[8]; // 随机数
} auth_challenge_t;
// 认证响应
typedef struct {
uint8_t cmd; // 认证命令
uint32_t response; // 响应码 (加密后的挑战码)
uint8_t signature[16]; // 数字签名
} auth_response_t;
```
### 7.2 数据加密
#### 7.2.1 加密算法
```c
// AES-128加密配置
#define AES_KEY_SIZE 16 // 密钥长度
#define AES_BLOCK_SIZE 16 // 块大小
#define AES_IV_SIZE 16 // 初始向量长度
// 加密上下文
typedef struct {
uint8_t key[AES_KEY_SIZE]; // 加密密钥
uint8_t iv[AES_IV_SIZE]; // 初始向量
uint32_t counter; // 计数器
} crypto_context_t;
// 加密数据包头
typedef struct {
uint8_t encrypted_flag; // 加密标志
uint8_t algorithm; // 加密算法 (0:AES-128)
uint8_t key_index; // 密钥索引
uint32_t counter; // 计数器
uint8_t mac[8]; // 消息认证码
} crypto_header_t;
```
### 7.3 密钥管理
#### 7.3.1 密钥分发协议
```c
// 密钥更新通知
typedef struct {
uint8_t cmd; // 密钥管理命令
uint8_t key_type; // 密钥类型 (0:网络密钥 1:数据密钥)
uint8_t key_index; // 密钥索引
uint32_t valid_time; // 有效时间
uint8_t encrypted_key[16]; // 加密后的密钥
} key_update_t;
```
## 八、网络管理
### 8.1 网关功能
#### 8.1.1 设备管理
```c
// 设备注册表
typedef struct {
uint16_t device_addr; // 设备地址
uint32_t device_id; // 设备ID
uint8_t device_type; // 设备类型
uint8_t status; // 状态 (0:离线 1:在线 2:休眠)
uint32_t last_seen; // 最后在线时间
uint8_t battery_level; // 电池电量
uint8_t signal_strength;// 信号强度
uint32_t data_counter; // 数据计数器
uint32_t error_counter; // 错误计数器
} device_registry_t;
// 网络状态统计
typedef struct {
uint16_t total_devices; // 总设备数
uint16_t online_devices;// 在线设备数
uint32_t total_packets; // 总包数
uint32_t error_packets; // 错误包数
uint8_t channel_usage[126]; // 信道使用率
uint8_t network_load; // 网络负载
} network_statistics_t;
```
#### 8.1.2 负载均衡
```c
// 负载均衡策略
typedef enum {
BALANCE_ROUND_ROBIN = 0, // 轮询
BALANCE_LEAST_LOAD = 1, // 最小负载
BALANCE_RANDOM = 2, // 随机
BALANCE_QUALITY = 3, // 信号质量优先
} balance_policy_t;
// 信道负载监控
typedef struct {
uint8_t channel; // 信道号
uint8_t device_count; // 设备数量
uint8_t packet_rate; // 包速率 (包/秒)
uint8_t collision_rate; // 冲突率
uint8_t noise_level; // 噪声水平
} channel_load_t;
```
### 8.2 网络拓扑管理
#### 8.2.1 邻居发现
```c
// 邻居信息
typedef struct {
uint16_t neighbor_addr; // 邻居地址
uint8_t hop_count; // 跳数
uint8_t link_quality; // 链路质量 (0-100)
uint8_t rssi; // 信号强度
uint32_t last_update; // 最后更新时间
} neighbor_info_t;
// 邻居发现包
typedef struct {
uint8_t cmd; // 邻居发现命令
uint16_t sender_addr; // 发送者地址
uint8_t ttl; // 生存时间
uint8_t seq_num; // 序列号
uint32_t timestamp; // 时间戳
} neighbor_discovery_t;
```
## 九、功耗优化
### 9.1 睡眠管理
#### 9.1.1 睡眠模式定义
```c
// 功耗模式
typedef enum {
POWER_MODE_ACTIVE = 0, // 活跃模式 (全功能)
POWER_MODE_IDLE = 1, // 空闲模式 (CPU降频)
POWER_MODE_STANDBY = 2, // 待机模式 (保持网络连接)
POWER_MODE_SLEEP = 3, // 睡眠模式 (定时唤醒)
POWER_MODE_DEEP = 4, // 深度睡眠 (只保留RTC)
} power_mode_t;
// 唤醒源配置
typedef struct {
uint8_t timer_wakeup; // 定时器唤醒 (秒)
uint8_t button_wakeup; // 按键唤醒
uint8_t motion_wakeup; // 运动检测唤醒
uint8_t emergency_wakeup; // 紧急情况唤醒
uint8_t network_wakeup; // 网络唤醒
} wakeup_config_t;
```
#### 9.1.2 睡眠调度算法
```c
// 动态睡眠调度
uint32_t calculate_sleep_duration(device_context_t *ctx) {
uint32_t base_interval = 30; // 基础间隔 (秒)
// 根据电池电量调整
if (ctx->battery_level < 20) {
base_interval *= 2; // 低电量延长睡眠
}
// 根据数据缓存调整
if (ctx->data_queue_size > 80) {
base_interval /= 2; // 数据较多减少睡眠
}
// 根据网络质量调整
if (ctx->signal_strength < 30) {
base_interval += 10; // 信号差延长睡眠
}
return base_interval;
}
```
### 9.2 数据缓存策略
#### 9.2.1 本地缓存管理
```c
// 数据缓存项
typedef struct {
uint32_t timestamp; // 时间戳
uint8_t data_type; // 数据类型
uint8_t priority; // 优先级 (1-5)
uint16_t data_size; // 数据大小
uint8_t retry_count; // 重试次数
uint8_t data[]; // 数据内容
} cache_item_t;
// 缓存策略
typedef enum {
CACHE_POLICY_FIFO = 0, // 先进先出
CACHE_POLICY_LRU = 1, // 最近最少使用
CACHE_POLICY_PRIORITY = 2, // 优先级优先
CACHE_POLICY_SIZE = 3, // 大小优先
} cache_policy_t;
```
## 十、质量保证
### 10.1 性能指标
#### 10.1.1 关键性能参数
```c
// 性能指标定义
#define MAX_LATENCY_MS 100 // 最大延迟
#define MIN_THROUGHPUT_KBPS 50 // 最小吞吐量
#define MAX_PACKET_LOSS_RATE 1 // 最大丢包率 (%)
#define MIN_BATTERY_LIFE_DAYS 7 // 最小电池寿命
#define MAX_DEVICE_COUNT 64 // 最大设备数
#define MIN_SIGNAL_RANGE_M 100 // 最小信号覆盖范围
// 性能监控结构
typedef struct {
uint32_t tx_packet_count; // 发送包计数
uint32_t rx_packet_count; // 接收包计数
uint32_t tx_error_count; // 发送错误计数
uint32_t rx_error_count; // 接收错误计数
uint32_t retrans_count; // 重传计数
uint32_t avg_latency_ms; // 平均延迟
uint16_t throughput_bps; // 吞吐量
uint8_t packet_loss_rate; // 丢包率
} performance_metrics_t;
```
### 10.2 测试验证
#### 10.2.1 功能测试用例
1. **基础通信测试**
- 设备入网流程验证
- 心跳保活机制测试
- 数据传输正确性验证
2. **可靠性测试**
- 断线重连测试
- 数据重传验证
- 错误恢复测试
3. **性能测试**
- 延迟测试
- 吞吐量测试
- 并发连接测试
4. **功耗测试**
- 各模式功耗测量
- 电池寿命测试
- 睡眠唤醒测试
5. **干扰测试**
- WiFi干扰测试
- 蓝牙干扰测试
- 微波干扰测试
#### 10.2.2 压力测试
```c
// 压力测试配置
typedef struct {
uint16_t device_count; // 设备数量
uint32_t test_duration; // 测试时长
uint16_t packet_rate; // 包发送速率
uint8_t data_size; // 数据包大小
uint8_t error_inject_rate; // 错误注入率
} stress_test_config_t;
```
## 十一、故障诊断
### 11.1 错误码定义
```c
// 系统错误码 (0x00-0x0F)
#define ERR_SUCCESS 0x00 // 成功
#define ERR_INVALID_PARAM 0x01 // 无效参数
#define ERR_TIMEOUT 0x02 // 超时
#define ERR_CRC_ERROR 0x03 // CRC错误
#define ERR_BUFFER_FULL 0x04 // 缓冲区满
#define ERR_MEMORY_ALLOC 0x05 // 内存分配失败
#define ERR_INVALID_STATE 0x06 // 无效状态
#define ERR_NOT_SUPPORTED 0x07 // 不支持
// 网络错误码 (0x10-0x1F)
#define ERR_NETWORK_DOWN 0x10 // 网络断开
#define ERR_NO_ROUTE 0x11 // 无路由
#define ERR_ADDRESS_CONFLICT 0x12 // 地址冲突
#define ERR_JOIN_FAILED 0x13 // 入网失败
#define ERR_AUTH_FAILED 0x14 // 认证失败
#define ERR_CHANNEL_BUSY 0x15 // 信道忙
#define ERR_SIGNAL_WEAK 0x16 // 信号弱
// 设备错误码 (0x20-0x2F)
#define ERR_SENSOR_FAULT 0x20 // 传感器故障
#define ERR_BATTERY_LOW 0x21 // 电池低电量
#define ERR_TEMPERATURE_HIGH 0x22 // 温度过高
#define ERR_HARDWARE_FAULT 0x23 // 硬件故障
#define ERR_CALIBRATION_FAIL 0x24 // 校准失败
```
### 11.2 日志系统
#### 11.2.1 日志级别定义
```c
// 日志级别
typedef enum {
LOG_LEVEL_ERROR = 0, // 错误
LOG_LEVEL_WARNING = 1, // 警告
LOG_LEVEL_INFO = 2, // 信息
LOG_LEVEL_DEBUG = 3, // 调试
LOG_LEVEL_VERBOSE = 4, // 详细
} log_level_t;
// 日志记录结构
typedef struct {
uint32_t timestamp; // 时间戳
uint8_t level; // 日志级别
uint8_t module; // 模块ID
uint16_t event_id; // 事件ID
uint8_t data_len; // 数据长度
uint8_t data[]; // 日志数据
} log_entry_t;
```
## 十二、升级维护
### 12.1 固件升级协议
#### 12.1.1 OTA升级流程
```c
// 固件信息查询
typedef struct {
uint8_t cmd; // 查询命令
uint32_t current_version; // 当前版本
uint32_t hardware_id; // 硬件ID
uint16_t flash_size; // Flash大小
uint16_t available_space; // 可用空间
} firmware_info_query_t;
// 固件升级开始
typedef struct {
uint8_t cmd; // 升级命令
uint32_t firmware_version; // 固件版本
uint32_t firmware_size; // 固件大小
uint16_t block_size; // 块大小
uint16_t total_blocks; // 总块数
uint32_t firmware_crc; // 固件CRC
uint8_t upgrade_type; // 升级类型 (0:完整 1:差分)
} firmware_upgrade_start_t;
// 固件数据块
typedef struct {
uint8_t cmd; // 数据命令
uint16_t block_index; // 块索引
uint16_t block_size; // 块大小
uint32_t block_crc; // 块CRC
uint8_t block_data[]; // 块数据
} firmware_block_t;
```
## 十三、开发工具
### 13.1 协议测试工具
#### 13.1.1 包分析器
```c
// 包解析器接口
typedef struct {
void (*parse_packet)(const uint8_t *data, uint16_t len);
void (*display_packet)(const packet_info_t *info);
void (*save_packet)(const packet_info_t *info, const char *filename);
void (*filter_packet)(const filter_rule_t *rules);
} packet_analyzer_t;
// 统计信息
typedef struct {
uint32_t total_packets; // 总包数
uint32_t valid_packets; // 有效包数
uint32_t error_packets; // 错误包数
uint32_t retrans_packets; // 重传包数
uint8_t packet_types[256]; // 各类型包计数
} packet_statistics_t;
```
### 13.2 性能监控工具
#### 13.2.1 实时监控
```c
// 监控数据结构
typedef struct {
uint32_t timestamp; // 时间戳
uint16_t device_count; // 设备数量
uint32_t packet_rate; // 包速率
uint16_t avg_latency; // 平均延迟
uint8_t network_load; // 网络负载
uint8_t channel_usage[126]; // 信道使用率
} monitor_snapshot_t;
```
---
**文档版本**: v1.0
**最后更新**: 2025-07-21
**作者**: 系统设计团队
**审核**: 技术负责人
**注意事项**:
1. 本协议适用于2.4GHz ISM频段需要遵守当地无线电管理规定
2. 在实际部署前需要进行电磁兼容性测试
3. 建议定期进行网络性能评估和优化
4. 关键应用场景建议增加备用通信方案