ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

双链路 TCP 架构:一主多从设备群的分组控制设计

双链路 TCP 架构:一主多从设备群的分组控制设计

引言

无人机编队表演、工业机器人编排、分布式采集阵列 —— 这些场景有一个共同特征:现场有一组同质的嵌入式设备,运行期需要能自由组队、动态指定主从角色,并由上位机统一调度。把这类需求拆开,看到的是两个角色完全不同却又必须共存的事情:

编排通讯:地面控制端(上位机、调度终端)对设备群整体下发指令、读取状态、推送升级,关系是一控多设;谁都可以被独立选中、被单独询问。

分组数据分发:设备群内部选出一台做主设备,向同组内其他从设备实时广播数据,关系是一主多从;主从身份可以根据任务被动态切换。

两件事都走 TCP,但端口、角色、生命周期全都不同。本文给出的方案把它们拆成 两条独立链路 —— 一条用于编排通讯,一条用于一主多从的数据分发 —— 让嵌入式设备既能自由组队、又能保证控制通道“永不断”。接下来将围绕整体架构、模块职责、关键设计决策与协议规划展开。

一、整体架构

系统里存在两条互相独立的 TCP 链路,角色不同、端口不同、生命周期不同。

1.1 数据链路(Data Link):一主多从

  • 主设备(Master Device):数据链路里的 TCP 服务器端,监听端口
  • TCP_CTRL_POAT = 1024(应用层自定义,与控制链路端口号不同)。主设备最多可接入 多少个从设备,可由配置参数控制。
  • 从设备(Slave Device):数据链路里的 TCP 客户端,主动连接主设备。
  • 数据流向:主设备 → 所有从设备(分发实时业务数据)

1.2 控制链路(Control Link):一控多设

  • 控制端(Controller,上位机):控制链路里的 TCP 服务器端,监听端口 TCP_CTRL_POAT = 1025。
  • 所有设备(主设备 + 全部从设备):控制链路里的 TCP 客户端,均主动连接控制端。
  • 控制端下发命令,设备侧用 ACK 包回执、按需主动上报结果。

一台设备同时持有两个 socket:一个作为控制链路的客户端连接控制端,另一个按身份选择 —— 主设备开 server 端口接从设备,或从设备作为 client 连接主设备。两条链路相互解耦,一条链路挂掉不影响另一条。

1.3 控制链路与数据链路解耦

在控制链路与数据链路中,创建一个新角色-----协调者(TCP Coordinator)。收到控制端命令后,由TCP Coordinator销毁数据链路中旧角色,再创建新角色。

1.3.1 数据链路角色主变从命令

1.3.2 数据链路角色从变主命令

1.3.3 数据链路角色从设备连接新主设备命令

1.4 协议分层

应用层在裸 TCP 字节流之上定义了统一的包结构:

+-----------------+--------------+--------------+--------------+------------------+-----------+
|Pkg_Header|Pkg_Type | Data_Len | Pkg_Num | Raw_Data |Pkg_Tail|
+-----------------+--------------+--------------+--------------+------------------+-----------+
2B1B4B2B Data_Len2B
总长度 = 11 + Data_Len

数据链路与控制链路使用差异化的包头包尾,即使误连到对方端口,解析也会立刻失败,不会把包错传上业务层。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进