为什么这段代码在Python中不起作用,但在telnet中可以?
我想做一个图形界面(GUI)来控制一个树莓派机器人。我通过telnet无线连接到它。当我在电脑的终端上用telnet连接时,我可以运行 echo 1=230 > /dev/servoblaster
来让一个伺服电机动起来。
不过,当我在Python的图形界面中使用同样的代码时,伺服电机却没有动,甚至没有出现错误信息。之前一切都正常,但突然间就不行了。
下面是我用来做图形界面的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'))
有没有人能帮我弄明白,为什么在终端连接到机器人时我可以控制它,但用上面的代码运行同样的命令时却什么都没有发生,连错误信息都没有。
顺便说一下,我知道上面的代码至少能到达我的树莓派的无线接收器,因为每次它收到信号时,接收器上的灯都会闪烁。
谢谢
2 个回答
2
我建议你使用Wireshark来查看你的客户端到底发送了什么,以及你的树莓派是怎么回应的。
我非常怀疑你遇到的问题是因为你在等待错误的模式——比如说,它可能是b'Login: '
,或者b'login:'
,或者其他什么东西。而这个模式可能会随着你更新getty
或类似的程序而改变,Wireshark可以帮助你找到问题所在。
如果你只想查看树莓派上的telnet流量,可以使用以下捕获过滤器:
host 192.168.1.128 and port 23
3
你在输入用户名和密码的时候,空格会导致你的telnet连接无法成功登录到pi机器人。那些空格是不能被忽略的。
你需要:
bot.read_until(b"login: ")
bot.write("pi\n".encode('ascii'))
bot.read_until(b"Password: ")
bot.write("pi\n".encode('ascii'))