为什么这段代码在Python中不起作用,但在telnet中可以?

1 投票
2 回答
552 浏览
提问于 2025-04-18 11:31

我想做一个图形界面(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'))

撰写回答