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

55 KiB
Raw Blame History

运动手环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: 序列号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 实时血氧数据

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 生命体征组合数据 (优化版)

// 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: 序列号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 开始测量指令

网关要求指定手环开始进行健康数据测量和上报。

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 数据上报请求

网关主动请求手环上报缓存的历史数据。

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 配置更新指令

网关向手环推送新的配置参数。

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 状态查询指令

网关查询手环当前的工作状态和健康数据。

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 远程控制指令

网关对手环进行远程控制操作,如重启、校准、测试等。

typedef struct {
    uint16_t sync;          // 0x55AA
    uint8_t len;            // 0x0C
    uint16_t dest_addr;     // 目标设备地址
    uint8_t ctrl;           // 控制字节
    uint8_t seq;            // 序列号
    
    // Payload
    uint8_t cmd;            // CMD_REMOTE_CONTROL (0x68)
    uint8_t control_action; // 控制动作 (1:重启 2:校准 3:自检 4:恢复出厂 5:强制同步)
    uint8_t target_module;  // 目标模块 (0:全部 1:传感器 2:通信 3:存储 4:显示)
    uint8_t execution_mode; // 执行模式 (0:立即 1:延迟 2:定时)
    uint32_t execution_time; // 执行时间 (延迟秒数或定时时间戳)
    uint8_t force_flag;     // 强制标志 (0:正常 1:强制)
    
    uint16_t crc16;         // CRC校验
    uint8_t rssi;           // RSSI
} remote_control_cmd_t;

远程控制指令Hex样例:

55 AA 0C 00 1A 09 06 68 01 00 01 00 00 00 1E 00 A5 B8 91

解析:

  • 55 AA: 同步字
  • 0C: 包长度(12字节)
  • 00 1A: 目标设备地址26
  • 09: 控制字节(命令帧+ACK请求)
  • 06: 序列号6
  • 68: 远程控制命令
  • 01: 控制动作1(重启)
  • 00: 目标模块0(全部)
  • 01: 执行模式1(延迟)
  • 00 00 00 1E: 延迟30秒执行
  • 00: 正常模式(非强制)
  • A5 B8: CRC16校验
  • 91: RSSI

十二、2.4G协议Hex样例汇总表

12.1 健康数据协议样例

协议类型 命令码 Hex样例 说明
入网请求 0x01 55 AA 0C 00 00 04 01 01 00 7C 12 34 01 02 50 55 A2 B4 85 设备申请入网
心率数据 0x30 55 AA 10 00 00 00 01 01 30 66 B2 F4 A0 4B 55 00 50 02 00 A3 B2 85 心率75bpm2.4G传输
血氧数据 0x34 55 AA 16 00 00 40 01 02 34 66 B2 F4 A0 62 5A 4F 0C 00 55 50 15 20 58 C2 F1 88 血氧98%,增强数据
生命体征组合 0x38 55 AA 12 00 00 40 03 38 66 B2 F4 A0 4B 55 62 5A 50 0C 02 01 03 3C B8 A5 8A 2.4G优化组合数据
SOS紧急报警 0x40 55 AA 1C 00 00 68 FF 40 66 B2 F4 A0 01 05 00 7C 12 34 0A 28 0B 58 4B 62 24 03 50 55 D2 A4 82 紧急SOS最高优先级

12.2 网络管理协议样例

命令类型 命令码 Hex样例 说明
信标帧 0x03 55 AA 08 FF FF 03 01 00 01 02 55 A4 C2 92 网关广播信标
入网响应 0x01 55 AA 0E 80 00 02 01 00 00 01 00 00 02 FF FF FF 00 01 B5 D2 90 分配地址0x0001
保活帧 0x06 55 AA 06 00 00 00 02 06 50 85 A2 B4 88 设备保活电量80%

12.3 网关控制协议样例 (网关主动发起)

命令类型 命令码 Hex样例 说明
时间同步请求 0x64 55 AA 0E FF FF 09 01 64 66 B2 F4 A0 01 C2 00 01 01 C4 F2 88 网关广播时间同步
开始测量指令 0x60 55 AA 10 00 1A 09 02 60 07 00 3C 00 1E 46 02 01 00 7B 03 A8 E5 8C 要求设备26开始测量
数据上报请求 0x62 55 AA 12 00 1A 09 03 62 03 66 B0 00 00 66 B2 F4 A0 01 0A 00 64 02 1E B2 A5 8D 请求历史数据上报
配置更新指令 0x65 55 AA 16 00 1A 09 04 65 02 01 F4 01 00 00 00 00 00 01 08 3C 00 46 02 14 05 00 D4 C8 8F 更新设备配置参数
状态查询指令 0x66 55 AA 0A 00 1A 09 05 66 0F 02 01 01 2C 85 F6 90 查询设备完整状态
远程控制指令 0x68 55 AA 0C 00 1A 09 06 68 01 00 01 00 00 00 1E 00 A5 B8 91 远程重启设备(延迟30秒)
ACK确认 0x02 55 AA 06 00 01 02 FF 00 01 55 C3 A5 85 确认序列号1
信道切换 0x07 55 AA 07 00 01 01 03 07 32 0A 01 D4 B2 8C 切换到信道50

12.4 实时监测协议样例

命令类型 命令码 Hex样例 说明
实时监测开始 0x39 55 AA 10 00 01 08 01 39 03 07 D0 0A 32 02 00 00 00 00 B8 C4 87 开始心率+血氧监测
实时监测停止 0x3A 55 AA 08 00 01 08 02 3A 00 01 00 01 A5 B2 89 停止监测会话1
测量配置 0x3B 55 AA 0E 00 01 08 03 3B 03 01 64 01 00 01 01 02 01 D2 A4 8B 配置传感器参数

12.4 2.4G帧格式详解

2.4G数据帧结构:
+--------+--------+--------+--------+--------+--------+--------+--------+
| SYNC_H | SYNC_L |  LEN   |ADDR_H  |ADDR_L  | CTRL   |  SEQ   |  CMD   |
+--------+--------+--------+--------+--------+--------+--------+--------+
|  0x55  |  0xAA  |   1B   |   1B   |   1B   |   1B   |   1B   |   1B   |
+--------+--------+--------+--------+--------+--------+--------+--------+

+--------+--------+--------+--------+--------+--------+
|           PAYLOAD (可变长度)           | CRC16  | RSSI |
+--------+--------+--------+--------+--------+--------+
|              0-32 bytes              |   2B   |  1B  |
+--------+--------+--------+--------+--------+--------+

12.5 协议解析示例代码

// 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 功能测试用例

  1. 基础通信测试

    • 设备入网流程验证
    • 心跳保活机制测试
    • 数据传输正确性验证
  2. 可靠性测试

    • 断线重连测试
    • 数据重传验证
    • 错误恢复测试
  3. 性能测试

    • 延迟测试
    • 吞吐量测试
    • 并发连接测试
  4. 功耗测试

    • 各模式功耗测量
    • 电池寿命测试
    • 睡眠唤醒测试
  5. 干扰测试

    • 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
作者: 系统设计团队
审核: 技术负责人

注意事项:

  1. 本协议适用于2.4GHz ISM频段需要遵守当地无线电管理规定
  2. 在实际部署前需要进行电磁兼容性测试
  3. 建议定期进行网络性能评估和优化
  4. 关键应用场景建议增加备用通信方案