4. Link Test 会话建立:TCP 连接建立过程、Port 协商、设备 ID 交换

Link Test 会话的建立是 SECS/GEM 通信链路中最基础也最关键的一步。只有成功完成 TCP 连接、Port 协商与设备 ID 交换,后续的 HSMS 消息收发和 GEM 状态机迁移才有物理基础。本章从底层向上,逐步拆解这三个子过程。

4.1 TCP 连接建立过程

HSMS 协议规定,通信双方分为 主动方(Active) 和 被动方(Passive)。主动方发起 TCP 连接请求,被动方监听并接受连接。典型的连接建立时序如下:

  1. 被动方启动监听:被动方在指定 IP 和 Port(默认 5000)上调用 listen(),进入等待状态。
  2. 主动方发起连接:主动方调用 connect() 向被动方 IP:Port 发起 TCP SYN 握手。
  3. 三次握手完成:SYN → SYN+ACK → ACK,TCP 连接建立。
  4. 连接确认:双方套接字进入 ESTABLISHED 状态,准备进行 HSMS 层协商。
工程要点:实际部署中,主动方通常是主机(Host),被动方是设备(Equipment)。但 HSMS 规范允许角色互换,只要双方配置一致即可。
TCP 连接参数速查表
参数 默认值 说明
端口号 5000 HSMS 标准端口,可配置
连接超时 10 秒 主动方等待连接建立的最大时间
重试间隔 5 秒 连接失败后的重试等待时间
最大重试次数 3 次 超过后报告连接失败

4.2 Port 协商机制

TCP 连接建立后,双方立即进入 Port 协商 阶段。Port 协商的目的是确认通信双方使用的 HSMS 端口号是否匹配,以及是否支持相同的协议版本。

协商过程通过交换 Port 协商消息 完成,该消息是 HSMS 控制消息的一种,格式如下:

Message Header:
  Session ID: 0xFFFF (控制消息)
  Header Byte 2: 0x00
  Header Byte 3: 0x00
  PType: 0x00 (控制消息)
  SType: 0x01 (Port 协商)
  System Bytes: 0x00000001

Data:
  Port Number: 0x1388 (5000)
  Protocol Version: 0x01
常见问题:如果双方配置的端口号不一致,或者一方不支持对方声明的协议版本,Port 协商将失败,TCP 连接会被立即关闭。此时需要检查设备端和主机端的端口配置是否一致。

4.3 设备 ID 交换

Port 协商成功后,进入 设备 ID 交换 阶段。设备 ID(Device ID)是 SECS/GEM 通信中用于唯一标识设备的逻辑编号,范围 0–32767。

设备 ID 交换通过 设备 ID 协商消息 完成,该消息同样是 HSMS 控制消息:

Message Header:
  Session ID: 0xFFFF (控制消息)
  Header Byte 2: 0x00
  Header Byte 3: 0x00
  PType: 0x00 (控制消息)
  SType: 0x02 (设备 ID 协商)
  System Bytes: 0x00000002

Data:
  Device ID: 0x000A (10)

设备 ID 交换的规则如下:

  • 主动方 发送自己的设备 ID 给被动方。
  • 被动方 收到后,检查该 ID 是否在允许列表中。
  • 如果 ID 有效,被动方回复确认消息;否则回复拒绝消息并断开连接。
  • 双方设备 ID 可以相同,也可以不同,取决于系统设计。
设备 ID 交换状态表
步骤 发送方 消息类型 内容 接收方响应
1 主动方 设备 ID 请求 Device ID = 10 —
2 被动方 设备 ID 确认 Device ID = 20 接受连接
3 主动方 — — 进入 Link Test 就绪状态

4.4 完整会话建立流程

将上述三个子过程串联起来,得到 Link Test 会话建立的完整流程:

Link Test 会话建立完整流程 被动方启动监听 主动方发起 TCP 连接 三次握手完成 Port 协商 设备 ID 交换 Link Test 就绪 被动方在端口 5000 上 调用 listen() 等待连接 主动方调用 connect() 发起 SYN 握手 交换端口号和协议版本 SType = 0x01 交换设备 ID SType = 0x02

4.5 断连故障定位要点

在实际工程中,Link Test 会话建立阶段的断连故障通常集中在以下三个环节:

  • TCP 连接失败:检查网络连通性、防火墙规则、端口是否被占用。
  • Port 协商失败:确认双方端口号配置一致,协议版本兼容。
  • 设备 ID 交换失败:检查设备 ID 是否在允许列表中,ID 格式是否正确(0–32767)。
故障排查提示:使用 Wireshark 抓包时,过滤条件设置为 tcp.port == 5000,可以快速定位 TCP 连接阶段的问题。如果看到 RST 包,说明 Port 协商或设备 ID 交换失败。

通过以上三个子过程的逐步建立,Link Test 会话得以成功创建,为后续的 Link Test 消息收发和状态监测奠定基础。下一阶段将进入 Link Test 消息的发送与响应机制详解。