问题描述
我有一个设备,它使用 Telnet 协议来执行一些命令并获取设备状态。当我使用带有 Telnet 选项的 Putty 应用程序时,设备运行良好。这是一个简单命令的快照以及来自设备的响应:
我正在构建一个库来控制在 Linux 操作系统上运行的 Python 3.8 中的这个设备。为此,我使用 telnetlib
库来创建 telnet 会话。但是,设备似乎没有回复我正在执行的命令,并且脚本在 read_all() 处被阻止。这是我的代码:
import telnetlib
tn = telnetlib.Telnet('192.168.1.10',2000)
tn.write(b'{"get":"relayStatus"}\r\n')
print(tn.read_all().decode('ascii'))
我使用 Wireshark 进行了数据包捕获,以比较我在 Python 脚本中发送的内容与 putty 发送的内容之间的差异。令我惊讶的是,我发现使用 putty 时,命令被拆分为两个数据包。第一个数据包包含消息有效负载,第二个消息包含带有回车符 \r\n
的新行。因此,远程设备似乎回复了我的 PC。
但是,在 Python 脚本情况下,只发送一个包含带有换行符和回车符的命令的数据包。因此,设备不会发回任何信息。
我对这种行为感到惊讶,因为我们讨论的是基于流的连接的 TCP 协议,我们并不关心发送了多少数据包。
这是 Wireshark 捕获的快照: 这是针对Telnet的,可以清楚地看到第一个数据包只包含命令,没有换行:
第二个数据包的内容:
注意: 我尝试将写入命令拆分为两个命令,但是,在 Wireshark 中,我看到每个数据包都会收到 TCP ACK,最终没有来自设备的响应。这就是我所做的:
tn.write(b'{"get":"relayStatus"}')
tn.write(b'\r\n')
有人能指出我在这里遗漏了什么吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)