1741 lines
55 KiB
Markdown
1741 lines
55 KiB
Markdown
# 运动手环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` | 心率75bpm,2.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. 关键应用场景建议增加备用通信方案
|