问题描述
我的总体目标: 我有一个硬件设备,可以将传感器数据传输到运行 Python 脚本的 Ubuntu 笔记本电脑。数据每 2 秒以 240 个样本(每行一个,带有 \n)的块形式出现并打印到标准输出。我在 Ubuntu 笔记本电脑上启动 Python 脚本,并使用 netcat 将其输出通过管道传输到 TCP 端口。我从网络上的任何其他设备连接到该 TCP 端口并获取实时数据流 - 无需先加载所有以前的样本。
我的设置: 两台笔记本电脑。
1:Ubuntu 从传感器收集读数,并将这些读数通过管道传输到 TCP 端口 1234。(这是有效的。)$ py read_sensors.py | nc -lk 1234
2:Windows 10,具有 WSL、Python 和用于处理从第一台笔记本电脑流式传输的数据的现有脚本。 (这在 WSL 中有效)$ nc 10.10.10.01 1234
我的问题: 我开始在 Ubuntu 笔记本电脑上传输传感器数据。 10 分钟后,我从 Windows 笔记本电脑连接到该流...
我希望在建立连接时收到最新的样本,以及(伪)实时的所有后续样本。
相反,一旦我连接上,我就会收到自我在 Ubuntu 笔记本电脑上开始流式传输管道以来收集的所有样本,一旦它赶上来,我就会开始看到实时数据。
我尝试过: 搜索使我尝试了 stdbuf。由于缺乏结果,我尝试了 $ stdbuf -oL py read_sensors.py | nc -lk 1234
$ py read_sensors.py | stdbuf -oL nc -lk 1234
的各种组合,但每次我稍等片刻然后从我的 Windows 笔记本电脑连接到端口时,它就会加载从我开始在Ubuntu 笔记本电脑。
我假设:这是一个缓冲问题,必须在 Ubuntu 机器上修复 - 但是 stdbuf 的各种组合对系统的行为没有任何影响。所以,我向诸神寻求洞察力和恩典:)
-尼克
解决方法
这样的事情可能会达到总体目标。基于https://docs.python.org/3/library/socketserver.html#socketserver-tcpserver-example
import socketserver
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
bytes = read_sensor_data() # call the code that reads the sensors
self.request.sendall(bytes)
if __name__ == "__main__":
with socketserver.TCPServer(("localhost",1234),MyHandler) as server:
server.serve_forever()
,
禁用 netcat 缓冲:
Force netcat to send messages immediately (without buffering)
或者,我相信如果您使用 bash 的内置 tcp 连接绕过 netcat,它会起作用。例如。 read_sensors.py > /dev/tcp/10.10.10.1/1234
编辑:添加了显示如何发送和接收的示例代码。
示例代码:
发送:
#!/bin/bash
while true
do
date > /dev/tcp/localhost/1234 || true # replace date command with read_sensors.py
sleep 1
done
接收:
ubuntu@ubuntu:~$ nc -lk 1234
输出:
Tue Mar 2 20:40:24 UTC 2021
Tue Mar 2 20:40:25 UTC 2021
Tue Mar 2 20:40:26 UTC 2021
Tue Mar 2 20:40:27 UTC 2021
^C
ubuntu@ubuntu:~$ nc -lk 1234
Tue Mar 2 20:40:40 UTC 2021
Tue Mar 2 20:40:41 UTC 2021
注意,当我点击控件 C 时有 13 秒的间隔,没有数据发送或缓冲。