3、HSMS协议详解:HSMS连接建立(Select/Connect)、心跳机制(Separate/Test)、通信状态机(Not Selected/Selected/Connected)

HSMS(High-Speed SECS Message Services)是SECS/GEM协议族中基于TCP/IP的传输层协议。与RS-232时代的SECS-I不同,HSMS利用标准以太网基础设施,提供更高吞吐量和更灵活的连接管理。本章深入剖析HSMS的核心机制:连接建立、心跳保活以及状态机转换,帮助学员从日志中快速定位通信故障。

3.1 HSMS协议栈与报文结构

HSMS位于OSI模型的传输层(TCP)之上,直接承载SECS-II消息。其报文格式固定,由报文头和可选的文本块组成。

字段 长度(字节) 说明
Length 4 后续报文的总长度(包含Header + Data),大端序
Header 10 固定10字节,包含Session ID、Message Type等
Data 0~N SECS-II消息体(仅Data Message携带)

报文头(Header)结构如下:

偏移 字段 长度 说明
0 Session ID 2 设备ID(Device ID),控制消息时为0xFFFF
2 Header Byte 2 1 保留位或控制码
3 Message Type 1 0x01=Data Message, 0x05=Select.req, 0x06=Select.rsp, 0x09=Separate.req, 0x0A=Test.req, 0x0B=Test.rsp
4 Transaction ID 4 事务ID,用于请求-响应配对
8 Header Byte 8 1 P/Bit + 其他标志位
9 Header Byte 9 1 等待位(W-Bit)等
日志分析要点: 在Wireshark或设备日志中,HSMS报文通常以 Length + Header 的十六进制转储出现。识别 Message Type 字段是区分控制消息(Select/Test/Separate)与数据消息(SECS-II)的关键。

3.2 HSMS连接建立:Select/Connect流程

HSMS连接建立分为两个层次:TCP连接建立(三次握手)和 HSMS逻辑连接建立(Select事务)。只有两者都完成,通信状态机才会进入 Selected 状态。

3.2.1 完整建立流程

  1. TCP连接:主动方(通常是Host)向被动方(Equipment)的指定端口(默认5000)发起TCP SYN。
  2. Select.req:TCP连接建立后,主动方发送HSMS Select请求(Message Type = 0x05)。
  3. Select.rsp:被动方回复Select响应(Message Type = 0x06),携带状态码。
  4. 状态转换:双方收到成功的Select.rsp后,通信状态从 Not Selected 转为 Selected。
Select.rsp 状态码:
  • 0x00:成功(Success)
  • 0x01:连接已存在(Already Connected)
  • 0x02:连接未就绪(Not Ready)
  • 0x03:拒绝(Refused)
HSMS连接建立时序图(Select流程) Host(主动方) Equipment(被动方) ① TCP SYN(端口5000) ② TCP SYN-ACK ③ TCP ACK(连接建立) TCP连接已建立,状态:Not Selected ④ Select.req(Message Type=0x05) ⑤ Select.rsp(Message Type=0x06, 状态码=0x00) 状态转换:Not Selected → Selected
常见故障:Select超时
如果Host发送Select.req后未收到Select.rsp(通常超时时间为10秒),日志中会出现 HSMS Select Timeout 或 T3 timeout 错误。此时应检查:
1. Equipment的HSMS服务是否已启动(端口监听状态)。
2. 防火墙是否阻挡了TCP 5000端口。
3. 网络延迟是否超过T3定时器设定值。

3.3 心跳机制:Test与Separate

HSMS通过 Test 消息实现心跳保活,通过 Separate 消息实现优雅断开。这两种机制确保通信双方能及时感知连接状态。

3.3.1 Test消息(心跳)

Test消息用于验证连接是否仍然存活。主动方(通常是Host)定期发送Test.req,被动方回复Test.rsp。

消息类型 Message Type 方向 说明
Test.req 0x0A Host → Equipment 心跳请求,携带Transaction ID
Test.rsp 0x0B Equipment → Host 心跳响应,Transaction ID与请求一致
心跳间隔配置:
HSMS规范未强制规定心跳间隔,但通常建议为 10~30秒。在设备端(Equipment)可通过参数 S1F13 或 MDLN 查询当前心跳设置。如果连续多次Test无响应,主动方应主动断开TCP连接并尝试重连。

3.3.2 Separate消息(断开)

Separate消息用于通信双方中的任一方主动要求断开HSMS逻辑连接。发送Separate.req后,双方状态机回到 Not Selected,但TCP连接可能保持(取决于实现)。

  • Separate.req(Message Type = 0x09):发送方通知对方即将断开。
  • 无响应消息:Separate.req不需要回复,属于“发后即忘”类型。
  • 典型场景:设备关机前、Host应用关闭前、通信异常恢复策略中。
HSMS心跳与断开机制 Host Equipment Test.req (每10~30秒) Test.rsp 连续N次Test无响应 → 判定连接断开 Separate.req(主动断开,无回复) 状态转换:Selected → Not Selected

3.4 HSMS通信状态机

HSMS定义了三种核心通信状态,所有消息收发都受状态机约束。理解状态转换是分析日志中“消息被丢弃”或“连接拒绝”问题的前提。

3.4.1 状态定义

状态 含义 允许的操作
Not Selected TCP已连接,但HSMS逻辑连接未建立 仅允许发送/接收 Select.req / Select.rsp
Selected HSMS逻辑连接已建立,可进行正常通信 允许发送/接收 Data Message、Test.req/rsp、Separate.req
Connected TCP连接已建立(包含Not Selected和Selected的子状态) TCP层面已连通,但HSMS状态取决于是否Selected
注意: “Connected” 在HSMS规范中通常指TCP连接已建立,但HSMS状态机主要区分 Not Selected 和 Selected。日志中常见的 HSMS State: Connected 仅表示TCP连通,不等于可以收发SECS-II消息。

3.4.2 状态转换图

HSMS通信状态机 TCP Closed TCP连接建立 Not Selected 仅允许Select消息 Select.req/rsp 成功 Selected 允许所有消息 Separate.req TCP断开 关键规则: 在Not Selected状态下发送Data Message → 对方丢弃或回复Separate;在Selected状态下收到Select.req → 回复Already Connected

3.5 日志分析实战:常见HSMS问题定位

以下列举三个典型HSMS通信故障场景,结合日志片段进行问题定位。

3.5.1 场景一:Select被拒绝

2025-01-15 10:23:45.123 [HSMS] Sent Select.req (SessionID=0xFFFF, TID=0x0001)
2025-01-15 10:23:45.150 [HSMS] Received Select.rsp (SessionID=0xFFFF, TID=0x0001, Status=0x03)
2025-01-15 10:23:45.150 [HSMS] Select failed: Refused (0x03)
2025-01-15 10:23:45.150 [HSMS] State remains: Not Selected

分析: Equipment返回状态码0x03(Refused),表示设备拒绝建立HSMS连接。常见原因:

  • 设备尚未完成初始化(仍在启动过程中)。
  • 设备已达到最大连接数限制。
  • 设备配置了白名单,Host的IP地址不在允许列表中。

3.5.2 场景二:心跳超时导致断开

2025-01-15 11:00:00.000 [HSMS] Sent Test.req (TID=0x00A0)
2025-01-15 11:00:05.000 [HSMS] T3 timeout waiting for Test.rsp (TID=0x00A0)
2025-01-15 11:00:05.000 [HSMS] Retry count: 1/3
2025-01-15 11:00:10.000 [HSMS] T3 timeout waiting for Test.rsp (TID=0x00A0)
2025-01-15 11:00:10.000 [HSMS] Retry count: 2/3
2025-01-15 11:00:15.000 [HSMS] T3 timeout waiting for Test.rsp (TID=0x00A0)
2025-01-15 11:00:15.000 [HSMS] Retry count: 3/3
2025-01-15 11:00:15.000 [HSMS] Max retries reached. Disconnecting...
2025-01-15 11:00:15.001 [HSMS] Sent Separate.req
2025-01-15 11:00:15.001 [HSMS] TCP connection closed

分析: Host连续3次Test.req均未收到响应,触发T3超时重试机制。达到最大重试次数后,Host主动发送Separate.req并关闭TCP连接。可能原因:

  • Equipment端HSMS进程挂死或CPU满载。
  • 网络链路中断(网线松动、交换机故障)。
  • Equipment的Test响应处理存在bug。

3.5.3 场景三:在Not Selected状态下发送数据

2025-01-15 12:00:00.000 [HSMS] State: Not Selected
2025-01-15 12:00:00.001 [HSMS] Attempting to send Data Message (S1F1)
2025-01-15 12:00:00.001 [HSMS] ERROR: Cannot send data in Not Selected state
2025-01-15 12:00:00.001 [HSMS] Message discarded

分析: 应用层在HSMS未完成Select流程时尝试发送SECS-II数据消息,被HSMS层拒绝。这是典型的 时序错误,常见于:

  • Host应用启动后立即发送数据,未等待Select完成回调。
  • 设备在收到Separate后未通知上层应用,导致应用继续发送数据。
定位建议: 在日志中搜索 HSMS State 关键字,确认消息发送时的状态。如果状态为 Not Selected,则所有数据消息都会被丢弃。解决方案:确保应用层在收到 Selected 状态通知后再发送数据。

3.6 本章小结

  • HSMS连接建立需要TCP握手 + Select事务两步,缺一不可。
  • Test消息是心跳保活的核心,超时重试机制防止误判。
  • Separate消息用于优雅断开,无需回复。
  • 状态机 Not Selected 和 Selected 决定了哪些消息可以收发。
  • 日志分析时,重点关注 Message Type、Status Code、T3 timeout 和 State 关键字。