3. SECS-II消息与数据字典实战
在EAP与设备的通信中,真正决定“能不能通、通得对不对”的,往往不是TCP连接是否建立,而是SECS-II消息的结构、数据项类型和语义是否与设备端一致。EAP工程师日常打交道最多的不是二进制字节,而是SML(SECS Message Language)和FMT(Format)这两种描述方式。理解它们,等于拿到了设备通信的“字典”。
SML与FMT:同一消息的两种表达
SML是一种类文本的消息描述语言,用缩进和尖括号表达数据项层级,便于人阅读和编写;FMT则是设备端或仿真器常见的格式定义,用类型符号和长度描述数据项结构,更接近实际编码。二者描述的是同一条SECS-II消息,只是视角不同。
以一条典型的S1F1(Are You There)为例,它通常不带消息体,SML写作:
S1F1 W
.
而S1F2(On Line Data)的回复可能携带设备型号和软件版本,SML如下:
S1F2
<L [2]
<A [6] 'MODEL1'
<A [5] 'V1.0.0'
>
对应的FMT描述则更强调类型与长度:
S1F2
L,2
A,6
A,5
可以看到,SML中的<A [6] 'MODEL1'表示一个长度为6的ASCII字符串,FMT中写作A,6。EAP侧解析时,必须按FMT声明的类型和长度去读取字节流,否则会出现“长度对不上、后续数据项全部错位”的典型故障。
数据项结构:类型、长度与层级
SECS-II的数据项由“格式码+长度+内容”构成。常见格式码包括:L(列表)、A(ASCII)、B(二进制)、Boolean、U1/U2/U4(无符号整数)、I1/I2/I4(有符号整数)、F4/F8(浮点)。列表可以嵌套,形成树形结构。EAP解析时通常先读格式码,再读长度字节数,最后按类型读取内容。
以S2F41(Host Command Send)为例,它携带命令名和参数列表,SML结构如下:
S2F41 W
<L [2]
<A [5] 'START'
<L [2]
<L [2]
<A [3] 'LOT'
<A [4] 'A123'
>
<L [2]
<A [3] 'PPID'
<A [5] 'REC01'
>
>
>
这里外层L[2]包含命令名和参数列表,参数列表又是L[2],每个参数是L[2]的键值对。如果EAP侧把参数列表误解析为L[1],就会只读到第一组参数,导致设备端收到不完整命令。这类问题在联调初期非常常见,排查时最有效的方法就是对照SML与设备FMT逐层核对。
事务日志排查:从时间线定位问题
事务日志是EAP排障的第一手资料。一条完整的日志通常包含:时间戳、方向(→发送/←接收)、消息名、W位(是否需要回复)、消息体摘要、结果状态。排查时按以下顺序推进:
- 确认消息是否发出:日志中有→记录,说明EAP已发送;若无,检查触发条件或队列阻塞。
- 确认设备是否回复:有→无←,通常是设备未响应、T3超时或连接断开。
- 核对回复消息名:S1F1应回复S1F2,S2F41应回复S2F42;若回复了S9F7(非法数据),说明消息体解析失败。
- 检查数据项内容:对比SML与日志中的字段值,确认长度、类型、层级是否一致。
设备联调中的消息追踪方法
实际联调时,建议按“先通后全”的顺序推进。第一步用S1F1/S1F2验证链路和基本解析;第二步用S1F13/S1F14交换设备信息,确认双方支持的SECS-II版本和消息集;第三步用S2F41/S2F42验证命令下发与ACK;第四步用S6F11/S6F12验证事件上报和报告定义。每一步都保留日志,出现异常时优先看消息名、W位、数据项长度三个要素。
如果设备回复S9F7(Illegal Data),说明EAP发送的消息体不符合设备FMT。此时应导出EAP实际发送的SML,与设备端FMT逐项比对,重点检查列表层级和字符串长度。如果设备回复S9F5(Unrecognized Function),说明消息名不在设备支持列表中,需要确认设备能力集。如果长时间无回复,检查T3超时设置和HSMS连接状态。
<A [4] 'A123'正确,若写成<A [5] 'A123',设备会多读一个字节,导致后续数据项全部错位。此外,列表长度声明的是子项个数,不是字节数,容易与字符串长度混淆。
掌握SML/FMT解析和事务日志追踪,本质上是在建立一套“消息级”的排障能力。EAP工程师不需要每次都抓底层字节,但必须能看懂SML结构、能对照FMT定位长度和层级错误、能从日志时间线判断问题出在发送、接收还是解析环节。这套能力在多机台并发场景下尤其重要,因为一旦某台设备的消息结构不一致,问题会以“偶发超时”或“数据错乱”的形式出现,只有回到消息层才能快速定位。