繁体   English   中英

Ubuntu:Pipe 原始无缓冲数据到 TCP 端口

[英]Ubuntu: Pipe raw unbuffered data to TCP port

我的总体目标:我有一个硬件设备,可以将传感器数据流式传输到运行 Python 脚本的 Ubuntu 笔记本电脑。 数据每 2 秒以 240 个样本块(每行一个,带有 \n)的形式出现,并打印到标准输出。 I start the Python script on the Ubuntu laptop and pipe its output to a TCP port using netcat. 我从网络上的任何其他设备连接到 TCP 端口并获取实时数据 stream -无需先加载所有先前的样本

我的设置:两台笔记本电脑。

1:Ubuntu 从传感器收集读数,并将这些读数通过管道传输到 TCP 端口 1234。(这是有效的。) $ py read_sensors.py | nc -lk 1234 $ py read_sensors.py | nc -lk 1234

2:Windows 10,具有 WSL、Python 以及用于处理从第一台笔记本电脑流式传输的数据的现有脚本。 (这在 WSL 中工作) $ nc 10.10.10.01 1234

我的问题:我开始在 Ubuntu 笔记本电脑上传输传感器数据。 10 分钟后,我从我的 windows 笔记本电脑连接到 stream ......

我希望在建立连接时收到最新的样本,以及(伪)实时的所有后续样本。

相反,一旦我连接上,我就会被从 Ubuntu 笔记本电脑上开始流式传输管道以来收集的所有样本淹没,一旦它赶上,我就开始看到实时数据。

我试过了:搜索让我尝试了stdbuf。 缺乏结果导致我尝试了$ stdbuf -oL py read_sensors.py | nc -lk 1234的各种组合。 $ stdbuf -oL py read_sensors.py | nc -lk 1234 $ py read_sensors.py | stdbuf -oL nc -lk 1234 $ py read_sensors.py | stdbuf -oL nc -lk 1234但每次我稍等片刻,然后从我的 windows 笔记本电脑连接到端口,它就会加载从我开始在 Ubuntu 笔记本电脑上流式传输时开始的所有样本。

我假设:这是一个缓冲问题,必须在 Ubuntu 机器上修复 - 但 stdbuf 的各种组合对系统的行为没有任何影响。 所以,我转向 SO 神寻求洞察力和恩典:)

-缺口

这样的事情可能会达到总体目标。 基于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 缓冲:

强制 netcat 立即发送消息(不缓冲)

或者,我相信如果您使用 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

Output:

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 秒的间隙,没有数据发送或缓冲。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM