RFCOM 节点间通信(ESP-NOW 批量传输)¶
介绍¶
本节文档说明仓库中用于节点间数据通信的 RFCOM 模块。
实现参考:
- 发送端项目:
CODE/AIoTNode-ESPNOW-TX-BATCH - 接收端项目:
CODE/AIoTNode-ESPNOW-RX-BATCH - 核心库:
driver/node_espnow
该通信引擎基于 ESP-NOW,在单帧之上实现了分帧、分块、重组与回调交付,面向中大负载批量数据传输。
架构¶
整体分两层:
node_espnow库层
负责帧协议、分块发送、ACK、重试、会话状态管理与完成回调。- 应用层(
main/AIoTNode.cpp)
负责构造业务/测试负载、选择 QoS 配置、处理发送结果与接收验证。
概念流程:
node_espnow 协议模型¶
库中定义 4 种帧类型:
NODE_FRAME_STARTNODE_FRAME_DATANODE_FRAME_ENDNODE_FRAME_ACK
每帧包含头字段,例如:
transfer_idtotal_lenchunk_idxchunk_totalpayload_lenflags
该模型可稳定承载超过单帧长度的逻辑消息。
QoS 模式¶
库支持三种 QoS:
NODE_ESPNOW_QOS0
近似无确认发送,发送完数据与结束帧后完成会话。NODE_ESPNOW_QOS1
基于 ACK 的分块可靠传输。NODE_ESPNOW_QOS2
在接收侧增加已完成传输缓存,抑制重复 START 导致的重复交付。
关键运行行为¶
- 发送侧
- 按
chunk_payload_bytes对负载分块 - 用
tx_window_size控制窗口 - 按
ack_timeout_ms与max_retries做重试 - 接收侧
- 以 peer +
transfer_id维护重组会话 - 用位图跟踪 chunk 到达
- 满足 END + 全部分块后触发完整回调
- 会话安全
- 按
session_timeout_ms清理超时会话 - 自动释放 TX/RX 动态内存
TX/RX 主程序中的实现方式¶
两个 AIoTNode.cpp 都遵循同一模式:
- 系统与硬件初始化。
- 以默认配置构造
node_espnow_config_t。 - 配置分块、窗口、超时、重试、最大批量。
- 调用
node_espnow_init(...)。 - 注册接收完整批次回调。
- 进入周期通信逻辑。
发送端工程还实现了:
- 先广播发现请求,再锁定目标 MAC 的单播传输。
- 多类型载荷阶段验证(数组、中等负载、字符串、结构体、原始字节、大向量)。
QOS0 -> QOS1 -> QOS2轮次化测试。
接收端工程还实现了:
- 发现响应。
- 按 case 做数据校验与矩阵汇总。
适用场景¶
RFCOM 模块适用于:
- 节点间结构化遥测数据交换
- 采样数组的批量传输
- 噪声链路下的可靠二进制数据传输
- 联调阶段的分层通信验证
依赖关系¶
本模块主要依赖:
esp_wifiesp_nowesp_eventesp_netifesp_timer- FreeRTOS queue/task