首页 > 其他分享 >记录一次大炮打蚊子的modbustcp通讯连接异常问题定位事件

记录一次大炮打蚊子的modbustcp通讯连接异常问题定位事件

时间:2024-11-02 08:47:43浏览次数:1  
标签:脚本 ... 蚊子 自启动 开机 大炮 modbustcp tcpdump 连接

一.问题描述

某种场景下,安装有Ubuntu22系统的设备A开机后,1-2min内设备E遥控器不能遥控设备A移动,之后恢复正常。

二.设备组网

设备A和设备C之间使用modbustcp协议进行通讯。

三.首战

3.1 查看日志

放开该端口的modbus查询帧日志打印,发现整体的帧格式,发现返回了modbus数据帧,但是返回帧是82错误码的帧,可能是由网络问题导致的。

3.2 ping查看网络通路通信状况

使用ping命令,ping从机ip,查看是否能ping通,并查看丢包率,确认通路良好,延迟低、无丢包。

3.3 mNetAssist网络调试助手

在ubuntu主机上面安装网络调试助手mNetAssist,测试查询数据正常。

3.3.1 使用方法

在ubuntu上运行mNetAssist查询从机数据:

  1. 协议类型选择TCP客户端;
  2. 服务器IP和端口为指定的modbus从机的ip地址和端口;
  3. 本地IP填写主机查询网口的ip,本地端口随便填写会自动分配;
  4. 发送设置要勾选按十六进制发送;
  5. 接收设置可以勾选显示日期和按十六进制显示;

设置好之后,点击服务器端口下方的连接网络,如果成功建立连接,会变为断开网络,之后在本地IP下面填入要发送的modbus数据帧,点击发送,如果成功查询到数据,上方的数据接收区会显示查询结果。

注意,1、2、3、4如果设置不正确,则可能无法建立网络连接,或者发送查询数据无反应。

3.3.2 安装方法

通过百度网盘分享的文件:网络调试助手win_linux.zip

链接:https://pan.baidu.com/s/1MjVtxmtU4hTBV8wDKPN4_g

提取码:t4nu

--来自百度网盘超级会员V8的分享

下载压缩包,解压后参考其中readme.txt中的操作。

3.4 使用wireshark抓包

Ubuntu主机安装wireshark进行抓包,可以观察到,确实在开机一段时间后才开始建立连接进行通讯。同时还注意到在开机之后一段时间内,有其他的ip在和从机建立连接,并且进入了retransmission阶段,在该ip和从机重连结束后,目标主从机开始正常连接。

3.5 首战总结分析

首战,到此为止没有什么意外发现,也是在意料之中。

当前问题为开机1-2min内手柄无法遥控机器,开机之后,电脑连接路由器wifi需要一定时间,网络调试助手和wireshark都是桌面端,连接wifi之后远程桌面操作软件更需要一定时间,现在可能需要彻底搞清楚从刚刚开机到连接成功之间的网络状态。

因为是linux主机,所以可以考虑使用开机自启动脚本实现开机之后程序自启动执行所需操作。

四.再战

4.1 modbuspoll

上面我们安装的mNetAssist网络调试助手是桌面软件,需要在界面手动修改各项参数,然后建立连接,进行查询,不能应用于开机脚本自启动中,因此,我们需要找一款可以以命令行的方式工作的modbus数据帧查询软件,我选择了modbuspoll。

  • ModbusPoll使用方法

mbpoll 192.168.11.12 -p 460 -B -0 -a 1 -t 1 -r 0 -c 0x10 -v

参数功能说明:

4.2 tcpdump

因为wireshark也是图形化界面操作,想要用脚本在开机后自启动抓包,就需要一款命令行操作的抓包工具,我选择了tcpdump。

直接抓取所有接口的流量:sudo tcpdump -i any -w capture.pcap

4.3开机自启动实现方式

4.3.1方式一.应用程序级启动方式

以tcpdump自启动脚本为例:

1.首先来写一个抓取数据包的脚本tcpdump_self_start_cap.sh:

#!/bin/bash

current_time=$(date +"%Y%m%d-%H%M%S")

echo "password" | sudo -S tcpdump -i any -w capture_${current_time}.pcap

注:

password:为执行sudo命令时需要输入的密码

-S: 想要sudo命令从管道中读取echo输入的密码,必须加这个参数

 

2.在Activities → start application → Add → Command中输入:

gnome-terminal -x bash -c "/....../tcpdump_self_start_cap.sh"

 

3.最终效果

该方法实现的开机自启动脚本,linux开机启动后,远程桌面登录linux系统,就会打开一个终端,并自动执行脚本程序,但是如果开机启动后不远程连接桌面,该脚本就一直不会自启动,显然这种方式并不是真正的开机自启动,也无法达到我想要的效果。

4.3.2方式二.系统级启动方式

同样以tcpdump为例,tcpdump执行脚本还是上面的脚本tcpdump_self_start_cap.sh。

1.在/etc/systemd/system路径下添加tcpdump_capture.service脚本,脚本内容如下:

[Unit]

Description=Capture network traffic using tcpdump

After=network.target

[Service]

User=root

ExecStart=/....../tcpdump_self_start_cap.sh

Restart=always

[Install]

WantedBy=multi-user.target

 

2.执行如下命令

sudo systemctl enable tcpdump_capture.service

sudo systemctl start tcpdump_capture.service

 

3.执行效果

系统开机后,不需要连接linux主机,就会自动启动脚本执行相应操作

4.4 再战总结分析

将tcpdump抓包和modbuspoll数据帧查询脚本均加入开机自启动服务,复现问题场景,观察到,开机启动后短时间内modbuspoll就可以和从机通讯,1-2min后问题软件才开始和modbus从机通讯。

dmesg、syslog和journalctl日志也未发现网络异常,经过两次测试验证,可以确认问题程序之外的其他方面应该没有问题,因此重新回到问题程序,推测是程序的什么地方耗费了较长的时间。

五.终战

5.1 回归日志和问题程序

回看之前保存的问题情况下的日志,仔细观察后发现:

tcp初始化之后一直到tcp成功连接,中间居然隔了133s,其中主要时间都浪费在了初始化和第一次连接之间:

回看代码,发现初始化到建立连接之间并没有什么耗时的操作,大胆推测是建立连接的过程比较耗时,于是在connect函数执行前后添加日志打印:

...”...before connect...”...;

sc_ -> connect(...);

...”...after connect...”...;

复现问题场景之后,可以看到:

目前想到的解决办法是调用异步async_connect函数建立连接,结合deadline_timer增加超时时间,是否能解决当前问题尚未测试验证

5.2 终战总结分析

1.看日志还是要认真仔细一点;

2.学习别人的源码还是要细节一点;

PS:希望这篇记录能对大家在使用文中提及的工具上有所帮助,更深的帮助应该是没有了。

标签:脚本,...,蚊子,自启动,开机,大炮,modbustcp,tcpdump,连接
From: https://www.cnblogs.com/WuLaRua/p/18521583

相关文章

  • 【ModbusTCP与Profibus DP双向互转说明】
        Profibusdp和ModbusTCP均为工业通信协议。ModbusTCP为串行通讯协议,已成为工业领域通讯协议的业界标准。Modbus是现在国内工业领域应用最多的协议,不只PLC设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备。而Profibus为自动化技术的现场总线标准,广泛......
  • 【验证码识别专栏】大炮打麻雀 — CLIP 图文多模态模型,人均通杀 AIGC 六、九宫格验证
    前言近期有粉丝私信,不知道如何训练某讯系点选验证码,之前星球群也有不少粉丝讨论相关问题,为满足粉丝们的需求,本文将对这型验证码的训练进行讲解,文末可以下载相关的工具,包括文章配套标注工具+文章配套训练代码+部分学习数据集(少量类目,仅供学习使用,不设计成品)+六宫格推理比......
  • 大炮妙妙屋
    快进来,非常好玩Oddeskidodeski怎么说呢,确实想到了删的区间互不交,然后就从放置整个区间去想,就假了考虑修缮区间,设\(dp_{i,j,0/1}\)表示当前区间不合法/合法,在后面一位放置\(j\)种数就合法了那就相当于有一个区间前闭后开,开的结尾有\(j\)种补全方法,就可以按照\(i+1\)位新放......
  • PROFINET 转 EtherCAT, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
    EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ft=t&id=822721028899协议转换通信网关PROFINET转EtherCATGW系列型号 MS-GW31概述简介MS-GW31是PROFINET和EtherCAT协议转换网关,为用户提供两种不同通讯协议......
  • ModbusTCP通信协议分析
    前言大家好!我是付工。前面给大家介绍了一系列关于RS485与Modbus的知识。终于有人把RS485说清楚了终于有人把Modbus说明白了通透!终于把ModbusRTU弄明白了今天跟大家聊聊关于ModbusTCP协议的那些事。一、发展历史ModbusTCP是一种基于以太网的通信协议.ModbusTCP协议由施耐德......
  • 揭秘 ARMxy 嵌入式控制器的 ModbusTCP 通信协议实战案例
    引言随着工业4.0概念的普及,越来越多的企业开始寻求将传统设备与现代信息技术相融合的方法,以提升生产效率和管理水平。在这个过程中,ModbusTCP作为一种成熟的工业通信协议,因其简单易用、兼容性好而在工业自动化领域得到广泛应用。与此同时,Node-Red作为一种开放源码的可视化编程工具,......
  • ModbusTCP报文详解
    ModbusTCP与ModbusRtu(ASCI)数据帧的区别总结:ModbusTCP就是在ModbusRtu(ASCI)基础上去掉CRC,再加上六个0一个6ModbusTCPMBAP报文头域长度描述客户机服务器事务处理标识符2字节Modbus请求/响应事务处理的识别客户机启动服务器从接收的请求中重新复制协议标识符2字节0=M......
  • ModbusTCP 转 Profibus DP(M)网关,型号 SG-TCP-Profibus(M),详细介绍
    一、功能概述1.1设备简介本产品是ModbusTCP和DP(ProfibusDP)网关,使用数据映射方式工作。本产品在ModbusTCP侧作为ModbusTCP从站,接PLC、上位机、wincc屏等;在DP侧做为DP主站,接ProfibusDP设备,如编码器、流量计、显示屏等;通过增加DP/PA耦合器可接入Profi......
  • C#实现数据采集系统-数据反写(3)ModbusTcp写入数据模块开发
    写入报文分析//000100000006FF050001FF00写单个线圈//000100000006FF0600050023写单个寄存器//写多个寄存器//00060000000BFF1000020002040021002A//前7位相同,第八位功能码不同,九、十位写入地址,这是格式一样部分线圈......
  • Profinet转ModbusTCP网关模块的配置与应用详解
    Profinet转ModbusTCP网关模块的配置与应用详解Profinet转ModbusTCP网关模块(XD-ETHPN20)是一种常见的工业通信设备,广泛应用于现代工业自动化系统中。通过使用Profinet转ModbusTCP网关模块(XD-ETHPN20)将Profinet协议转换成ModbusTCP协议,实现了不同网络之间的互联互通。这种网关设备......