如何用Python Socket复刻Putty RAW连接实现激光设备通信?
Putty RAW连接工作原理及Python复刻实现
一、Putty RAW连接的工作原理
Putty的RAW模式是最基础的TCP流传输方式,核心特点是完全透传数据:
- 不添加任何协议层的额外数据(比如Telnet的控制码、SSH的加密握手),直接把用户输入的内容原样打包成TCP数据包发送给目标设备。
- 当你在RAW窗口输入命令并按下回车键时,Putty会自动将回车转换为对应的换行符(Windows环境下是
\r\n,即回车+换行),并将包含该结束符的完整命令作为单个数据包发送(如果内容长度小于TCP MSS的话)。 - 接收设备返回的数据时,同样直接将TCP流中的字节数据显示在窗口,不做任何转义或解析。
二、为什么你的Python代码无效?
大概率是因为设备要求命令必须携带结束符(比如回车、换行)才能识别,而你当前的代码只发送了b"ABN",缺少设备需要的命令结束标识。Putty在你按下回车时自动添加了这个结束符,所以设备能正确响应。
三、Python复刻Putty RAW的实现代码
以下代码模拟Putty RAW的透传行为,包含命令发送和回复接收:
import socket # 设备参数 DEVICE_IP = "192.168.1.223" DEVICE_PORT = 10001 # 创建TCP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置超时(可选,避免无限等待回复) sock.settimeout(5) try: # 建立连接 sock.connect((DEVICE_IP, DEVICE_PORT)) # 模拟Putty输入命令后回车的行为,发送带结束符的命令 # 优先试\r\n(Putty默认Windows换行),不行换\n command = b"ABN\r\n" sock.sendall(command) print(f"已发送命令: {command.decode('ascii')}") # 接收设备回复,缓冲区大小根据设备返回数据调整(这里设1024字节) response = sock.recv(1024) if response: print(f"设备回复: {response.decode('ascii')}") else: print("未收到设备回复") except socket.timeout: print("接收超时,请检查设备是否正常响应") except ConnectionRefusedError: print("连接失败,请检查设备IP、端口是否正确,设备是否在线") finally: # 关闭套接字连接 sock.close()
四、调试与注意事项
- 确认结束符:如果上述代码仍无效,尝试将命令改为
b"ABN\n"或b"ABN\r",不同设备对命令结束符的要求可能不同。 - 抓包对比:可以用Wireshark抓Putty和Python代码发送的数据包,对比字节内容,找出差异点。
- 编码匹配:如果设备使用非ASCII编码(比如GBK),需要调整
decode()的参数,确保正确解析回复。 - 数据包完整性:
sendall()方法会保证所有数据被发送,无需担心分包问题(设备要求单个数据包发送,只要命令长度不超过TCP最大分段大小MSS,sendall()会自动打包成单个数据包)。
内容的提问来源于stack exchange,提问作者Yly
相关产品推荐
相关产品推荐

