文章目录
- 104协议学习
- I帧
- S帧
- U帧
- ASDU
- 总结:关于各类帧的通俗描述
- 建立流程详细分析
104协议学习
起始一个apdu的总长度不会超过255个字节;
在协议中的第二个字节会记录本apdu的长度,但是这个记录的长度数是除开前面两个字节之外的长读数,比如下面有个单点信息的apdu协议报文:
|-- APCI ------------| |-- ASDU
68 31 02 00 02 00 01 A4 14 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
其中第二个字节31H就是长度转为10进制为49个字节,你可以数下后面肯定是49个字节,如果不是就不是一个apdu协议;
I帧
I帧 IFRAME : (0X68 + len + ctrl[4])APCI + ASDU
I帧的一些规则:
I帧报文格式规定控制域1和控制域3的最低位为0
I帧的控制域:
所以报文为I帧报文时,控制域1和控制域2这两个字节是发送序列号
如下读取发送序列号的逻辑:
注意:只有I帧才有发送序列号!!!
上面代码 position 为2 则是读取接受序列号,U帧没有序列号
S帧
S帧:(0X68 + len + ctrl[4])APCI 1 + 1 + 4 = 6B
S帧的控制域:
U帧
U帧:(0X68 + len + ctrl[4])APCI 1 + 1 + 4 = 6B
U帧是控制帧,用于控制启动/停止子站进行数据传输,或测试TCP链路连接,长度等于6个字节。
① U帧只用于控制,并且只存在APCI中(意思就是U帧的apdu报文只会有apci不会存在asdu);
② 测试、停止和开启在一个U帧报文中只可能存在其中的一种;
U帧的控制域:
测试、停止和开启在一个U帧报文中只可能存在其中的一种:
Tips:测试U帧一般用于子站判断主站是否还在连接子站,主站判断子站是否还在运行,保证数据传输的畅通性.
ASDU
代码中定义:
/**
* 命令
*/
private byte cmdType;
/**
* 可变结构限定词
*/
private byte sq;
/**
* 传输原因
*/
private short cot;
/**
* 公共地址
*/
private short pubAddr;
/**
* 地址
*/
private int infoAddress;
/**数据*/
private byte[] info;
private boolean isOrdered = true;
连续信息传输型:
非连续信息传输型:
可变结构限定词:
过程描述
总结:关于各类帧的通俗描述
1. I帧(Information frame):I帧用于传输实际数据信息。可以将其视为常规的数据帧,用于在终端和主站之间传输有效的应用层数据。I帧通常用于传输具体的控制命令、测量数据或状态信息等。
2. S帧(Supervisory frame):S帧用于进行监督和确认操作。它用于管理和控制数据流,实现可靠的数据传输。S帧通常包含了序列号(sequence number)和确认(acknowledgement)信息,用于确认接收到的I帧和请求重传丢失的数据。
3. U帧(Unnumbered frame):U帧用于控制连接的建立、终止和管理。它提供了与连接相关的功能和控制操作。U帧通常用于发送连接请求、连接确认、断开连接等连接管理的控制命令。
总结起来,I帧用于传输实际的数据信息,S帧用于确认和管理数据流,U帧用于连接的建立、终止和管理。
这些帧类型在104协议中的使用,可以根据具体的通信需求进行配置和组合,以实现可靠的、双向的数据传输。
建立流程详细分析
①建立TCP连接
流程:
1.启动ims-web同时启动InitConnection.run()
2.run方法中通过HttpPost的方式请求/sauOrder/start触发 iec104Master.start();
3.Start()中使用Iec104Master.ReConnectRunnable 调用
Iec104Master.reconnect
4. 在reconnect中获取配置中的ip和端口号,并调用父类的connect方法来初始化连接 (完成第一步建立TCP连接)
建立连接和连接后的事件触发都在NettyHandler中,NettyHandler中对应触发的方法其实又对应到Iec104master中相应的方法,且对应到Iec104ProtocalHandler中对应的方法
② 上图表示,建立TCP连接的同时,主站给从站发送启动确认帧
③ 从站收到启动帧,给主站发送启动确认帧
从站发送过来的确认帧,触发:
handleIframe()中使用Iec104MessageRunnable对不同cmdTtype做不同的处理
④ 主站给从站发送总召唤
⑤ 从站收到主站的总召唤命令,给主站发送总召唤确认
WholeCallRunnable:
sendWholeCall():发送总招消息
⑥ 从站上传遥信,遥测,电度等I帧信息帧,发送完毕从站发送总召唤结束帧;
RealTimeDataHandler:处理实时数据
⑦ 主站收到从站发送的结束帧,会回复一个S帧的确认帧;
⑧ 进入下—个周期(其中如何数据有变化,从站需要主动上报)