You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

rtl_433命令输出无法通过管道传入PHP脚本问题求助

问题解决:rtl_433管道输出无法被PHP脚本接收

问题现象

  • 测试命令 echo TEST | php sensors.php 正常运行,PHP脚本可接收并输出数据;
  • 执行 rtl_433 -f 344975000 -F json -M utc | php sensors.php 时,PHP仅输出 STARTING PHP SCRIPT,无法接收rtl_433的JSON数据;
  • 单独执行rtl_433命令可正常输出Honeywell-Security设备的JSON格式传感器数据。

原PHP代码:

<?php
echo "STARTING PHP SCRIPT" . PHP_EOL;
$data = stream_get_contents(STDIN);
echo "DATA FROM PHP SCRIPT IS: " . $data . PHP_EOL;
?>

问题原因

stream_get_contents(STDIN) 会阻塞进程直到输入流完全关闭才会读取全部内容。而rtl_433是持续监听传感器的程序,会不断输出JSON数据且不会主动终止进程,导致输入流一直处于打开状态,PHP脚本会卡在读取步骤,无法执行后续输出。

而echo TEST是一次性输出数据后立即终止进程,输入流随之关闭,所以PHP能正常读取到数据。

解决方案

方案1:逐行读取实时数据(推荐)

修改PHP脚本为逐行读取标准输入,适配rtl_433的持续输出特性:

<?php
echo "STARTING PHP SCRIPT" . PHP_EOL;
// 循环读取每一行输入,直到流关闭
while (($line = fgets(STDIN)) !== false) {
    $trimmedLine = trim($line);
    echo "RECEIVED JSON: " . $trimmedLine . PHP_EOL;
    
    // 可选:解析JSON为数组处理
    $sensorData = json_decode($trimmedLine, true);
    if ($sensorData) {
        echo "PARSED SENSOR DATA: " . print_r($sensorData, true) . PHP_EOL;
    }
}
?>

执行原命令即可实时接收每一条传感器数据。

方案2:让rtl_433主动终止输出

如果需要一次性读取所有数据,可限制rtl_433的运行时间,比如用timeout命令让它运行10秒后终止:

timeout 10 rtl_433 -f 344975000 -F json -M utc | php sensors.php

或者使用rtl_433的-t参数(测试模式,默认运行60秒后退出):

rtl_433 -f 344975000 -F json -M utc -t | php sensors.php

此时rtl_433终止后输入流关闭,PHP脚本会读取到所有输出数据并执行后续打印。

内容的提问来源于stack exchange,提问作者Jrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:15:10