拓冰建站拓冰建站
首页 / 资讯中心 / 正文

104报文解析工具实战:从规约骨架到高级分析

简介面向电力自动化、变电站远动及工业通信调试人员这份104报文解析工具以IEC 60870-5-104规约为核心提供抓包解析、文件解析与高级分析能力能对主站与从站间的链路报文进行快速定位和故障排查。压缩包共20个文件整体约11.68MB包含8个DLL运行库、2个可执行主程序、pcap抓包样本、CSV主规约示例、LOG运行日志、JSON历史配置及说明文档等。DLL组件覆盖104、61850、CAC等规约解析扩展EXE分成带抓包与无抓包两种版本便于在不同网络环境下直接运行或对照示例学习报文结构。已有431人学习下载适合刚接触104规约的初学者也适合需要深入分析异常报文的工程人员。资源内置真实实验室104主规约示例、辅控序号异常抓包样本和高阶分析日志配合配套说明文档能够帮助读者从实际案例出发掌握规约字段含义、控制序号核对、链路状态异常判断等排错思路。 干了这么多年电力系统远动调试我最深的体会是不怕现场设备出妖蛾子就怕调度那边甩过来一句“你们的报文有问题自己看”。然后你打开抓包文件满屏的68 04 07 00 00 00、68 0A 08 00 00 00 64 01 06 00 01 00 00 00如果手边连个顺手的104报文解析工具都没有光靠对着IEC 60870-5-104规约文档逐字节抠一下午基本就搭进去了。这篇文章不聊虚的把我实际用过的报文解析、文件解析、抓包解析到高级分析这条路完整捋一遍。内容包括104规约的报文骨架、解析工具的核心功能设计、离线文件怎么批量处理、以及我在现场踩过的字节序、状态机、时标这些坑。适合正在做远动调试、规约联调、变电站后台开发或者单纯被104报文折磨过的朋友参考。1. 远动调试的真实痛点看得见报文未必看得懂报文1.1 从一次现场故障说起去年做某110kV变电站的远动联调后台报了好几个遥测值跳变。现场用笔记本镜像端口抓了半小时包发回来一份pcap让我分析。我打开一看TCP流里密密麻麻全是I帧每个I帧后面拖着几十字节的ASDU里面装着十几个信息对象。第一反应是拿Wireshark看它能还原TCP流但到了应用层就抓瞎了——0x64是类型标识后面0x01是传送原因这些它都不会告诉你有啥含义。我当时只能对着规约文档手动解析先找0x68启动符数长度分控制域再看ASDU里的类型、VSQ、COT、公共地址、信息对象地址……一条遥测报文手动解析要两分钟几百条报文排在那儿真能让人崩溃。后来我用自己攒的解析工具批量导入pcap先把所有报文按帧类型分类再把I帧按N(S)序号排序最后按信息对象地址做变位和越限检测。故障原因很快浮出水面其中一台测控装置在某个信息对象地址上连续上送了明显偏大的短浮点遥测值而且品质描述字里IV位一直为1说明是无效数据。这种判断靠纯人工一个小时也未必能定位到。1.2 通用抓包工具和专用解析工具的差距这里得说清楚Wireshark这类通用工具不是没用它解决的是“链路层和TCP层”的问题但解决不了“应用层规约语义”的问题。104报文的核心价值在ASDU里而ASDU的每个字节都要靠规约知识去解释。近年也有人问我能不能让AI直接读Wireshark导出的文件来解析报文。我的观点始终是AI可以辅助分析规律但规约解析必须靠确定的规则引擎因为现场调试要的是“可复现、可追溯”的结论而不是“看起来像”。一个靠谱的报文解析工具本质上就是一个把IEC 60870-5-104规约全部编码进逻辑里的翻译器输入十六进制输出结构化的、人话能读懂的字段解释。这也是为什么我坚持要有一套能本地跑、能批量处理文件、能对接抓包数据的解析工具链。2. 解析前必须吃透的104规约骨架想用好解析工具或者想自己写一个绕不开104规约的几个核心概念。我把它们拆成最容易理解的三层来说。2.1 从TCP流里把APDU一条条切出来IEC 60870-5-104是IEC 60870-5-101规约的网络化版本跑在TCP/IP之上默认端口是2404。104报文的最小应用层单元叫APDU应用协议数据单元它的结构非常规整第一个字节启动字符固定0x68第二个字节APDU长度表示后面所有字节的数量之后跟着控制域和ASDU这个格式意味着只要在TCP流里找到0x68并读取长度就能一帧一帧地把报文完整切出来。长度字段是1字节所以最大长度是255但实际规约里ASDU超过240字节的情况很少。在工具的实现上这一步可以用状态机来做找起始符、读长度、等完整帧、校验、再找下一帧。TCP是字节流可能一包数据里包含多帧也可能一帧跨多个TCP包所以必须做缓冲区积攒和分帧逻辑这是抓包解析能跑得准的基础。2.2 I帧、S帧、U帧三种帧的区分逻辑控制域占据APDU里长度字段后的4个字节前三个字节用来区分帧类型。帧类型控制域第一字节特征用途I帧编号信息帧最低位为0承载应用数据带发送序号N(S)和接收序号N(R)S帧监视帧最低位为1第二位为0仅用于确认对方I帧不带数据U帧未编号控制帧低两位都为1链路启动、停止、测试等控制命令我常用一个口诀帮新人记I帧是货车S帧是收条U帧是电话。货车拉货ASDU数据收条告诉对方“你的货我收到了”电话用来建立和断开通信链路。解析工具拿到一个APDU后第一件事就是判断它是哪种帧因为后续的处理路径完全不同。U帧里还有一个工程上非常常见的场景主站发送68 04 07 00 00 00STARTDT act启动数据传输从站回68 04 0B 00 00 00STARTDT con。如果你的工具把U帧当成数据帧去解析ASDU那结果必然是错的。所以帧类型识别是报文解析的“第一道闸门”。2.3 ASDU的字段语义类型标识是灵魂ASDU位于控制域之后是真正承载业务数据的地方。它内部有一个固定头类型标识TypeId1字节告诉解析器“后面的数据是什么类型、怎么解释”可变结构限定词VSQ1字节最高位表示信息对象地址是否连续低7位表示信息对象个数传送原因COT2字节表示是周期上送、突发上送、激活确认还是响应等公共地址CASDU2字节站地址多站共享一条链路时用来区分信息对象地址IOA3字节具体到某个遥测点、遥信点的编号类型标识是理解ASDU的钥匙。工程里常见的就这么几个0x01M_SP_NA单点遥信0x03M_DP_NA双点遥信0x09M_ME_NA归一化遥测0x0BM_ME_NB标度化遥测0x0DM_ME_NC短浮点遥测0x2DC_SC_NA单点遥控0x2EC_DC_NA双点遥控0x32C_SE_NC设点命令短浮点拿短浮点遥测来说类型标识是0x0D信息对象里数据部分就是4字节IEEE 754浮点后面可能还带品质描述字和CP56Time2a时标。工具必须知道这些字段的偏移量和长度才能把二进制翻译成带单位、带质量位、带时间的完整数据记录。这也是我强调的工具的价值在“协议字典”是否完整。3. 文件解析与抓包解析离线数据怎么变成可分析资产线上监听肯定重要但真正让我把工具用顺手的是它的文件解析能力。调试过程和故障分析的大部分时间面对的都是历史文件。3.1 pcap日志文件解析的工程细节支持pcap/pcapng文件是解析工具的必修课。读pcap的难点在于一个文件里可能混着多台设备的通信流需要先按五元组拆分TCP连接再按连接做TCP流重组最后把重组后的字节流交给APDU分帧器。我处理过的最复杂情况是一个pcap里同时包含了主站与四台从站的IEC 104通信端口都是2404完全靠IP区分。如果工具没有“按IP对过滤”的功能解析出来的报文就会串流N(S)序号全是乱的。另一个容易被忽略的点是pcap里的时间戳。Wireshark导出时用的是相对时间还是绝对时间直接影响后续的时序分析。我自己的工具里会统一转成毫秒级绝对时间并且把时标字段和抓包时间做一个对照这样既能看链路侧延时也能看应用侧时标是否跳变。3.2 日志文件里那些“不规整”的报文除了pcap现场还经常碰到各种TXT日志、CSV导出、甚至厂家自定义格式的文件。每个厂家导出的格式都不一样有的带时间前缀有的是纯十六进制连成一行有的每个字节中间带空格。这里我的做法是解析工具提供“自定义文件导入”入口用户可以配置起始符、长度字段位置、是否带校验码、时间戳格式。第一次导入某厂家日志时可能要点几次配置但配好之后就能存成模板下次直接套用。实测下来这种可配置的文件解析模式比硬编码支持几种格式实用得多。3.3 抓包解析与在线监听的配合在线监听104报文时最烦的是误抓其他业务流量。我习惯在镜像口抓包时先按tcp.port 2404过滤但在线解析工具里依然保留全量流量解析能力因为有时候站内会改端口或者用非标准端口跑104这时候只看2404就会漏掉关键报文。另外要注意Wireshark抓包默认可能不会抓取完整TCP载荷需要在抓包选项里把“限制每个包的大小”调到足够大比如262144字节否则pcap导入解析工具时会发现报文被截断ASDU后半段丢失解析结果看起来就是“缺胳膊少腿”。这个问题我在现场遇到过不止一次每次排查链路问题最后发现是抓包本身不完整非常耽误事。4. 高级分析功能把调试工具变成诊断工具解析出字段只是第一步真正让工具价值翻倍的是高级分析功能。名字听起来玄乎实际上就是几个非常实用的检查维度。4.1 链路状态机与序号连续性检查104协议中I帧的发送序号N(S)和接收序号N(R)是连续的。主站和从站各自维护两个序号每发一帧I帧N(S)加1每收到一帧I帧N(R)加1。正常情况下双方序号应当是平滑递增的。高级分析里最实用的功能就是“序号连续性检查”把一段会话里的所有I帧按方向分组画出N(S)的序列如果发现跳变说明中间丢了帧如果发现N(S)重复说明出现了重传如果长时间只有S帧而看不到I帧说明对方可能在等待数据但没有收到。这些信息对定位通信链路不稳定、装置死机重启、网络丢包等问题几乎是决定性的。我记得有一次联调后台显示某线路遥测刷新缓慢。看报文统计主站侧每秒钟收到十几个S帧但I帧寥寥无几。进一步检查N(R)发现子站一直在确认到某个序号之后就没有新数据了——问题不在网络而在子站的应用进程卡死没有及时组帧发送遥测。这种结论没有状态机分析能力是得不出来的。4.2 数据质量与异常特征定位高级分析的第二类功能是把解析出来的数据记录直接做业务维度的检查品质位异常检测IV位为1表示无效数据NT位为1表示未刷新SB位为1表示被替代遥测越限检测设定阈值自动找出超过正常范围的测量值变位检测比较相邻两帧同一IOA的状态值找出0/1跳变的时间点时标乱序检测检查CP56Time2a时标是否出现倒退或跳跃这些功能把解析工具从“翻译器”升级成了“诊断器”。过去需要人工翻几百条记录去对比差异现在工具一键就能把问题点高亮出来。特别是变位检测对分析SOE事件时序、校验主站和子站状态一致性价值极大。4.3 统计看板与报告导出分析完之后总得给施工方或者运维单位一个交代。我的做法是让工具直接生成一份分析报告包含按帧类型统计的帧数、字节数按类型标识统计的各种ASDU分布按信息对象地址统计的变位/越限清单问题报文的原文与解析对照表时间线视图按时间顺序展示关键事件导出成HTML或者CSV直接发出去省去自己截图拼报告的功夫。对做工程项目的人来说这份报告本身就是验收和排查的交付物。5. 实操中反复踩的坑与规避方案这部分是我最想写的。工具的代码逻辑可以照抄但这些坑都是从现场一次一次踩出来的。5.1 字节序、位字段与半字节陷阱104规约的字节序不统一这是最容易出错的地方。打个比方同样一个16位整数CPU按小端存储但IEC 60870-5-104里部分字段规定的是“低字节在前”另一部分又按位寻址。一个不注意遥测值就会被解析成天差地别的数字。最典型的是短浮点遥测类型标识0x0D。IEEE 754单精度浮点本身是4字节但不同厂家的装置在组帧时字节序可能不同有的按大端发有的按小端发。同一个32位值按大端解释可能是 25.6按小端解释就成了一个天文数字。所以解析工具里必须提供字节序选项而且在联调阶段先用一个已知值的点做校准比后面出问题再排查高效得多。还有双点遥信的位组合。很多人以为双点遥信就是“0分、1合”但按规约双点信息用两个bit组合表示01表示合10表示分00和11都是不确定状态。如果工具不处理这种位组合直接把整个字节当整数显示那么分/合状态可能完全反掉。5.2 实时数据与缓存数据的处理差异104规约在数据模型上区分实时数据和缓存数据这个容易被忽略但影响很大。缓存数据是带时标的历史记录通常需要通过总召唤或查询命令获取而且接收方需要发送确认帧实时数据则是装置主动上送的当前值不要求接收方确认。解析工具如果不区分这两类数据就会在分析时出现两个典型问题把缓存数据当成实时数据导致遥测曲线出现大量“历史回填”漏掉总召唤流程中从站批量上送的大量缓存帧导致统计结果偏差我的工具里会对传送原因COT做专门标记凡是COT等于20响应站召唤或后续的确认类原因都单独归类避免和周期上送混在一起。5.3 标度化值与归一化值的换算归一化遥测类型标识0x09的值范围是-1到1用2字节表示实际物理量需要乘以满量程系数标度化遥测类型标识0x0B则是整数直接从短整型读数。这个换算关系规约文档写得很清楚但实际现场经常出现系数不一致的情况。我处理过一个案例主站显示某线路的有功功率整整差了一百倍查来查去发现是子站装置把归一化值按标度化值的方式上送而解析工具还傻乎乎地按规约默认方式去解析结果当然对不上。所以工具在做高级分析时最好能让用户为每个IOA配置“值域类型”和“缩放系数”不能一刀切按类型标识处理。6. 关于选型与自研的实在建议6.1 工作流先粗抓包再精解析我目前在实际项目里已经形成一套固定的工作流分享出来供参考到现场先做10到30分钟的全量抓包存成pcap文件名带上站名和日期用Wireshark做第一道粗过滤确认2404端口流量是否存在、TCP握手是否正常用104解析工具导入pcap先做APDU分帧和帧类型统计确认链路状态机是否正常再按信息对象地址做变位、越限、品质位检测把问题点筛出来对问题点逐帧做字段级解析结合时标和序号定位根因这套流程看起来简单但每一步都依赖工具的支持。如果现场条件受限无法装重型软件我也会准备一个命令行版的小工具放在U盘里随时可以跑。6.2 两个容易被忽略的“软技能”第一解析工具要能和自己的历史库联动。我习惯把每个项目里遇到的不常见报文存成“样本库”下次碰到相似报文直接拿样本来比能省掉大量重新解析的时间。养成这个习惯后我对各厂家报文的兼容能力会越来越强。第二一定要保留原始报文。解析结果可以导出成Excel但原始十六进制报文必须完整保留。因为很多时候判断一个问题需要回去重新解析如果你导出的结果里丢掉了原始字节就等于丧失了真相。我的工具里所有解析结果都会带着原始帧数据双击就能回看这一步在追责和排障时非常关键。另外如果你打算自己动手写解析器我的建议是先把I帧/S帧/U帧的判定逻辑写对再把类型标识字典做全这两件事做好工具就已经能覆盖80%的日常需求。高级分析功能可以在实际项目中慢慢加不必一上来就追求大而全。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门