2、通过ss命令发现确有链接端口变化,与设备约一天一次的重连,通过抓包(tcpdump -vvv -nn port 1001 -w 0926.cap)分析得以下现象
2.1、异常情况时未对设备的I帧均匀的回S帧进行确认,正常情况时均匀的回S帧进行确认
2.2、长达23秒的缓存区满
2.3、发送报文中接收帧序列号错误
结论:该IEC104设备未关注暂无影响
-
- 不明原因链接断开
2.5、链接短时不稳定有多次各种原因的关闭与重连颠簸,完全恢复正常时间长
3、根据以上现象分析代码并增加日志,cs104_connection.c文件中关键函数static void* handleConnection(void* parameter)、static bool handleTimeouts(CS104_Connection self)
结合抓包得以下结论:
a异常情况时handleConnection线程未执行到(怀疑在进行链接异常关闭流程或Semaphore_wait卡住)receiveMessage,未及时从系统TCP缓存区中读取数据会导致2.2;
b异常情况时handleConnection线程未执行到(怀疑在进行链接异常关闭流程或Semaphore_wait卡住)confirmOutstandingMessages,未及时回S帧进行确认会导致2.1;
c根据抓包及日志I message timeout,判定104设备在变化上报遥测数据过程中,偶发不会或不能及时对worker发送的遥脉总召唤C_CI_NA_1的I帧进行I帧响应、S帧确认,会导致2.4;
d根据c结论将以下代码屏蔽删除,即不对104设备的S帧做超时判断,从而避免链接断开,恢复时间长影响数据采集。按协议标准规定应对S帧做超时判断,这里删除该逻辑对其它104协议设备应无影响(可能有报文时序不匹配的风险),具体待观察。
4、遗留问题
a本次修改后链接稳定性待观察;
b本次修改对其它104协议设备的影响待观察;
c以上有一些是怀疑与猜测故需对60870库、IEC104协议通信机制、worker代码细节进一步了解;
d反控反馈逻辑错误,不应使用send成功,而应使用send后的响应报文判断(asduhandle里处理);
f本协议关于控制规定有预发、执行、撤销三步,此处一步写入是否能兼容存疑。