You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:30:31