1

我正在使用我的树莓派上的加密狗从气象站接收天气数据,该加密狗通过 wifi 连接互联网。现在我想将此数据发送到 rails api/app 以将其保存在数据库中。rails 应用程序在另一台服务器上运行,所以我想通过 http 发布数据。我怎样才能做到这一点。我无法将 curl 依赖项添加到 rtl_433 项目 ( https://github.com/merbanan/rtl_433 ) 以将数据直接发送到我的后端。例如,我是否能够使用 python 脚本运行 rtl_433,例如:
rlt_433 -F json并将该输出发送到我的后端,或者我怎么能意识到这一点?

4

2 回答 2

1

您应该能够使用subprocess模块rtl_433作为子流程执行。通常你只会使用,但由于在它被杀死之前会产生输出,所以你需要使用和解析输出。subprocess.runrtl_433subprocess.Popen

另一种选择是将输出通过管道rtl_433传输到您的程序并使用input()sys.stdin.readline()读取行。喜欢rtl_433 -flags | python3 script.py

于 2021-01-30T16:13:42.157 回答
0

我现在想通了,如何从子进程中获取数据并一直收听

  1. 我安装正确python 3.8使用该datetime库。这种方法支持version >= python 3.7

  2. 我创建了一个 python 脚本,正在监听我的rtl_433命令的输出。如您所见,我正在使用:rtl_433 -f 868.300M -F json.

这是我的listener.py

import subprocess
import json
import datetime
from threading import Thread

def parse(printed_text):
    # here you can parse your string input from the subprocess

# sending to api
def sendToApi(text):
    parsed_json = parse(text)
    result = <send_to_api(parsed_json)> # here your http.post
    print(result)

# This method creates a subprocess with subprocess.Popen and takes a List<str> as command
def execute(cmd):
    popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)
    for stdout_line in iter(popen.stdout.readline, ""):
        yield stdout_line 
    popen.stdout.close()
    return_code = popen.wait()
    if return_code:
        raise subprocess.CalledProcessError(return_code, cmd)

for json in execute(['/path/to/rtl_433/build/src/rtl_433', '-f','868.300M', '-F', 'json']):
    print(text, end="")
    # I'm starting a new thread to avoid data loss. So I can listen to the weather station's output and send it async to the api
    thread = Thread(target = sendToApi, args = (text,))
    thread.start()

之后我可以使用:

python3.8 listener.py并获取气象站发送的所有数据

于 2021-10-05T09:32:22.483 回答