在 Windows 10 下并使用 python 3.10.11,我尝试在 telnet 连接的设备上运行命令两次。问题是只有第一次有效,第二次命令只传输了一半(?)到设备?
首先,这是完整的代码:
import time
import telnetlib
def read(session, timeout=1):
received = b""
t0 = time.time()
while time.time() - t0 < timeout:
data = session.read_very_eager()
if data:
received += data
t0 = time.time()
return received.decode()
def write_and_read(session, command):
time.sleep(1)
session.write(command.encode() + b"\r\n")
time.sleep(1)
reply = read(session)
print(reply)
session = telnetlib.Telnet("192.168.200.10", 9000, 20)
command = "$SENSOR,STATUS,192.168.200.53"
write_and_read(session, command)
write_and_read(session, command)
如您所见,相同的命令(“$SENSOR,STATUS,192.168.200.53”)被执行两次。但只有第一次它才有效,我得到了预期的输出。
我得到的输出是
Requesting radar report from 192.168.200.53...
Failed to query sensor. Is the IP correct? Is the sensor powered?
$SENSOR,STATUS,192.168
前两行是设备的正确响应。第四行显示了再次执行该命令时得到的结果。
我已经尝试过不同的睡眠、不同的阅读、不同的时间,什么都没有。第二个命令就是无法通过(?)。但我得到的回应有所不同。他们可以是
$SENSOR,STATUS,192.168
$SENSOR,STATUS,192.168.2
$SENSOR,STATUS,192.168.
等等。总是缺少一些随机数量的字符。
有什么问题可以解决吗?这可能与 Windows 10 有关吗?使用 Windows 11 的同一设备的同事根本没有遇到此问题...
这是我使用稍加修改的代码时的完整通信,如下所示:
def write_and_read(session, command, a, b):
time.sleep(a)
to_write = command.encode() + b"\r\n"
print("WRITE: ", to_write)
session.write(to_write)
time.sleep(b)
reply = session.read_until(b"\n")
print("READ: ", reply)
reply = session.read_until(b"\n")
print("READ: ", reply)
return reply
command = "$SENSOR,STATUS,192.168.200.53"
with telnetlib.Telnet("192.168.200.10", 9000, 10) as session:
write_and_read(session, command, 0, 2)
write_and_read(session, command, 0, 2)
session.close()
那么输出是
WRITE: b'$SENSOR,STATUS,192.168.200.53\r\n'
READ: b'\x1b[0GRequesting radar report from 192.168.200.53...\r\n'
READ: b'Failed to query sensor. Is the IP correct? Is the sensor powered?\r\n'
WRITE: b'$SENSOR,STATUS,192.168.200.53\r\n'
然后它会无限期地阻塞。
可能是在第一个命令之后缓冲区没有被正确清除,因此第二个命令的一部分丢失了。
您可以在写入第一个命令后尝试手动刷新缓冲区:
session.write(command.encode() + b"\r\n")
session.get_socket().flush()
这可能是一个愚蠢的答案,但值得一试。尝试新的会话
command = "$SENSOR,STATUS,192.168.200.53"
session = telnetlib.Telnet("192.168.200.10", 9000, 20)
write_and_read(session, command, 0, 2)
session.close()
session = telnetlib.Telnet("192.168.200.10", 9000, 20)
write_and_read(session, command, 0, 2)
session.close()
您似乎正在尝试重用之前失败的会话