Я создаю проект на Raspberry Pi, используя детектор движения для отправки текстового сообщения. Возникли некоторые проблемы при выполнении сценария python из PHP (Apache2).
Попытка выполнить этот сценарий python:
#!/usr/bin/env python
from gpiozero import MotionSensor
import time
import os
#Motion sensor in GPIO23
ms = MotionSensor(23)
def send_notification():
#Debug Motion Statement
print("There was a movement!")
#Notification script is stored in notification variable
notification = os.popen ('bash /home/pi/project/notification.sh')
#Send Notification
print(notification.read())
#Delay between notifications
time.sleep(15)
#Execute send_notification function on motion
ms.when_motion = send_notification
Уведомление. sh сценарий для справки , Для отправки текстового сообщения используется постфикс.
echo "Motion was detected in your Smart Mailbox!" | mail myphonenumber@vtext.com
Из этого PHP кода:
<!DOCTYPE html>
<html>
<head>
<title>Smart Mailbox</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<div class="form-style-5">
<body style="text-align:center;">
<h1>Smart Mailbox Application</h1>
<p>Enter Your Phone Number:</p>
<form method="post">
<input type="tel" name="phonenumber" placeholder="10 Digit Phone Number" pattern="[0-9]{10}" required>
<br>
<p>Select Your Phone Carrier:</p>
<select name="carrierdropdown" required>
<option value=""></option>
<option value="Verizon">Verizon</option>
<option value="ATT">ATT</option>
<option value="Sprint">Sprint</option>
<option value="TMobile">T-Mobile</option>
</select>
<br><br>
<input type="submit" name="submit" value="Start SmartMailbox">
</form>
</body>
</div>
</html>
<?php
if(isset($_POST['submit'])) {
//Appends phone carrier address to email address
if($_POST['carrierdropdown']=="Verizon"){
//echo "DEBUG:Verizon";
$carrier = "@vtext.com";
} elseif ($_POST['carrierdropdown']=="ATT"){
//echo "DEBUG:ATT";
$carrier = "@txt.att.net";
} elseif ($_POST['carrierdropdown']=="Sprint"){
//echo "DEBUG:Sprint";
$carrier = "@messaging.sprintpcs.com";
} elseif ($_POST['carrierdropdown']=="TMobile"){
//echo "DEBUG:T-Mobile";
} else{
echo "Break";
}
//Gets users phone number from HTML form
$phonenumber = $_POST['phonenumber'];
//Opens notification script for editing
$file = fopen('/var/www/html/notification.sh','w');
//Writes mail command to file appending phonenumber
fwrite($file,'echo "Motion was detected in your Smart Mailbox!" | mail ' . $phonenumber . $carrier);
//Closes file
fclose($file);
//Runs python scripts
exec('node /home/pi/project/blynkconnect.js');
exec('python -i /home/pi/project/MotionNotification.py &');
}
?>
Следующая команда работает только в командной строке. Мне нужно использовать флаг -i, чтобы сеанс оставался открытым для обнаружения движения.
python -i /home/pi/project/MotionNotification.py &
Поэтому я полагаю, что моя проблема запускается с PHP (я использую веб-сервер apache2 для хостинга) , Все файлы имеют права на чтение, запись, выполнение. Команда узла, с которой я запускаю PHP, работает без сбоев. Я пытался предоставить apache веб-пользователю root доступ, но все равно не повезло.
Есть идеи, которые я могу попробовать? Спасибо!