rtl_433输出JSON经管道传curl POST无响应,求排查方法
解决rtl_433 JSON输出无法通过curl POST到服务器的问题
可能的原因及对应解决方案
1. 输出缓冲问题(最常见)
rtl_433输出到管道时默认采用全缓冲模式,不会实时将数据传递给curl,而是要等缓冲区填满才会输出(但输出到终端是行缓冲,所以你能看到实时内容)。这会导致curl一直拿不到数据发送给服务器。
解决方法:
- 用
stdbuf强制rtl_433使用行缓冲输出:stdbuf -oL rtl_433 -F json | curl -H "Content-Type: application/json" -X POST -d @- 123.123.123.123:5124-oL参数指定标准输出采用行缓冲。 - 或者用
unbuffer(需先安装expect包:sudo apt install expect):unbuffer rtl_433 -F json | curl -H "Content-Type: application/json" -X POST -d @- 123.123.123.123:5124
2. 过滤非JSON输出
rtl_433启动时会输出初始化日志、版本信息等非JSON内容,这些无效数据会导致curl发送的请求不符合服务器的JSON格式要求,被服务器丢弃。
解决方法:用grep只保留以{开头的有效JSON行:
stdbuf -oL rtl_433 -F json | grep '^{' | curl -H "Content-Type: application/json" -X POST -d @- 123.123.123.123:5124
3. 每条JSON单独发送请求
如果服务器期望每次接收单条JSON数据,而不是多条JSON拼接的内容,上面的命令会因格式错误被拒收。此时需要对每行JSON单独发起POST请求:
stdbuf -oL rtl_433 -F json | grep '^{' | while read -r line; do curl -H "Content-Type: application/json" -X POST -d "$line" 123.123.123.123:5124 done
4. 验证JSON输出的有效性
先单独运行rtl_433 -F json,确认每一行都是合法的JSON格式(无语法错误如多余逗号、未闭合括号)。也可以用jq工具验证:
rtl_433 -F json | jq .
如果jq报错,说明输出的JSON存在格式问题,需要检查传感器数据或rtl_433配置。
内容的提问来源于stack exchange,提问作者Garry Pettet
相关产品推荐
相关产品推荐

