【问题标题】:Problems encoding string for TCP Communication in PythonPython中TCP通信的字符串编码问题
【发布时间】: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')

Wireshark log of my script

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

Wireshark log of the telnet session

我们不胜感激。我四处张望,似乎找不到任何与我相似的案例。

编辑:很抱歉格式不佳。我很欣赏关于如何更好地展示帖子的建议。这是我在这里的第一篇文章,我只是在掌握它。由于我在这里没有权限,我的照片仍然是链接。对不起,如果我太罗嗦了,我只是想提供尽可能多的信息,以帮助人们理解我的问题,如果找到解决方案,帮助有类似问题的人找到这个。

【问题讨论】:

  • 贴实际代码,不是图片
  • 你有脚本链接的地方,请复制粘贴实际代码。
  • 请更加综合,选择并突出显示特定问题,以便人们可以帮助您,而无需花费数小时试图消化多余的信息。这些mcve guidelines 可能有用...

标签: python sockets encoding tcp telnet


【解决方案1】:

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

【讨论】:

  • 非常感谢你,吨!我想我曾尝试回车,但我忘记了换行!那 100% 解决了我的问题。
猜你喜欢
  • 2014-01-08
  • 2012-02-22
  • 2020-04-04
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2015-04-04
相关资源
最近更新 更多