3. HSMS 连接状态机总览:状态定义与状态转换图
HSMS(High-Speed SECS Message Services)连接状态机是设备与主机之间建立、维护和释放通信会话的核心模型。它定义了三个明确的连接状态,以及触发状态转换的事件与动作。理解这一状态机是掌握 T3 超时重连、链路测试与异常恢复的基础。
3.1 三种核心状态定义
HSMS 状态机仅包含三个状态,每个状态都对应着 TCP 连接与逻辑会话的不同阶段。下表总结了各状态的特征与允许的操作:
| 状态名称 | TCP 连接状态 | 逻辑会话状态 | 允许的消息类型 | 典型场景 |
|---|---|---|---|---|
| NOT_CONNECTED | 未建立或已断开 | 无会话 | 无(仅可发起连接请求) | 设备启动、网络中断、T3 超时后 |
| CONNECTED | 已建立 | 未选择(未激活) | 仅控制消息(Select.req/rsp, Deselect.req/rsp, Linktest.req/rsp, Separate.req) | TCP 握手完成,等待选择 |
| SELECTED | 已建立 | 已激活(可收发数据) | 所有 SECS-II 数据消息 + 控制消息 | 正常生产通信、数据采集、报警上报 |
关键概念:“连接”与“选择”是两个不同层次的动作。TCP 连接建立后进入 CONNECTED 状态,但此时还不能传输 SECS-II 数据消息;必须通过 Select 流程成功后才能进入 SELECTED 状态,开始真正的设备通信。
3.2 状态转换图
下图展示了 HSMS 连接状态机的完整转换路径,包括正常流程与异常恢复流程:
3.3 状态转换事件与动作清单
下表列出了所有可能的状态转换事件、触发条件以及设备应执行的动作:
| 当前状态 | 目标状态 | 触发事件 | 设备动作 |
|---|---|---|---|
| NOT_CONNECTED | CONNECTED | TCP 连接建立成功(主动连接或被动接受) | 启动 T3 计时器,等待 Select |
| CONNECTED | SELECTED | 收到 Select.rsp 且状态为“成功” | 停止 T3 计时器,启动 T6 计时器(如有配置) |
| SELECTED | CONNECTED | Deselect 完成 / 收到 Separate.req | 停止 T6,启动 T3,等待重新 Select |
| CONNECTED | NOT_CONNECTED | TCP 断开 / T3 超时 / 收到 Separate.req | 清理会话,启动重连计时器 |
| SELECTED | NOT_CONNECTED | TCP 断开 / T3 超时 / 通信异常 | 清理会话,启动重连计时器 |
| NOT_CONNECTED | NOT_CONNECTED | 重连失败(重试循环) | 等待重连间隔,再次尝试连接 |
3.4 状态机设计原则
- 单向前进,双向降级:正常流程只能从 NOT_CONNECTED 向 SELECTED 单向移动;降级或异常时可以从 SELECTED 回到 CONNECTED 或直接回到 NOT_CONNECTED。
- T3 超时是状态回退的触发器:在 CONNECTED 或 SELECTED 状态下,如果 T3 计时器到期(未收到预期的响应消息),设备必须立即断开 TCP 连接并回到 NOT_CONNECTED 状态。
- 重连循环在 NOT_CONNECTED 内完成:设备不应在 CONNECTED 或 SELECTED 状态下尝试重连;所有重连逻辑都封装在 NOT_CONNECTED 状态的自循环中。
- 状态机是确定性的:在任何时刻,设备只能处于一个状态,且每个事件只能触发一个确定的转换。这保证了通信行为的可预测性。
实践建议:在实现 HSMS 状态机时,建议为每个状态设置独立的超时计时器(T3、T6、T8 等),并在状态转换时重置或切换计时器。不要在状态机外部直接操作 TCP 连接,所有连接管理应通过状态机的事件驱动来完成。
3.5 状态机与 T3 超时的关系
T3 超时是 HSMS 状态机中最重要的异常处理机制之一。它的作用与影响如下:
- 作用范围:T3 计时器在 CONNECTED 和 SELECTED 状态下运行,用于等待对端对控制消息或数据消息的响应。
- 超时后果:一旦 T3 超时,设备必须立即断开 TCP 连接,状态无条件回到 NOT_CONNECTED。不允许在 CONNECTED 或 SELECTED 状态下重试。
- 重连流程:回到 NOT_CONNECTED 后,设备根据配置的重连策略(固定间隔、指数退避等)尝试重新建立 TCP 连接,然后重新执行 Select 流程。
- 与 T6 的区别:T6 计时器用于 SELECTED 状态下等待对端发送数据消息的间隔,超时后通常触发 Linktest 测试,而非直接断开连接。T3 超时则直接导致状态回退。
常见错误:有些实现会在 T3 超时后尝试在 CONNECTED 状态下重新发送消息,而不是断开连接。这违反了 HSMS 规范,可能导致状态机不一致和通信死锁。T3 超时的唯一正确响应是断开连接并回到 NOT_CONNECTED。