如果只有一个设备,您应该使用处理低级socket
交互的解决方案... Python 有几个类似pexpect
, exscript, 或者 paramiko
(仅限ssh)... 如果有多个设备并且需要异步通信,请使用@zeekay的答案(尽管异步编程,特别是使用twisted,如果您不熟悉它,可能会很困难)。
我在这里回答了一个关于如何通过telnet发送命令到单个设备的问题...
Catching a dying process in pexpect
上面的答案使代码更高效,但对于初学者来说更具挑战性... 下面的代码更简单,它在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 = '\*'
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
无论解决方案如何,最重要的是调整超时时间,这样您就不必担心长时间的蜂窝网络延迟(在我的经验中有时超过5秒)。
移动通信中的另一个令人讨厌的动态是,许多消费设备在移动时会
定期更改其IP地址(由于它们依赖dhcp)...如果发生这种情况,TCP无能为力...如果您没有静态地址,则连接将在设备拉取新的ip地址时断开。