IEC60870-104报文解析 —— 利用Wireshark对报文逐字节进行解析详细解析IEC60870-104附含模拟器以及pcap包
- 2020 年 5 月 22 日
- 筆記
前言 ——
104报文较为繁琐。
共有S帧、I帧、U帧。
简单的说I帧是用来传输数据、S帧是用来信息确认、U帧用来控制。
因为S帧与U帧的报文基本无变化也太过于简短,所以我这边举例子吧就不在截图了。
一、U帧
U 格式帧具有不计数的控制功能,长度为 6 个字节的固定帧长。用于控制报文。
C:表示确认 V:表示生效
U 格式帧使用到以下三种命令
1) 启动 U 帧,用于启动应用层传输控制命令
主站发送:680407000000 从站返回:68040B000000
07 0B为控制域
2) 停止 U 帧,用于停止应用层传输控制命令
主站发送:680413000000 从站返回:680423000000
13 23为控制域
3) 测试 U 帧,双方均无发送时,维持链路活动状态控制命令:
主站发送:680443000000 从站返回:680483000000
43 83为控制域
二、S帧
S 格式具有计数的监视功能, S 格式帧为短帧,长度 6 个字节。接收方接收到 I 帧数据,但本身没有信息要发送的情况下, S 帧用于确认接收到对方的帧。
主站发送 68 04 01 00 0e 00
从站回复 68 04 01 00 1a 00
三、I帧
I 帧的控制域包含发送序列号和接收序列号两个参数
两个序列号在每个 APDU 和每个方向上都应按顺序加一
发送序列号和接受序列号在 0~32767 之间循环
发送方增加发送序列号而接受方增加接收序列号
接收站认可连续正确 接收的一个 APDU 或者多个 APDU,将最后一个正确接收的 APDU 的发送序列号作为接收序列号返回
这个接收序列号是对所有发送序列号小于或等于该号的 APDU 的有效确认
如只在一个方向进行较长的数据传输,就得在另一个方向发送 S 格式认可这些 APDU
这种 方法应该在两个方向上采用。在创建一个 TCP 连接后,发送和接收序列号都被设置成 0
顺便附带一下ASDU的格式
以上只是方便与理解这个规约
好了我们进入正题
四、单点遥控
发包
I帧共有两层、第一层为控制域与序列计数
Byte[0] 68 只要是IEC104规约那么开头规定的即为是68 也就为启动符吧
Byte[1] 0e 为长度 自此往后的长度
Byte[3][4] 1c 00 发送序号,计数
Byte[3][4] 1c 00 接收序号,计数
看下一层
Byte[0] 2d 为控制符 即为功能码
Byte[1] 01 可变结构限定词、若信息对象的地址不连续则为0、若信息对象的地址连续则为1
Byte[2] 06 传输的原因
Byte[3] 00 公共地址 即RTU站址
Byte[4] 01 00 信息体地址
接下来看IOA这个结构体内的
Byte[0][2] IOA 00 00 00 信息体地址,数据点在数据库中的序号,低位在前高位在后
Byte[0][2] SCO 80 代表单点遥控的分合状态
回包
跟发包都是一样 I帧发送了数据 那么会有S或U帧确认或控制这个信息 所以I帧的回应包与发包一致
五、时间同步命令
发包
上一层就不截图了、与之前一样
Byte[0] 2d 为控制符 即为功能码
Byte[1] 01 可变结构限定词、若信息对象毫秒低位的地址不连续则为0、若信息对象的地址连续则为1
Byte[2] 06 传输的原因
Byte[3] 00 公共地址 即RTU站址
Byte[4] 01 00 信息体地址
接下来看IOA这个结构体内的
Byte[0] 00 00 00 信息体地址,数据点在数据库中的序号,低位在前高位在后
Byte[1][7] 09 88 1f 0a 0d 05 14 即为时间
09 毫秒低位
88 毫秒高位
1f 分钟
0a 时
0d 日与星期
05 月
14 年
回包
与发包一致
其实他的I帧的都是发什么就回什么、确认信息以及控制是S帧的U帧
六、举例子
也不多截图了、举几个例子吧。
单点:
68 15 F8 05 DA 00 01 03 03 00 01 0B 72 00 00 01 75 00 00 00 78 00 00 01
双点:
68 15 F8 05 DA 00 03 03 03 00 01 0B 72 00 00 01 75 00 00 02 78 00 00 01
说明:0x01,0x03 ASDU类型:单点遥信数据。0x03 ASDU类型:双点遥信数据
0x03 可变机构限定词:第七位定义该帧应用数据的数目,低位在前高位在后。最高位不为1,表示每个应用数据前带有一个3个字节的信息体地址(inf),可以不是连续的。因为是遥测数据,所以每个信息体地址后都有一个1个字节的开关量数据。若最高位为1,见2总召遥测报文举例
0x0003 传送原因:定义数据上送的原因,低位在前高位在后。3表示变化上送,若20为召唤上送,1为主动上送等
0x0b01 公共地址:主站个子站设定的地址,低位在前高位在后。由主站方确定,子站严格按此地址设定
0x000075每个遥信数据的信息体地址:数据点在数据库中的序号,低位在前高位在后
0x01 信息体地址后的遥信数据值,单点可以为0或1;双点可以为0,1,2,3
总召唤上送遥信或告警报文(单点)举例:
68 15 F8 05 DA 00 01 83 14 00 01 0B 72 00 00 01 00 01
遥信变位或告警报文(双点)举例:
68 15 F8 05 DA 00 03 83 14 00 01 0B 72 00 00 01 02 03
说明:定义同2召唤遥测。不同点在于遥测是3个字节一个量,遥信是一个字节
SOE(双点)报文举例:
68 15 F8 05 DA 00 1F 01 03 00 01 OB 72 00 00 02 78 49 35 0E 01 01 00
SOE(单点)报文举例:
68 15 F8 05 DA 00 1E 01 03 00 01 0B 72 00 00 01 78 49 35 0E 01 01 00
说明:前面定义同遥信。78 49 35 0E 01 01 00为动作时间,从后到前依次为年、月、日、时、分、毫秒(2字节)。时间为00年1月1日14时53分18808毫秒(18秒808毫秒)
暂时先就这样吧…
想起来再补