rtl_433 on raspberry pi:通过 http post 将数据发送到 api
rtl_433 on raspberry pi: Send data to api via http post
我正在通过我的 raspberry pi 上的加密狗从我的气象站接收天气数据,该加密狗通过 wifi 连接互联网。现在我想将此数据发送到 rails api/app 以将其保存在数据库中。 rails 应用 运行 在另一台服务器上,所以我想 post 通过 http 获取数据。
我怎样才能做到这一点。我无法将 curl 依赖项添加到 rtl_433 项目 (https://github.com/merbanan/rtl_433) 以将数据直接发送到我的后端。例如,我是否可以使用 python 脚本 运行 rtl_433 运行
rlt_433 -F json
并将该输出发送到我的后端或者如何我意识到了?
您应该能够使用 subprocess 模块将 rtl_433
作为子进程执行。通常你只会使用 subprocess.run
,但由于 rtl_433
产生输出直到它被杀死,你将需要使用 subprocess.Popen
并解析输出。
另一种选择是将 rtl_433
的输出通过管道传输到您的程序,并使用 input()
或 sys.stdin.readline()
来读取行。喜欢 rtl_433 -flags | python3 script.py
.
我现在想通了,如何从子进程中获取数据并一直监听:
我安装了 python 3.8
以正确使用 datetime
库。 version >= python 3.7
支持这种方法
我创建了一个 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
并获取气象站发送的所有数据
我正在通过我的 raspberry pi 上的加密狗从我的气象站接收天气数据,该加密狗通过 wifi 连接互联网。现在我想将此数据发送到 rails api/app 以将其保存在数据库中。 rails 应用 运行 在另一台服务器上,所以我想 post 通过 http 获取数据。
我怎样才能做到这一点。我无法将 curl 依赖项添加到 rtl_433 项目 (https://github.com/merbanan/rtl_433) 以将数据直接发送到我的后端。例如,我是否可以使用 python 脚本 运行 rtl_433 运行
rlt_433 -F json
并将该输出发送到我的后端或者如何我意识到了?
您应该能够使用 subprocess 模块将 rtl_433
作为子进程执行。通常你只会使用 subprocess.run
,但由于 rtl_433
产生输出直到它被杀死,你将需要使用 subprocess.Popen
并解析输出。
另一种选择是将 rtl_433
的输出通过管道传输到您的程序,并使用 input()
或 sys.stdin.readline()
来读取行。喜欢 rtl_433 -flags | python3 script.py
.
我现在想通了,如何从子进程中获取数据并一直监听:
我安装了
支持这种方法python 3.8
以正确使用datetime
库。version >= python 3.7
我创建了一个 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
并获取气象站发送的所有数据