С помощью небольшого Python-скрипта я могу определить состояние кнопки, которая связана с моей платой Raspberry. Это скрипт:
#!/usr/bin/env python
import os
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
try:
while True:
if(GPIO.input(12) == 1):
print 'Btn on'
os.system('date')
time.sleep(5)
else:
os.system('clear')
print 'Waiting'
time.sleep(2)
except KeyboardInterrupt:
GPIO.cleanup()
Таким образом, используя PuTTY или непосредственно в терминале Raspberry, я легко могу определить состояние этой кнопки.
Теперь я бы создал то же самое, но на PHP. Мне нужно создать веб-страницу PHP, которая будет в var/www/html
каталог моей малины, и должен просто показать мне то же самое. Когда я нажимаю кнопку, я получаю простое эхо «Btn on» с отметкой времени, а если не нажата, просто еще одно эхо с «Ожиданием». Возможно ли это? Я пробовал напрямую exec
скрипт Python на PHP следующим образом:
$command = escapeshellcmd('sudo -u www-data python btn.py');
$output = shell_exec($command);
echo $output;
но это не работает Любая идея?
Это не работает, потому что shell_exec
ожидает завершения сценария python, прежде чем он вернется. Тем не менее, скрипт Python явно не достигает конца из-за бесконечного цикла.
Простейшим решением было бы опросить состояние кнопки один раз с помощью скрипта Python и выполнить любой цикл в php. В качестве альтернативы питон может записывать в файл fifo, из которого может читать скрипт php, но тогда будьте осторожны, потому что, если вы оставите скрипт python запущенным, он заполнит память малины.
Вы должны создать простой веб-API из своего фрагмента Python и Flask
например.
Единственный маршрут как:
@app.route('/')
def get_GPIO_state():
# Your GPIO status verification code here
return True # return proper state here
Разместите этот простой веб-API на другом порту, чем ваш веб-сервер. Преимущество заключается в том, что вы можете отслеживать столько GPIO, сколько вам нужно, по отдельному или одному маршруту.
Теперь, чтобы получить информацию на вашей веб-странице, с помощью некоторого javascript / jquery (или чего-либо еще, что позволяет вам манипулировать вашей веб-страницей), получите только что созданный маршрут и получите результат.
Вы можете тогда с DOM
манипулирование изменением содержимого части вашей веб-страницы, обновление статуса кнопки.
В противном случае вы можете открыть сокет из вашего javascript (на стороне клиента) и заставить ваш скрипт на python отправлять обновленные данные в режиме реального времени.
Для обновления содержимого веб-страницы применяется тот же метод, что и при предыдущей возможности. (что-то на основе getElementById()
например манипулировать DOM
).
Надеюсь, поможет.