【发布时间】:2018-02-18 10:51:27
【问题描述】:
集体互联网,
我是一个非常新的程序员,给了自己一个特定的项目来自学编码。我使用许多可以接受 TCP 命令的设备,因此我着手构建一个按钮系统,每个按钮将发送不同的命令。我给自己买了一个 Raspberry Pi 3b,并参加了 Python 在线课程。我自己已经走得很远了(我已经让按钮按我想要的方式工作了!)但是我被卡住的地方是发送 TCP 命令。
更具体地说:我正在发送数据并且正在接收数据,但字符串命令未正确编码。当我在 telnet 会话中执行命令时,这些命令是有效的,但显然我希望它们作为脚本的一部分执行。这些命令没有指定它们需要通过 telnet 会话接收,并且通过其他方式,我已经让这些命令作为 telnet 会话外部的 TCP 命令工作。我读到了 Python 的 telnet 模块,但我认为我不需要它。
我用wireshark验证了数据包的传递。我捕获了脚本发送的数据包和 telnet 会话发送的数据包,它们相似但不相同。马蹄铁和手榴弹,对吧?我目前的方法是在字符串(在'内)前加上小写b。我还尝试将 .encode() 放在字符串之后(在这种情况下省略 b)。
字符串命令的格式为:
setInput "InputName" Value
所以对于我的用例,我将名为“One”的输入设置为值 1:
setInput "One" 1
所以你可以在我的脚本中看到(插入下面)我最终使用了:
s.sendall(b'setInput "One" 1')
但它发送的信息并不完全正确,因为它不工作而且在wireshark 中看起来也不一样。
TL;DR:我正在尝试通过 TCP 发送数据包,但它们没有被正确编码。
最终,我的问题是,我是否使用这些命令朝着正确的方向前进,并且只需要一种不同的方式来对字符串进行编码,或者我是否需要完全探索另一个方向(也许是 telnet 模块?)
这是我一直用来测试的脚本和我的脚本的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
我们不胜感激。我四处张望,似乎找不到任何与我相似的案例。
编辑:很抱歉格式不佳。我很欣赏关于如何更好地展示帖子的建议。这是我在这里的第一篇文章,我只是在掌握它。由于我在这里没有权限,我的照片仍然是链接。对不起,如果我太罗嗦了,我只是想提供尽可能多的信息,以帮助人们理解我的问题,如果找到解决方案,帮助有类似问题的人找到这个。
【问题讨论】:
-
贴实际代码,不是图片
-
你有脚本链接的地方,请复制粘贴实际代码。
-
请更加综合,选择并突出显示特定问题,以便人们可以帮助您,而无需花费数小时试图消化多余的信息。这些mcve guidelines 可能有用...
标签: python sockets encoding tcp telnet