繁体   English   中英

在Python中为TCP通信编码字符串时出现问题

[英]Problems encoding string for TCP Communication in Python

集体互联网

我是一个非常新的程序员,给了我一个专门的项目来教自己编程。 我使用许多可以接收TCP命令的设备,因此我着手构建一个按钮系统,该系统将为每个按钮发送不同的命令。 我给自己买了Raspberry Pi 3b,并上了Python在线课程。 我已经靠自己了很多(按我想要的按钮工作了!),但是我一直被困的是发送TCP命令。

更具体地说:我正在发送数据并且正在接收数据,但是string命令未正确编码。 当我在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')

我的脚本的Wireshark日志

这是成功的telnet会话的wireshk输出:

telnet会话的Wireshark日志

任何和所有帮助表示赞赏。 我四处张望,似乎找不到与我相似的案例。

编辑:对不起,格式不正确。 我感谢有关如何更好地展示帖子的建议。 这是我在这里的第一篇文章,而我对此很了解。 由于我在这里的特权不足,我的照片仍然是链接。 抱歉,如果我太罗word,我只是想提供尽可能多的信息,以帮助人们理解我的问题,如果找到了解决方案,则可以帮助有类似问题的人们找到此问题。

telnet tcp数据包括回车符和换行符以及数据的结尾。 显然,接收部分需要包含此内容以使工作正常。 因此,将您的Python字符串更改为b'setInput "One" 1\\r\\n'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM