如果是单个设备,您应该使用为您处理低级socket
交互的解决方案... python 有几个 like pexpect
,exscript或paramiko
(仅限 ssh) ... 如果它是多个设备并且您需要异步通信,使用@zeekay 的答案(虽然异步编程,特别是扭曲的,如果你还不熟悉它,是不愉快的)。
我用你 telnet 的方式回答了一个问题,并将命令列表发送到这里的单个设备......
在预期中捕捉到一个垂死的过程
上面的答案使代码高效,但对于初学者来说更难理解……下面的代码更简单,它在 TCP/23 上建立一个 telnet 连接,等待*
,发送一个命令,并将响应放入命令在mydata1
...
import pexpect as px
import sys
def send_this(child, retcode, COMMAND):
if retcode == 2:
child.sendline(COMMAND)
else:
raise RuntimeError, "Could not complete login, due to socket error"
def expect_this(child, EXPR, timeout = 10):
return child.expect([px.TIMEOUT, px.EOF, EXPR], timeout = timeout)
HOST = '192.168.49.49'
CMD1 = '1I'
PROMPT = '\*' #Note: you might not need the backslash
TIMEOUT = 10
child = px.spawn('telnet %s' % HOST)
retcode = expect_this(child, PROMPT)
send_this(child, retcode, CMD1)
retcode = expect_this(child, PROMPT)
mydata1 = child.before # mydata has the output from CMD1
不管解决方案如何,最重要的是调整超时,这样您就不必担心长时间的蜂窝网络延迟(根据我的经验,有时会超过 5 秒)。
蜂窝通信中的另一个令人讨厌的动态是,许多消费者设备在移动时会定期更改其 IP 地址(由于它们对 dhcp 的依赖)......如果发生这种情况,TCP 无能为力......如果你不这样做' t 具有静态地址,当设备提取新的 IP 地址时,连接将断开。