# 运动手环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. 关键应用场景建议增加备用通信方案