У меня есть малина с 2 php-страницами в / var / www, одна — led1off.php, другая — led1on.php. У меня также есть 2 скрипта Python в cgi-bin led1off.py & led1on.py
led1off.py
#!/usr/bin/env python
Import serial
ser0 = serial.Serial('/dev/ttyACM0'), 9600)
ser0.write('2')
led1on.py
#!/usr/bin/env python
Import serial
ser0 = serial.Serial('/dev/ttyACM0'), 9600)
ser0.write('1')
—
led1on.php
<?php
exec('sudo -u www-data python /usr/lib/cgi-bin/led1on.py')
?>
led1off.php
<?php
exec('sudo -u www-data python /usr/lib/cgi-bin/led1off.py')
?>
Что должно произойти в теории, когда я загружаю http://192.168.0.2/led1on.php
Скрипт php должен запустить свой код в терминале, чтобы он выполнял led1on.py.
Затем led1on.py должен отправить «1» в arduino, который включает светодиод.
Аналогичная вещь идет для led1off.php.
Дело в том, что я могу печатать
sudo -u www-data python /usr/lib/cgi-bin/led1on.py
В терминале, и когда я это делаю, загорается светодиод на ардуино. Таким образом, код на Arduino правильный, между 2 есть связь, и код Python правильный. Проблема в том, что он не работает, когда я загружаю php из браузера. Я делаю что-то неправильно? Нужно ли давать специальные разрешения для www-данных для отправки последовательных данных?
Для запуска команды от имени суперпользователя www-data
должен быть в /etc/sudoers
— не могли бы вы проверить, если это там?
Подобный вопрос был задан здесь: sudo в php exec ()
Как мы выяснили во время обсуждения, этот код будет работать правильно:
<?php
$command = escapeshellcmd('sudo /usr/lib/cgi-bin/led1on.py');
$output = shell_exec($command);
echo $output;
?>
Надеюсь это поможет.
Других решений пока нет …