4. SECS/GEM 状态机模型:连接状态、通信状态、控制状态的转换
SECS/GEM 协议的核心在于其严谨的三层状态机模型。该模型定义了设备(Equipment)与主机(Host)之间从物理连接到业务控制的完整生命周期。理解这三层状态及其转换规则,是进行协议调试、工具选型以及故障定位的基础。
调试要点: 在抓包分析时,如果发现消息无响应或连接异常断开,首先应检查当前设备处于哪一层状态。状态不匹配是导致通信失败的最常见原因。
4.1 三层状态机总览
SECS/GEM 状态机由下至上分为三个层次:连接状态(Connection State)、通信状态(Communication State) 和 控制状态(Control State)。每一层状态都约束了上层状态的行为。
4.2 连接状态(Connection State)
连接状态是状态机的最底层,直接对应 TCP/IP 套接字的建立与断开。该层只有两个状态:NOT CONNECTED 和 CONNECTED。
| 状态名称 | 描述 | 触发条件 |
|---|---|---|
| NOT CONNECTED | 物理链路未建立,无任何消息可收发。 | TCP 连接断开、超时、或主动关闭。 |
| CONNECTED | TCP 三次握手成功,链路层就绪。 | 设备或主机发起 TCP 连接请求并成功。 |
调试技巧: 在 Wireshark 中,如果看到 TCP RST 或 FIN 包,说明连接状态正在向 NOT CONNECTED 转换。此时应检查网络防火墙、端口可达性以及设备端的 TCP Keep-Alive 配置。
4.3 通信状态(Communication State)
当连接状态为 CONNECTED 后,设备与主机需要通过 S1F13 (Establish Communication Request) 和 S1F14 (Establish Communication Acknowledge) 完成通信握手。通信状态分为:COMMUNICATING 和 NOT COMMUNICATING。
| 状态名称 | 描述 | 触发条件 |
|---|---|---|
| NOT COMMUNICATING | TCP 已连接,但未完成 S1F13/14 握手。 | 连接建立后初始状态,或通信超时后回退。 |
| COMMUNICATING | 握手成功,设备与主机可以交换标准消息。 | 收到 S1F14 且内容正确。 |
常见问题: 很多调试场景中,TCP 连接是正常的(CONNECTED),但设备一直处于 NOT COMMUNICATING 状态。这通常是因为主机没有及时回复 S1F14,或者 S1F13 中的 MDLN(设备型号)和 SOFTREV(软件版本)不匹配。
4.4 控制状态(Control State)
控制状态是 GEM 标准中最高层的状态,决定了设备是否接受主机的远程控制。该层包含三个核心状态:OFF-LINE、ON-LINE 和 ON-LINE (REMOTE)。其中,DISABLE 和 ENABLE 是控制状态下的子模式,用于控制具体事件报告和远程命令的使能。
| 状态名称 | 描述 | 转换条件 |
|---|---|---|
| OFF-LINE | 设备本地操作,不接受主机远程控制。 | 设备上电初始状态,或收到 S1F17 (OFF-LINE)。 |
| ON-LINE | 设备允许主机控制,但处于本地模式。 | 收到 S1F1 (ON-LINE) 或操作员切换。 |
| ON-LINE (REMOTE) | 设备完全由主机远程控制,本地操作被锁定。 | 主机发送 S2F17 (Remote Command) 或状态变更。 |
ENABLE / DISABLE 子模式: 在 ON-LINE 状态下,主机可以通过 S2F37 (Enable/Disable Event Report) 和 S2F35 (Enable/Disable Remote Command) 来控制具体功能的使能。例如,DISABLE 状态会阻止设备发送事件报告,但通信链路仍然保持。
4.5 状态转换完整流程与调试对照
在实际调试中,状态转换的每一步都可以通过抓包工具观察到。以下是一个典型的完整状态转换流程,以及对应的抓包特征:
- 物理连接: 设备发起 TCP 连接(SYN → SYN-ACK → ACK),状态变为 CONNECTED。
- 通信握手: 设备发送 S1F13,主机回复 S1F14,状态变为 COMMUNICATING。
- 控制状态初始化: 设备默认进入 OFF-LINE 状态。
- 上线: 主机发送 S1F1,设备回复 S1F2,状态变为 ON-LINE。
- 远程控制: 主机发送 S2F17,设备进入 ON-LINE (REMOTE)。
- 事件使能: 主机发送 S2F37 设置 ENABLE,设备开始上报事件。
| 步骤 | 状态层 | 消息流 | 抓包特征 |
|---|---|---|---|
| 1 | 连接状态 | TCP SYN / SYN-ACK / ACK | 三次握手包,无 SECS 内容 |
| 2 | 通信状态 | S1F13 → S1F14 | Stream 1, Function 13/14 |
| 3 | 控制状态 | S1F1 → S1F2 | Stream 1, Function 1/2 |
| 4 | 控制状态 | S2F17 → S2F18 | Stream 2, Function 17/18 |
| 5 | 控制状态 | S2F37 → S2F38 | Stream 2, Function 37/38 |
调试工具建议: 使用 SECS/GEM 调试工具(如 SECSComm、GEMEdge)时,建议开启“状态机视图”功能。该功能可以实时显示当前的三层状态,并在状态转换时高亮显示,极大提升问题定位效率。
4.6 状态机调试常见问题与对策
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| TCP 连接频繁断开 | Keep-Alive 超时、防火墙策略 | 检查 TCP Keep-Alive 参数,抓包确认 RST 来源 |
| S1F13 无响应 | 主机未启动、IP/Port 配置错误 | 确认主机端 SECS 服务是否监听,检查防火墙 |
| S1F14 返回 COMMACK ≠ 0 | MDLN 或 SOFTREV 不匹配 | 核对设备配置与主机端白名单 |
| 设备无法进入 ON-LINE | 设备处于 OFF-LINE 且未收到 S1F1 | 手动发送 S1F1 或检查主机上线流程 |
| 事件报告不触发 | 控制状态为 DISABLE | 发送 S2F37 设置 ENABLE,检查 CEID 配置 |
重要提醒: 在调试过程中,不要混淆“通信状态”和“控制状态”。即使设备处于 OFF-LINE 状态,它仍然可以接收 S1F1 消息。而如果设备处于 NOT COMMUNICATING 状态,则任何 S1F1 消息都会被忽略。务必按照状态机层级逐层排查。