linux 使用Netcat通过TCP发送Modbus RTU请求并捕获响应

raogr8fs  于 2023-10-16  发布在  Linux
关注(0)|答案(2)|浏览(174)

假设我有一个Modbus RTU温度控制器连接到一个设备,该设备从网络读取TCP数据包,并通过RS485将所述数据包的有效载荷发送到温度控制器。如果我想通过在Linux命令行上使用netcat在TCP/IP上发送Modbus RTU [Read Input Registers]请求来测试这样的设置,假设可以的话,完整的命令是什么?

nc 192.168.0.5 2000   # ...what now?

假设以下细节适用:

  • 设备地址:1
  • 功能代码:3(读取输入寄存器)
  • 存储器地址:1000H
  • 登记册数目:1
  • 服务器IP地址:192.168.0.5
  • 客户端IP地址:192.168.0.4
  • 服务器上的端口:2000

我觉得我也可以用netcat来监听响应。我能不能用:

nc -l 3456

是这样吗?要像这样发送请求并记录响应,我想我必须指定发送请求的端口为3456(或其他)。有办法做到吗?
特别是,我对如何将Modbus消息(如[01][03][1000 H][01][CRC])转换为字节等效值感到困惑。
非常感谢。

9ceoxa92

9ceoxa921#

您可以使用以下命令发送原始字节:

echo -e '\x04\x03...' | nc host port

特别是,我对如何将Modbus消息(如[01][03][1000 H][CNC])转换为其字节等效值感到困惑。
这将是:

echo -e '\x01\x03\x10\x00...' | nc host port

我不打算为你计算,因为我认为除了好玩之外,做这样的事情没有任何意义。
你必须把Modbus框架的所有部分放在一起,只是谷歌它。最困难的部分是在帧结束时计算CRC。我想这就是CNC的意思吧?
如果你有困难,我建议你试试QModMaster。使用菜单 * 查看 * 编辑 * 原始数据 * 查看原始数据并使用这些字节。
请注意,除了构建帧之外,QModMaster还可以发送帧,甚至可以侦听和接收响应。这应该是您的Modbus一站式商店。你还可以找到许多其他的工具,如pymodbus,libmodbus,minimalmodbus,甚至是Windows和Linux的命令行工具。
如果你编辑你的问题,提出一个合理的理由,为什么你需要使用nc(显然不是为了好玩),也许我可以尝试提供更多的帮助。
我找不到任何关于使用netcat发送和/或接收Modbus帧的参考资料。我不知道这是因为我没有找到足够长的时间,还是因为它是毫无意义的。也许两者都有

swvgeqrz

swvgeqrz2#

如果它对任何人都有用,这个问题的答案是:

echo -e -n '\x01\x03\x10\x00\x00\x01\x80\xCA' | nc 192.168.0.5 2000

-e允许转换转义字符
-n防止追加换行符
使用Netcat侦听传入消息不起作用,显然是因为单个Netcat进程希望自己建立TCP连接,否则它对到达指定端口的任何消息都不感兴趣。尽管如此,我还是能够看到使用Wireshark从设备返回的回复,并且还写入了寄存器并成功控制了设备。

相关问题