如何修复此 python telnet 代码以第二次向设备发送命令?

问题描述 投票:0回答:2

在 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'

然后它会无限期地阻塞。

python telnet
2个回答
0
投票

可能是在第一个命令之后缓冲区没有被正确清除,因此第二个命令的一部分丢失了。

您可以在写入第一个命令后尝试手动刷新缓冲区:

session.write(command.encode() + b"\r\n")
session.get_socket().flush()

0
投票

这可能是一个愚蠢的答案,但值得一试。尝试新的会话

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()

您似乎正在尝试重用之前失败的会话

© www.soinside.com 2019 - 2024. All rights reserved.