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)等 |
Length + Header 的十六进制转储出现。识别 Message Type 字段是区分控制消息(Select/Test/Separate)与数据消息(SECS-II)的关键。
3.2 HSMS连接建立:Select/Connect流程
HSMS连接建立分为两个层次:TCP连接建立(三次握手)和 HSMS逻辑连接建立(Select事务)。只有两者都完成,通信状态机才会进入 Selected 状态。
3.2.1 完整建立流程
- TCP连接:主动方(通常是Host)向被动方(Equipment)的指定端口(默认5000)发起TCP SYN。
- Select.req:TCP连接建立后,主动方发送HSMS Select请求(Message Type = 0x05)。
- Select.rsp:被动方回复Select响应(Message Type = 0x06),携带状态码。
- 状态转换:双方收到成功的Select.rsp后,通信状态从 Not Selected 转为 Selected。
- 0x00:成功(Success)
- 0x01:连接已存在(Already Connected)
- 0x02:连接未就绪(Not Ready)
- 0x03:拒绝(Refused)
如果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应用关闭前、通信异常恢复策略中。
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 |
HSMS State: Connected 仅表示TCP连通,不等于可以收发SECS-II消息。
3.4.2 状态转换图
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关键字。