3、HSMS协议详解:HSMS连接建立与断开、HSMS消息传输机制、会话层与传输层、HSMS状态机

HSMS(High-Speed SECS Message Services)是 SEMI E37 标准定义的基于 TCP/IP 的通信协议,用于替代传统的 RS-232 串行 SECS-I 协议。HSMS 在传输层使用 TCP 保证可靠连接,在会话层定义了消息的封装、传输与状态管理机制。本章将深入解析 HSMS 的连接生命周期、消息帧结构、分层模型以及核心状态机。

3.1 HSMS 协议分层模型

HSMS 协议栈位于 TCP/IP 之上,属于应用层与传输层之间的会话层协议。其分层结构如下表所示:

OSI 层 HSMS 对应组件 功能描述
应用层 SECS-II 消息 (Stream/Function) 设备控制、数据收集、报警管理等业务逻辑
会话层 HSMS 会话管理 连接建立/断开、消息分帧、超时控制、状态机
传输层 TCP 可靠字节流传输、拥塞控制、端口绑定 (默认 5000)
网络层 IP 路由寻址、网络层封装
关键点: HSMS 不负责数据的可靠传输(由 TCP 保证),而是专注于会话管理——即何时建立连接、如何标识消息边界、如何检测连接异常并恢复。

3.1.1 会话层与传输层的职责划分

  • 传输层 (TCP): 提供面向连接的、可靠的字节流管道。HSMS 实体通过 TCP Socket 发送和接收连续的字节序列,TCP 保证数据不丢失、不重复、按序到达。
  • 会话层 (HSMS): 在 TCP 字节流之上定义消息边界(通过消息长度字段),管理连接状态(Not Connected / Connected / Selected),处理心跳保活(Linktest),以及控制消息的发送与接收时序。
实践提示: 在测试 HSMS 通信时,TCP 连接正常(Socket 已连接)并不代表 HSMS 会话可用。必须等待 HSMS 状态机进入 Selected 状态后,才能传输 SECS-II 业务消息。

3.2 HSMS 消息传输机制

HSMS 消息在 TCP 字节流中以 消息帧 的形式传输。每个消息帧包含一个固定长度的消息头(Header)和可选的正文(Data)。

3.2.1 HSMS 消息帧结构

HSMS 消息帧由 消息长度(4 字节,大端序)和 消息头(10 字节)以及 数据块(0~N 字节)组成。消息长度字段的值等于消息头长度(10)加上数据块长度。

+----------------+----------------+------------------+
|  消息长度 (4B)  |  消息头 (10B)   |  数据块 (0~N B)  |
+----------------+----------------+------------------+
| 长度 = 10 + N  |  固定 10 字节   |  SECS-II 消息体  |
+----------------+----------------+------------------+

3.2.2 消息头字段详解

偏移 (字节) 字段名 长度 说明
0 Device ID 2 设备标识符,低 15 位有效,bit15 为控制位 (0=正常, 1=控制消息)
2 Stream 1 SECS-II Stream 编号 (0x00 表示控制消息)
3 Function 1 SECS-II Function 编号,bit7 为 W-bit (需要回复)
4 PType 1 处理类型 (0x00 为标准 SECS-II)
5 SType 1 会话类型 (0x00=数据消息, 0x01=Select.req, 0x02=Select.rsp, 0x05=Deselect.req, 0x06=Deselect.rsp, 0x09=Linktest.req, 0x0A=Linktest.rsp, 0x11=Separate.req)
6 System Bytes 4 系统字节,用于消息配对与超时检测
常见错误: 消息长度字段计算错误是 HSMS 通信失败的常见原因。长度值必须等于 10 + 数据块长度,且使用大端序(网络字节序)编码。如果长度字段与真实数据不匹配,接收方将无法正确解析消息边界,导致连接断开。

3.2.3 消息传输流程

  1. 发送方: 构造消息头和数据块 → 计算总长度 → 按大端序写入长度字段 → 将长度 + 消息头 + 数据块写入 TCP Socket。
  2. 接收方: 从 TCP Socket 读取 4 字节 → 解析消息长度 L → 继续读取 L 字节 → 解析消息头和数据块 → 根据 SType 分发处理。

3.3 HSMS 连接建立与断开

HSMS 连接的生命周期包括 主动建立、被动接受、会话选择 和 有序断开 四个阶段。

3.3.1 连接建立流程

HSMS 实体通常分为主动方(Active)和被动方(Passive)。主动方发起 TCP 连接,被动方监听端口。TCP 连接建立后,双方通过 Select.req / Select.rsp 消息完成会话选择,进入可通信状态。

HSMS 连接建立与断开流程 主动方 (Active) 被动方 (Passive) Not Connected Not Connected ① TCP Connect (端口 5000) ② TCP ACK (Connected) Connected Connected ③ Select.req (SType=0x01) ④ Select.rsp (SType=0x02, 状态=成功) Selected Selected ⑤ Separate.req (SType=0x11) Not Connected Not Connected

3.3.2 连接断开方式

断开方式 触发条件 行为描述
正常断开 (Orderly) 发送 Separate.req 消息 双方交换 Separate.req 后关闭 TCP Socket,状态回到 Not Connected
异常断开 (Abortive) TCP RST、超时、协议错误 直接关闭 Socket,不发送 Separate.req,对端通过 Linktest 超时检测到断开
被动断开 (Passive) 被动方关闭监听或主动方超时重试失败 由 TCP 层通知连接断开,HSMS 状态机复位
最佳实践: 在设备软件中,断开连接前应始终发送 Separate.req 消息,以便对端能够有序释放资源并记录日志。异常断开会导致对端在 Linktest 超时(通常 T3 定时器)后才能检测到连接丢失,增加恢复延迟。

3.4 HSMS 状态机详解

HSMS 状态机定义了通信会话的三种核心状态:Not Connected、Connected 和 Selected。状态转换由 TCP 事件和 HSMS 控制消息驱动。

3.4.1 状态定义与转换表

当前状态 事件 动作 下一状态
Not Connected TCP 连接建立 (主动/被动) 初始化 HSMS 会话,等待 Select Connected
Not Connected 收到任何 HSMS 消息 忽略或发送 Separate.req Not Connected
Connected 发送 Select.req 启动 T3 定时器,等待 Select.rsp Connected
Connected 收到 Select.rsp (成功) 停止 T3,标记会话为 Selected Selected
Connected 收到 Select.rsp (失败) 停止 T3,可重试或断开 Connected
Connected 收到 Separate.req 发送 Separate.rsp,关闭 TCP Not Connected
Connected TCP 断开 清理会话,复位状态 Not Connected
Selected 发送/接收 SECS-II 数据消息 正常业务通信 Selected
Selected 收到 Separate.req 发送 Separate.rsp,关闭 TCP Not Connected
Selected Linktest 超时 (T3) 发送 Linktest.req,重试超时则断开 Connected 或 Not Connected
Selected TCP 断开 清理会话,复位状态 Not Connected

3.4.2 状态机 SVG 图

HSMS 状态机 (Not Connected / Connected / Selected) Not Connected 初始状态 Connected TCP 已连接 Selected 会话已选择 TCP 连接 TCP 断开 / Separate Select 成功 Deselect / Linktest 失败 TCP 断开 / Separate

3.4.3 状态机关键定时器

定时器 默认值 用途 超时处理
T3 (Reply Timeout) 45 秒 等待 Select.rsp / Linktest.rsp / 数据消息回复 重试或断开连接
T5 (Connect Separation Time) 10 秒 断开后禁止重连的时间窗口 等待 T5 超时后允许重新连接
T6 (Control Timeout) 5 秒 等待控制消息 (Select/Linktest) 回复 断开连接
T8 (Network Intercharacter Timeout) 5 秒 接收消息时字节间最大间隔 断开连接
故障排查要点: 如果 HSMS 连接频繁在 Connected 状态无法进入 Selected,请检查:
1. 主动方是否发送了 Select.req(SType=0x01)?
2. 被动方是否回复了 Select.rsp(SType=0x02)且状态字节为 0x00(成功)?
3. T3 定时器是否设置过短,导致 Select.rsp 在超时后才到达?
4. Device ID 是否匹配?如果 Device ID 不一致,Select.rsp 会返回失败状态。

3.5 HSMS 消息类型与 SType 对照

SType (十六进制) 消息名称 方向 说明
0x00 Data Message 双向 携带 SECS-II 业务数据
0x01 Select.req 主动→被动 请求建立会话选择
0x02 Select.rsp 被动→主动 响应会话选择请求
0x05 Deselect.req 双向 请求取消会话选择
0x06 Deselect.rsp 双向 响应取消会话选择
0x09 Linktest.req 双向 连接保活探测请求
0x0A Linktest.rsp 双向 连接保活探测响应
0x11 Separate.req 双向 请求断开 HSMS 会话

3.6 常见故障与排查方法

案例 1:连接建立后无法进入 Selected 状态
现象:TCP 连接成功,但 Select.req 无响应或 Select.rsp 返回失败。
排查步骤:
1. 使用 Wireshark 抓包,过滤 TCP 端口 5000,检查 Select.req 是否发出。
2. 检查 Select.rsp 的状态字节:0x00=成功,0x01=Device ID 不匹配,0x02=连接已存在,0x03=其他错误。
3. 确认被动方是否已调用 HSMS 会话初始化接口,并处于监听状态。
案例 2:通信过程中频繁断开
现象:Selected 状态下,设备间歇性断开连接,日志显示 Linktest 超时。
排查步骤:
1. 检查网络延迟和丢包率,TCP 重传可能导致 Linktest.req 超时。
2. 增大 T3 定时器值(如从 45 秒调整为 60 秒),观察是否改善。
3. 确认双方 T3 值配置一致,避免一端超时断开而另一端仍在等待。
案例 3:消息解析错误导致连接断开
现象:收到消息后立即断开,日志提示“Invalid Message Length”或“Header CRC Error”。
排查步骤:
1. 检查消息长度字段是否为大端序编码,且值等于 10 + 数据块长度。
2. 确认消息头中的 SType 字段是否在有效范围内(0x00~0x11)。
3. 检查数据块是否包含非 ASCII 字符或格式错误的 SECS-II 数据项。

3.7 本章小结

  • HSMS 协议基于 TCP/IP,在会话层管理连接状态和消息边界。
  • 消息帧由 4 字节长度 + 10 字节消息头 + 可变长度数据块组成。
  • 状态机包含 Not Connected、Connected、Selected 三种状态,转换由 TCP 事件和 HSMS 控制消息驱动。
  • 连接建立需要经过 TCP 连接 → Select.req → Select.rsp 流程,断开时推荐使用 Separate.req 有序释放。
  • 定时器 T3、T5、T6、T8 是保障 HSMS 通信稳定性的关键参数,需根据网络环境合理配置。