从PHP运行脚本时,RPi GPIO控件丢失(没有任何错误)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从PHP运行脚本时,RPi GPIO控件丢失(没有任何错误)相关的知识,希望对你有一定的参考价值。

我一直在创建一个小程序,允许我通过Python控制GPIO引脚。一切顺利。当我尝试从php调用此python脚本时会发生此问题。似乎松散的功能来控制GPIO引脚,并且无任何错误地静默崩溃。

存在以下文件:

  • RRR.py - 丢失权限的主要文件
  • configCreator.py - 生成一个config.ini文件
  • RRR.py文件使用 config.ini - 已生成的配置 install.py - 安装apache2和php并生成一个链接到RRR.py文件的网页。 index.php - 只包含表单的简单页面 control.php - 文件使用GET检索变量并构建执行命令。

运行python3 RRR.py -c ON -r 5的示例命令时,它可以正确控制第5个设备映射的引脚。

我可以通过放置以下URL来获得相同的命令 - > 192.168.x.x/control.php?com=ON&dev=5 PHP回显显示我$command var保存以下python3 RRR.py -c ON -r 5

我使用PHP使用以下命令执行此命令 - > $output = shell_exec($command);然后使用 - > echo "<pre>$output</pre>"查看输出

我得到以下输出:

Sending command (ON) to device (5)
Performing operation. This will take 1 second(s)...
Please wait...

这是当GPIO引脚从RRR.py文件中的以下行控制的时候:

 GPIO.setup(devPin, GPIO.OUT)
 GPIO.output(devPin, GPIO.LOW)
 time.sleep(sleepTime)
 GPIO.output(devPin, GPIO.HIGH)

其中devPin是从config.ini得到的GPIO引脚号。不要担心这部分,它工作正常。从PHP运行时,引脚编号仍然正确。 GPIO命令根本不起作用。

这使我相信问题完全在于文件的第一行,但是,不会产生错误。第一行是:

import RPi.GPIO as GPIO

也许PHP的shell_exec没有正确的perms来使用GPi.GPIO python模块?任何人都知道如何解决这个问题?我会感激任何和所有的建议。我真的很想让这个项目工作:)


tl; dr:从命令行运行FINE,但是当从PHP调用完全相同的命令时完全中断。

答案

根据Access GPIO pins without root. No access to /dev/mem. Try running as root!你的python脚本将写入/dev/gpiomem

这不起作用,因为不允许运行python脚本(www-data)的用户写入此设备:

  • 要写在那里你需要是root或gpio组。
  • 用户www-data既不是root,也不是gpio组。

要访问gpio端口,您需要将www-data用户放在正确的组中:

sudo usermod -aG gpio www-data

不要忘记重新启动http服务器(如果适用,还可以重新启动php-fpm)。否则你不会注意到差异。

以上是关于从PHP运行脚本时,RPi GPIO控件丢失(没有任何错误)的主要内容,如果未能解决你的问题,请参考以下文章

玩转开源BananaPi R2——移植RPi.GPIO 到 R2

Python RPi - 从另一个脚本运行脚本时找不到文件

RPi 2B GPIO 测试

如何从单独的 php 脚本执行 php 脚本而不会丢失第二个脚本的输出?

树莓派瞎玩~7~RPi.GPIOのWIKI文档

Python面向树莓派使用RPi.GPIO库