集体互联网,
我是一个非常新的程序员,给自己一个特定的项目来自学编码。我使用了许多可以接受TCP命令的设备,因此我开始构建一个按钮系统,每个按钮会发送不同的命令。我得到了一个Raspberry Pi 3b,并参加了Python的在线课程。我自己已经相当遥远了(我按钮按照我想要的方式工作!)但我遇到的就是发送TCP命令。
更具体一点:我正在发送数据并且正在接收但是字符串命令没有被正确编码。当我在telnet会话中执行它们时,命令是有效的,但显然我希望它们作为我的脚本的一部分执行。命令不指定需要通过telnet会话接收它们,并且通过其他方式,我已经将这些命令用作telnet会话外部的TCP命令。我读到了关于Python的telnet模块,但我认为我不应该需要它。
我使用wireshark验证了数据包传送。我捕获了我的脚本发送的数据包和telnet会话发送的数据包,它们相似但不相同。马蹄铁和手榴弹,对吗?我目前的方法是用小写字母b前面的字符串(在'内)。我也尝试在字符串后放置.encode()(在那种情况下省略b)。
string命令的格式为:
setInput "InputName" Value
因此,对于我的用例,我设置名为" One"的输入。值为1:
setInput "One" 1
因此,您可以在我的脚本中看到(在下面插入),我最终使用了:
s.sendall(b'setInput "One" 1')
但它并没有发送正确的信息,因为它不起作用,并且在wireshark中看起来并不相同。
TL; DR:我试图通过TCP发送数据包,但它们没有被正确编码。
最终,我的问题是,如果我甚至使用这些命令朝着正确的方向前进,只需要一种不同的方法来编码字符串,或者我是否需要完全探索另一个方向(也许是telnet模块?)< / em>的
以下是我用来测试的脚本和我脚本的wireshark输出:
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.100.40', 3040))
print('connected')
time.sleep(2)
s.sendall(b'setInput "One" 1')
print('sent increase')
time.sleep(2)
s.sendall(b'setInput "One" 0')
print('sent decrease')
以下是成功的telnet会话的wireshark输出:
Wireshark log of the telnet session
感谢任何和所有帮助。我看得远远不够,似乎找不到与我相似的任何案件。
编辑:抱歉格式不佳。我很欣赏有关如何更好地发表帖子的建议。这是我在这里发表的第一篇文章,我只是掌握了它。由于我在这里缺乏特权,我的照片仍然是链接。对不起,如果我太罗嗦,我只想提供尽可能多的信息,以帮助人们了解我的问题,如果找到解决方案,帮助有类似问题的人找到这个。
答案 0 :(得分:1)
telnet tcp数据包括回车符和换行符以及数据的结尾。显然,接收部分需要包含它以使事情有效。所以将Python字符串更改为
b'setInput "One" 1\r\n'