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 消息结构解析与事务追踪 SML / FMT 描述 S1F2 <L [2] <A [6] 'MODEL1' <A [5] 'V1.0.0' > FMT: L,2 → A,6 → A,5 类型 + 长度决定字节读取方式 编码字节流(HSMS Data) 01 02 81 02 00 00 00 0E 01 02 41 06 4D 4F 44 45 4C 31 41 05 56 31 2E 30 2E 30 L=0x01, A=0x41, 长度前缀 字符串按ASCII逐字节展开 总长14字节(0x0E) EAP 解析结果 消息:S1F2 数据项1:MODEL1 数据项2:V1.0.0 类型:ASCII 层级:L[2] 列表 若长度错位 → 后续项全错 需与设备FMT严格一致 常用消息与事务日志追踪 S1F1 / S1F2 在线确认 心跳与状态 S1F13 / S1F14 建立通信 交换设备信息 S2F41 / S2F42 远程命令 含参数列表 S6F11 / S6F12 事件报告 CEID + RPTID 事务日志 时间戳 方向/消息/结果 10:23:01.234 → S1F1 W (EAP→EQP) 等待回复 10:23:01.456 ← S1F2 (EQP→EAP) MODEL1 / V1.0.0 OK 10:23:05.789 → S2F41 W (EAP→EQP) START, LOT=A123 等待ACK

数据项结构:类型、长度与层级

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位(是否需要回复)、消息体摘要、结果状态。排查时按以下顺序推进:

  1. 确认消息是否发出:日志中有→记录,说明EAP已发送;若无,检查触发条件或队列阻塞。
  2. 确认设备是否回复:有→无←,通常是设备未响应、T3超时或连接断开。
  3. 核对回复消息名:S1F1应回复S1F2,S2F41应回复S2F42;若回复了S9F7(非法数据),说明消息体解析失败。
  4. 检查数据项内容:对比SML与日志中的字段值,确认长度、类型、层级是否一致。
联调追踪技巧:在EAP侧开启SECS消息全量日志,同时用设备仿真器或抓包工具记录HSMS数据。将两侧日志按时间戳对齐,重点观察“发送后多久收到回复”“回复的消息名和W位是否匹配”“数据项长度是否与FMT一致”。对于S6F11事件报告,还要核对CEID(事件ID)和RPTID(报告ID)是否在设备端已定义。

设备联调中的消息追踪方法

实际联调时,建议按“先通后全”的顺序推进。第一步用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连接状态。

常见陷阱:ASCII字符串长度必须与实际字符数一致。例如<A [4] 'A123'正确,若写成<A [5] 'A123',设备会多读一个字节,导致后续数据项全部错位。此外,列表长度声明的是子项个数,不是字节数,容易与字符串长度混淆。

掌握SML/FMT解析和事务日志追踪,本质上是在建立一套“消息级”的排障能力。EAP工程师不需要每次都抓底层字节,但必须能看懂SML结构、能对照FMT定位长度和层级错误、能从日志时间线判断问题出在发送、接收还是解析环节。这套能力在多机台并发场景下尤其重要,因为一旦某台设备的消息结构不一致,问题会以“偶发超时”或“数据错乱”的形式出现,只有回到消息层才能快速定位。