我有一个应用程序,我通过 TCP/IP(或 UDP)通过 wifi 从一个树莓派(Pi 0)发送开/关信号到另一个树莓派(PI4)。我需要这种传输尽可能没有滞后。我尝试过使用 tcp/ip 和 UDP 协议,但在这两种情况下,我都看到数据接收延迟不一致。 wifi 是通过专用 wifi 路由器在本地生成的,网络上只有两个设备是 Pi。这是发送信号的 Pi 零上的代码部分:
s=socket.socket()
port=12397
s.bind(('',port))
s.listen(5)
i=0
while runserver:
try:
c,addr = s.accept()
print("Client connected")
while True:
if i==1:
i=0
else:
i=1
c.send(str(i))
time.sleep(1) #Sleep for 1 second
c.close()
except:
print("Client disconnected")
这是在接收信号的 Pi 4 上运行的代码:
host = '192.168.43.2'
port = 12397
runclient = 1
while runclient:
try:
s = socket.socket()
#This is to ensure that if the server disconnects for any reason
#the signal being sent out is reset to 2 (unknown)
s.settimeout(5.0)
s.connect((host,port))
try:
while True:
try:
flag.value = int(s.recv(1))
except socket.timeout:
flag.value = int(2)
print("Server disconnected")
break
except KeyboardInterrupt:
s.shutdown(socket.SHUT_RDWR)
s.close()
#except socket.error as e:
# print(e.args[0])
# continue
except:
print("No Server", end='\r')
flag.value = int(2)
正如您从 Pi 零代码中看到的,我每 1 秒在 1 和 0 之间翻转值。我期望在 Pi4 端看到的是每 1 秒接收到的值遵循相同的趋势。但我最终看到的是,信号变化之间的时间间隔在 0.2 到 1.5 秒之间变化,有时甚至达到 2.5 秒。我尝试将路由器尽可能靠近两个 Pi(两个 Pi 彼此之间的距离均在 4 英尺以内)。
有人知道为什么接收方会出现这种延迟吗?是wifi缓冲吗?可以采取什么措施来改善这种情况?
我尝试将套接字启动为
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
我确实看到了缓冲的改进,但我在传入数据跟踪中看到的缓冲伪影仍然存在(尽管频率要低得多)。所以我现在正在研究我可能需要在 wifi 路由器级别做些什么来改进这一点。
这里有更多信息: http://www.techrepublic.com/article/tcp-ip-options-for-high-performance-data-transmission/