3. HSMS 消息类型详解

HSMS(High-Speed SECS Message Services)定义了五种控制消息,用于建立、维护和终止设备与主机之间的逻辑连接。理解这些消息的格式、触发条件和响应行为,是配置会话超时与链路恢复参数的基础。本节逐一拆解 Select.req/rsp、Deselect.req/rsp、Linktest.req/rsp 和 Separate.req 的结构与交互流程。

3.1 Select.req / Select.rsp — 会话建立

Select.req 是设备或主机主动发起的会话建立请求,用于将 TCP 连接从“未选择”状态提升为“已选择”状态。只有处于已选择状态的连接才能传输 SECS 数据消息。

消息格式

字段长度(字节)说明
Message Length4固定为 10(不含自身)
Session ID2设备 ID,通常为 0
Header Byte 010x01(Select.req)/ 0x02(Select.rsp)
Header Byte 110x00
P/B Type10x00(控制消息)
System Bytes4事务 ID,用于请求-响应匹配

Select.rsp 响应码

响应码含义处理建议
0x00成功(已选择)正常通信开始
0x01连接已存在无需重复 Select
0x02连接未就绪检查 T3 超时或网络状态
0x03拒绝(资源不足)检查设备连接数上限
关键点:Select.req 必须在 TCP 连接建立后的 T5(连接响应超时)时间内发送,否则对端会主动关闭连接。Select.rsp 中的 System Bytes 必须与请求一致,否则视为无效响应。
Select.req / Select.rsp 交互流程 主机 (Host) 设备 (Equipment) Select.req (System=0x1234) Select.rsp (System=0x1234, 响应码=0x00) TCP 连接 → 未选择 → Select.req → 已选择 → 数据通信 ⚠ T5 超时约束 TCP 建立后 T5 秒内未收到 Select.req → 连接被关闭

3.2 Deselect.req / Deselect.rsp — 会话释放

Deselect.req 用于主动将连接从“已选择”状态降级为“未选择”状态。释放后,该 TCP 连接不再传输 SECS 数据消息,但 TCP 连接本身可能保持(取决于实现)。

触发场景

  • 正常关机流程:设备在断电前发送 Deselect.req,通知主机释放会话。
  • 链路切换:多链路冗余场景下,主动释放当前链路以切换到备用链路。
  • 资源回收:主机检测到设备长时间空闲,主动释放会话以节省连接资源。

Deselect.rsp 响应码

响应码含义
0x00成功(已释放)
0x01连接未选择(无需释放)
0x02拒绝(正在处理其他事务)
实践建议:Deselect 操作不会关闭 TCP 连接。如果需要完全断开,应在 Deselect 之后发送 Separate.req 或直接关闭 Socket。在链路恢复参数配置中,Deselect 通常作为“优雅降级”的第一步。

3.3 Linktest.req / Linktest.rsp — 链路保活

Linktest.req 是 HSMS 的链路保活机制,用于检测 TCP 连接是否仍然存活且通信正常。设备或主机在空闲期间定期发送 Linktest.req,对端必须在 T3(回复超时) 时间内回复 Linktest.rsp。

消息特点

  • 无数据负载:仅包含 HSMS 头部,不携带 SECS 数据。
  • System Bytes 递增:每次 Linktest.req 使用递增的 System Bytes,用于检测响应匹配。
  • 响应码固定为 0x00:Linktest.rsp 的响应码始终为成功,否则视为协议错误。

超时与重试策略

参数默认值说明
T6(链路测试间隔)45 秒两次 Linktest.req 之间的最大间隔
T3(回复超时)45 秒发送 Linktest.req 后等待 Linktest.rsp 的最大时间
重试次数3 次T3 超时后重试 Linktest.req 的次数
⚠ 常见问题:如果 T6 配置过小(如 < 10 秒),会导致网络中出现大量 Linktest 消息,增加 CPU 和带宽开销。如果 T6 配置过大(如 > 120 秒),则无法及时发现链路中断,影响链路恢复的时效性。建议 T6 与 T3 保持相同值(如 45 秒),简化超时管理。
Linktest 超时与重试流程 主机 设备 Linktest.req (System=0x0001) Linktest.rsp (System=0x0001) Linktest.req (System=0x0002) — 无响应 T3 超时(45 秒) 重试 1:Linktest.req (System=0x0003) 重试 2:Linktest.req (System=0x0004) 重试 3:Linktest.req (System=0x0005) 链路中断 → 触发链路恢复

3.4 Separate.req — 连接终止

Separate.req 是 HSMS 中唯一不需要响应的控制消息(单向)。发送方通过 Separate.req 通知对端即将关闭 TCP 连接。收到 Separate.req 后,接收方应停止发送数据并准备关闭 Socket。

使用场景

  • 设备关机:设备在断电前发送 Separate.req,然后关闭 TCP 连接。
  • 主机维护:主机在重启服务前发送 Separate.req,通知设备重新连接。
  • 异常断开:检测到协议错误或不可恢复的链路故障时,发送 Separate.req 后立即关闭连接。

与 Deselect 的区别

特性Deselect.reqSeparate.req
会话状态已选择 → 未选择已选择/未选择 → 终止
TCP 连接保持关闭
是否需要响应是(Deselect.rsp)否(单向)
典型用途优雅降级紧急断开
协议规范:Separate.req 的 Header Byte 0 固定为 0x05。发送 Separate.req 后,发送方应等待至少 1 秒(确保消息被对端接收)再关闭 Socket。接收方收到 Separate.req 后,不应再发送任何 HSMS 消息。

3.5 五种消息类型对比总览

消息类型方向是否需要响应会话状态变化TCP 连接影响
Select.req / Select.rsp双向是未选择 → 已选择无
Deselect.req / Deselect.rsp双向是已选择 → 未选择无
Linktest.req / Linktest.rsp双向是无变化无
Separate.req单向否任何状态 → 终止关闭
Data Message双向可选无变化(需已选择)无
HSMS 消息类型与状态转换 未选择 Not Selected 已选择 Selected 终止 Select.req/rsp Deselect.req/rsp Separate.req Separate.req Linktest.req/rsp(保活)

3.6 消息类型与超时参数的关联

每种 HSMS 控制消息都与特定的超时参数绑定。在配置链路恢复参数时,必须理解这些关联关系:

消息类型关联超时超时触发行为
Select.reqT5(连接响应超时)TCP 建立后 T5 内未收到 Select.req → 关闭连接
Select.rspT3(回复超时)发送 Select.req 后 T3 内未收到 Select.rsp → 重试或断开
Linktest.reqT6(链路测试间隔)空闲时间超过 T6 → 发送 Linktest.req
Linktest.rspT3(回复超时)发送 Linktest.req 后 T3 内未收到 Linktest.rsp → 重试
Deselect.reqT3(回复超时)发送 Deselect.req 后 T3 内未收到 Deselect.rsp → 强制断开
Separate.req无(单向)发送后等待 1 秒 → 关闭 Socket
配置原则:在链路恢复参数配置中,T3 是最核心的超时参数,因为它同时影响 Select、Linktest 和 Deselect 三类消息的响应等待。建议将 T3 统一设置为 45 秒,与 T6 保持一致,形成“45 秒空闲 → Linktest → 45 秒等待 → 重试 3 次 → 链路恢复”的完整超时链。