55 KiB
运动手环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 信道分配
// 信道分配方案
#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) 定义
// 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 网络地址规划
// 地址范围定义
#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 入网请求包
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 入网响应包
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 信道跳频机制
// 跳频序列生成算法
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 自适应信道选择
// 信道选择策略
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 中继节点发现
// 中继能力广播
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 命令分类与编码
// 命令大类定义
#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 实时心率数据
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: 序列号130: 心率命令66 B2 F4 A0: 时间戳(1723456672)4B: 心率75 bpm55: 信号质量85%00: 状态正常50: RR间期80(800ms)02: 活动水平200: 保留字节A3 B2: CRC16校验85: RSSI(-133dBm)
5.2.2 实时血氧数据
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: 序列号234: 血氧命令66 B2 F4 A0: 时间戳(1723456672)62: 血氧98%5A: 信号质量90%4F: 脉率79 bpm0C: 灌注指数1200: 测量状态正常55: 红光信号强度85%50: 红外光信号强度80%15: 运动伪影指数2120: 环境光干扰3258: 可靠性评分88%C2 F1: CRC16校验88: RSSI(-136dBm)
5.2.3 生命体征组合数据 (优化版)
// 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 实时监测控制协议
// 实时监测启动命令 (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实时传输优化策略
// 数据优先级定义
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 运动数据批量上传
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 运动数据批量上传
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紧急报警
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 时间同步请求
网关定期向所有手环设备发送时间同步命令,确保时间一致性。
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: 序列号164: 时间同步请求命令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 开始测量指令
网关要求指定手环开始进行健康数据测量和上报。
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: 目标设备地址2609: 控制字节(命令帧+ACK请求)02: 序列号260: 开始测量命令07: 测量类型(心率+血氧+体温)00 3C: 测量间隔60秒00 1E: 持续时间30分钟46: 质量阈值70%02: 优先级2(高)01: 上报模式1(批量)00 7B: 任务ID12303: 自动停止条件(低电量+信号差)A8 E5: CRC16校验8C: RSSI
5.4.3 数据上报请求
网关主动请求手环上报缓存的历史数据。
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: 目标设备地址2609: 控制字节(命令帧+ACK请求)03: 序列号362: 数据请求命令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 配置更新指令
网关向手环推送新的配置参数。
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: 目标设备地址2609: 控制字节(命令帧+ACK请求)04: 序列号465: 配置更新命令02: 配置类型2(上报间隔)01 F4: 配置ID50001: 配置版本100: 应用模式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 状态查询指令
网关查询手环当前的工作状态和健康数据。
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: 目标设备地址2609: 控制字节(命令帧+ACK请求)05: 序列号566: 状态查询命令0F: 查询类型(全部状态)02: 详细程度2(完整)01: 包含最新数据01 2C: 请求ID30085 F6: CRC16校验90: RSSI
5.4.6 远程控制指令
网关对手环进行远程控制操作,如重启、校准、测试等。
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: 目标设备地址2609: 控制字节(命令帧+ACK请求)06: 序列号668: 远程控制命令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 协议解析示例代码
// 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: 远程控制指令
帧类型定义
#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 // 紧急数据
控制字节位定义
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校验算法
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 重传策略
// 重传参数配置
#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)
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校验算法
// 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 数据备份与恢复
// 关键数据备份机制
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 设备认证
// 设备证书结构
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 加密算法
// 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 密钥分发协议
// 密钥更新通知
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 设备管理
// 设备注册表
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 负载均衡
// 负载均衡策略
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 邻居发现
// 邻居信息
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 睡眠模式定义
// 功耗模式
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 睡眠调度算法
// 动态睡眠调度
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 本地缓存管理
// 数据缓存项
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 关键性能参数
// 性能指标定义
#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 功能测试用例
-
基础通信测试
- 设备入网流程验证
- 心跳保活机制测试
- 数据传输正确性验证
-
可靠性测试
- 断线重连测试
- 数据重传验证
- 错误恢复测试
-
性能测试
- 延迟测试
- 吞吐量测试
- 并发连接测试
-
功耗测试
- 各模式功耗测量
- 电池寿命测试
- 睡眠唤醒测试
-
干扰测试
- WiFi干扰测试
- 蓝牙干扰测试
- 微波干扰测试
10.2.2 压力测试
// 压力测试配置
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 错误码定义
// 系统错误码 (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 日志级别定义
// 日志级别
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升级流程
// 固件信息查询
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 包分析器
// 包解析器接口
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 实时监控
// 监控数据结构
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
作者: 系统设计团队
审核: 技术负责人
注意事项:
- 本协议适用于2.4GHz ISM频段,需要遵守当地无线电管理规定
- 在实际部署前需要进行电磁兼容性测试
- 建议定期进行网络性能评估和优化
- 关键应用场景建议增加备用通信方案