3. 通信建立与初始化:HSMS连接建立、Select/Communicate状态、Linktest机制

在SECS/GEM协议栈中,通信建立与初始化是设备与主机(Host)之间建立可靠会话的第一步。本章聚焦于HSMS(High-Speed SECS Message Services)连接的生命周期管理,包括TCP/IP连接建立、Select/Communicate状态机转换以及Linktest心跳机制。理解这些底层交互是后续进行日志解析和状态机调试的基础。

3.1 HSMS连接建立流程

HSMS定义了两种连接模式:主动模式(Active Mode)和被动模式(Passive Mode)。设备通常作为主动端发起连接,主机作为被动端监听。连接建立分为三个核心阶段:TCP连接、控制消息交换、会话激活。

工程要点:在实际联调中,80%的通信失败问题源于TCP端口不通或防火墙拦截。建议在设备端使用 telnet host_ip 5000 测试主机端口可达性。
HSMS连接建立步骤清单:
  1. TCP三次握手:设备(主动端)向主机(被动端)的指定端口(默认5000)发起TCP连接。
  2. 发送Select.req:TCP连接建立后,设备立即发送HSMS Select.req消息,请求建立控制会话。
  3. 接收Select.rsp:主机回复Select.rsp,携带通信状态(COMMUNICATING或NOT COMMUNICATING)。
  4. 会话激活:若Select.rsp状态为COMMUNICATING,则HSMS会话正式建立,可以开始收发SECS-II消息。
HSMS连接建立时序图 设备(主动端) 主机(被动端) ① TCP三次握手(端口5000) ② Select.req(请求控制会话) ③ Select.rsp(COMMUNICATING) 会话激活 会话激活 ④ 开始收发SECS-II消息 注意:Select.rsp中的COMMUNICATING状态是会话建立的唯一标志

3.2 Select/Communicate状态机

HSMS状态机定义了设备与主机之间的通信状态。核心状态包括:NOT CONNECTED、CONNECTED、NOT COMMUNICATING、COMMUNICATING。Select过程是状态转换的关键触发事件。

状态名称 描述 触发条件 可操作行为
NOT CONNECTED TCP连接未建立 初始状态或连接断开 等待连接请求
CONNECTED TCP连接已建立,但未完成Select TCP三次握手成功 只能发送Select.req
NOT COMMUNICATING Select完成但通信异常 Select.rsp返回NOT COMMUNICATING 重试Select或断开重连
COMMUNICATING 正常通信状态 Select.rsp返回COMMUNICATING 收发SECS-II消息、Linktest
常见陷阱:部分设备在TCP连接建立后立即发送SECS-II消息,跳过Select过程。这会导致主机丢弃消息并断开连接。务必遵循“先Select,后通信”的协议顺序。
HSMS Select/Communicate状态机 NOT CONNECTED TCP未连接 CONNECTED TCP已连接,未Select NOT COMMUNICATING Select失败 COMMUNICATING 正常通信 TCP连接 Select.rsp(NOT_COMM) Select.rsp(COMM) 重试Select 连接断开 只有COMMUNICATING状态允许收发SECS-II消息

3.3 Linktest机制

Linktest是HSMS定义的心跳检测机制,用于验证通信链路在空闲状态下的健康性。设备或主机可以定期发送Linktest.req消息,对方必须回复Linktest.rsp。如果连续多次未收到响应,则判定连接断开并触发重连。

Linktest关键参数:
  • 发送间隔:通常为10~30秒,由设备配置决定。
  • 超时次数:连续3次未收到Linktest.rsp视为连接断开。
  • 触发动作:断开TCP连接,重新执行Select流程。
  • 日志特征:Linktest.req的消息ID通常为0x0000,Linktest.rsp为0x0001。
Linktest心跳机制流程图 设备 主机 Linktest.req(每10~30秒) Linktest.rsp(立即回复) 超时计数器+1 无响应 连续3次超时 → 断开连接 工程建议:Linktest间隔设为15秒,超时次数设为3次,兼顾实时性与网络波动容忍度

3.4 日志解析实战:通信建立阶段

在实际联调中,通信建立阶段的日志是排查问题的第一手资料。以下是一个典型的HSMS连接建立日志片段,包含TCP连接、Select和Linktest交互。

2025-03-20 10:00:01.123 [INFO] HSMS: TCP connection established to 192.168.1.100:5000
2025-03-20 10:00:01.124 [INFO] HSMS: Sending Select.req (Message ID: 0x0001)
2025-03-20 10:00:01.150 [INFO] HSMS: Received Select.rsp (Message ID: 0x0001, Status: COMMUNICATING)
2025-03-20 10:00:01.151 [INFO] HSMS: Session established, entering COMMUNICATING state
2025-03-20 10:00:15.000 [DEBUG] HSMS: Sending Linktest.req (Message ID: 0x0002)
2025-03-20 10:00:15.010 [DEBUG] HSMS: Received Linktest.rsp (Message ID: 0x0002)
2025-03-20 10:00:30.000 [DEBUG] HSMS: Sending Linktest.req (Message ID: 0x0003)
2025-03-20 10:00:30.012 [DEBUG] HSMS: Received Linktest.rsp (Message ID: 0x0003)
日志解析要点:
  • 关注 Status: COMMUNICATING 关键字,确认Select成功。
  • Linktest的发送间隔应稳定,若间隔波动超过50%则可能存在网络延迟。
  • 如果日志中出现 Select.rsp (Status: NOT COMMUNICATING),检查设备是否已注册或主机配置是否正确。

3.5 常见问题与排查方法

问题现象 可能原因 排查方法
TCP连接失败 端口不通、防火墙拦截、主机未启动 使用 telnet 测试端口;检查主机服务状态
Select.rsp返回NOT COMMUNICATING 设备未注册、主机拒绝连接 检查设备ID配置;查看主机日志确认拒绝原因
Linktest连续超时 网络不稳定、主机负载过高 增加超时次数;检查网络丢包率;优化主机处理能力
通信建立后立即断开 Select后未等待Linktest即发送数据 确认协议顺序;检查设备状态机实现
避坑指南:部分老旧设备在Select成功后不发送Linktest,导致主机误判连接断开。建议在设备端强制启用Linktest,或与主机协商关闭Linktest检查。