通八洲科技

php读取红外遥控信号怎么弄_php捕获红外接收头的解码数据【操作】

日期:2025-12-31 00:00 / 作者:雪夜
PHP无法直接读取红外接收头GPIO信号,必须通过lirc+irw或Python+RPi.GPIO等底层程序解码后,再由PHP调用命令行或读取共享文件/Redis获取结果。

PHP 本身无法直接读取红外接收头的 GPIO 信号

PHP 是服务端脚本语言,没有内置能力访问树莓派或嵌入式设备的物理引脚(如 GPIO18)。所谓“PHP 读红外”,本质是让底层 C/Python 程序完成硬件交互,再把解码结果通过文件、Socket 或 HTTP 接口暴露给 PHP。直接在 php-fpmApache 进程里调用 gpio readpoll() 会失败——权限、实时性、中断响应都不支持。

推荐方案:用 lirc + irw 做解码,PHP 调用命令行读取

这是最稳定、兼容性最好的路径。前提是你的红外接收头已接在树莓派 GPIO(通常为 GPIO18),且 lirc 已正确配置驱动(lirc_rpigpio-ir-recv)和遥控配置文件(/etc/lirc/lircd.conf.d/*.conf)。

#!/usr/bin/env php
 ['pipe', 'w'],
    2 => ['pipe', 'w']
], $pipes);

if (is_resource($handle)) {
    stream_set_blocking($pipes[1], false); // 非阻塞读
    while (true) {
        $line = fgets($pipes[1]);
        if ($line !== false && trim($line)) {
            preg_match('/\s+(\w+)\s+(\w+)$/', $line, $m);
            if (isset($m[1], $m[2])) {
                echo "Button: {$m[1]}, Code: {$m[2]}\n";
                // 可写入 Redis / 文件 / 触发 API
            }
        }
        usleep(10000); // 10ms 间隔防 CPU 占满
    }
    proc_close($handle);
}
?>

绕过 lirc:用 Python + RPi.GPIO 捕获原始脉冲,PHP 读取共享文件

适合需要自定义协议(比如非 NEC 的私有红外编码)、或想避开 lirc 配置复杂性的场景。但要求你懂红外载波、脉冲宽度判别逻辑,且 Python 进程需以 root 权限运行。

关键点:RPi.GPIO 在树莓派上对 50μs 级脉冲精度有限,NEC 协议通常可稳定识别;但 Sony、RC5 等短周期协议容易丢边沿。

常见失败原因和必须检查项

90% 的问题出在硬件层或权限控制,而非 PHP 代码本身:

红外信号易受环境光干扰,调试时关掉日光灯、拉上窗帘;同一空间多个红外设备会互相串扰,这是物理限制,PHP 层没法解决。