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 消息传输流程
- 发送方: 构造消息头和数据块 → 计算总长度 → 按大端序写入长度字段 → 将长度 + 消息头 + 数据块写入 TCP Socket。
- 接收方: 从 TCP Socket 读取 4 字节 → 解析消息长度 L → 继续读取 L 字节 → 解析消息头和数据块 → 根据 SType 分发处理。
3.3 HSMS 连接建立与断开
HSMS 连接的生命周期包括 主动建立、被动接受、会话选择 和 有序断开 四个阶段。
3.3.1 连接建立流程
HSMS 实体通常分为主动方(Active)和被动方(Passive)。主动方发起 TCP 连接,被动方监听端口。TCP 连接建立后,双方通过 Select.req / Select.rsp 消息完成会话选择,进入可通信状态。
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 图
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 会返回失败状态。
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 会话初始化接口,并处于监听状态。
现象: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 值配置一致,避免一端超时断开而另一端仍在等待。
现象: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 数据项。
现象:收到消息后立即断开,日志提示“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 通信稳定性的关键参数,需根据网络环境合理配置。