为什么这个代码不能在python中工作,但是当我telnet时呢?

时间:2014-06-29 21:59:18

标签: python python-3.x raspberry-pi telnet telnetlib

我想做的是制作一个GUI来控制树莓派机器人。我有telnet无线连接到它。当我从计算机上的终端telnet到它时,我可以运行echo 1=230 > /dev/servoblaster使其中一个伺服器移动。

然而,当在python GUI中使用相同的代码时,它不会使伺服移动,但我也不会收到错误消息。有一次,它一切正常,但突然间它停了下来。

下面是我用于GUI的python脚本的简化版本:

from tkinter import *
import telnetlib

bot = telnetlib.Telnet("192.168.1.128")
bot.read_until(b"login: ")
bot.write(("pi \n").encode('ascii'))
bot.read_until(b"Password: ")
bot.write(("pi \n").encode('ascii'))
bot.write(("cd /home/pi/pibits/ServoBlaster/user \n").encode('ascii'))
bot.write(("sudo ./servod \n").encode('ascii'))
bot.write(("cd \n").encode('ascii'))

bot.write(("echo 1=230 > /dev/servoblaster \n").encode('ascii'))

有人能够帮我解决为什么当我从终端连接到机器人时我可以控制它但是当使用上面的代码运行相同的命令时没有任何反应,甚至没有错误消息。

以防这是有用的,我知道上面的代码至少到达我的覆盆子pi的无线接收器,因为每次接收信号时它上面的灯都会闪烁。

由于

2 个答案:

答案 0 :(得分:3)

用户名和密码命令中的空格使您的telnet会话不会实际登录到pi bot。这些空间不会被忽略。

你需要:

bot.read_until(b"login: ")
bot.write("pi\n".encode('ascii'))
bot.read_until(b"Password: ")
bot.write("pi\n".encode('ascii'))

答案 1 :(得分:2)

我建议您使用Wireshark来确定客户实际发送的内容以及您的Raspberry Pi响应的内容。

我强烈怀疑你的问题的原因是你在等待错误的模式 - 例如它可能是b'Login: ',或b'login:'或其他任何内容,并且可能会因更新您的getty或类似二进制文件而发生变化,而Wireshark将帮助您本地化您的问题。

要仅使用Pi框查看telnet流量,请使用以下捕获过滤器:

host 192.168.1.128 and port 23