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

基于Python计算树莓派与PC局域网连接的RTT技术问询

解决树莓派与PC局域网RTT计算的问题

看起来你已经找对了用时间戳计算往返时间的方向,但目前的代码存在几个关键问题,导致没法正常工作。我来帮你梳理并修正:

原代码的核心问题

  • 服务端解码拼写错误:data.decoode('utf-8') 里的 decoode 是笔误,应该是 decode;而且你后面直接用 float(data) 转换字节对象,这会报错,必须先解码成字符串再转浮点数。
  • 客户端逻辑缺失:客户端只写了接收数据的代码,没有把收到的时间戳回发给服务端,服务端会一直卡在 recv 步骤,根本没法计算RTT。
  • RTT计算逻辑颠倒:原代码里 float(data) - time.time() 会得到负数(因为发送时间戳是过去的时间),正确的计算应该是服务端收到回复的当前时间 - 最初的发送时间。

修正后的完整实现

我们用UDP套接字来实现(你的代码里用了 sendto/recv,UDP更适合这种轻量的时延测试):

服务端代码(PC或树莓派都可运行)

import socket
import time

# 创建UDP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP和端口,0.0.0.0表示监听所有网卡
server_addr = ('0.0.0.0', 12345)
server_socket.bind(server_addr)

print("等待客户端连接...")
while True:
    # 先接收客户端的初始请求(用来确认客户端在线)
    _, client_addr = server_socket.recvfrom(1024)
    print(f"已连接客户端: {client_addr}")
    
    # 记录发送时间戳T1
    send_time = time.time()
    # 发送时间戳给客户端
    server_socket.sendto(str(send_time).encode('utf-8'), client_addr)
    
    # 等待客户端回发的时间戳
    data, _ = server_socket.recvfrom(1024)
    if not data:
        break
    # 解码收到的时间戳(就是我们之前发的T1)
    received_send_time = float(data.decode('utf-8'))
    # 计算RTT:收到回复的时间T2 - 发送时间T1
    rtt = time.time() - received_send_time
    print(f"往返时间(RTT): {rtt:.4f} 秒")

客户端代码(运行在另一端设备)

import socket
import time

# 替换成服务端的实际局域网IP和端口
server_addr = ('192.168.1.100', 12345)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 发送初始请求,触发服务端发送时间戳
client_socket.sendto(b"start", server_addr)

while True:
    # 接收服务端发来的时间戳
    data, _ = client_socket.recvfrom(1024)
    if not data:
        break
    # 立刻把收到的时间戳回发给服务端
    client_socket.sendto(data, server_addr)
    # 可选:打印单程时间(客户端接收时间 - 服务端发送时间)
    recv_time = time.time()
    send_time = float(data.decode('utf-8'))
    print(f"单程时间: {recv_time - send_time:.4f} 秒")
    # 加个延迟避免频繁发送
    time.sleep(1)

关键说明

  1. RTT定义:这里计算的RTT是从服务端发送时间戳开始,到收到客户端回发数据为止的总时间,包含了数据包在局域网的往返传输时间,以及客户端的极简处理时间(几乎可忽略)。
  2. 时间同步问题:如果树莓派和PC的系统时间有偏差,会影响单程时间的准确性,但RTT计算不受影响(因为用的是服务端自身的时间戳)。如果需要更精准的单程时间,可以先通过NTP同步两台设备的系统时间。
  3. UDP可靠性:UDP是无连接协议,可能出现丢包,你可以根据需求加入重试机制或丢包统计逻辑。
  4. 配置注意:记得把客户端代码里的服务端IP换成实际的局域网IP(比如树莓派的IP通常是192.168.1.xxx格式),端口要和服务端保持一致。

内容的提问来源于stack exchange,提问作者dapperdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:07:30