Вопрос или проблема
Это включает в себя Raspberry Pi и Apache2, поэтому я подумал, что вопрос можно задать здесь..
Никогда не использовал веб-сокеты и подобные вещи, поэтому я абсолютно потерян и надеюсь на руководство…
У меня есть скрипт на Python, который дает мне два параметра… угол сервомотора и расстояние до объекта от ультразвукового датчика.
Мне нужно, чтобы эти данные отправлялись на мой веб-сайт, на котором есть изображение радара. По мере изменения угла перенос на радаре должен меняться, а там, где есть препятствие, оно должно отображаться на моем радаре.
Мой вопрос: как я могу получить эти данные на сайт непрерывно? У меня на сайте работает Apache2. Сейчас я уже использую Ajax-запросы, чтобы запустить моторы на моем Raspberry Pi (это как радиоуправляемая машина).
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
TRIG = 22
ECHO =18
GPIO.setup(TRIG, GPIO.OUT)
GPIO.output(TRIG,0)
GPIO.setup(ECHO, GPIO.IN)
GPIO.setup(33, GPIO.OUT)
pwm=GPIO.PWM(33,100)
pwm.start(5)
time.sleep(0.1)
class rotateRead():
def To180andBackRead():
angle=0
for angle in range(0, 180, 1):
GPIO.setmode(GPIO.BOARD)
duty=float(angle)/10+2.5
pwm.ChangeDutyCycle(duty)
print angle
time.sleep(0.1)
GPIO.output(TRIG,1)
time.sleep(0.00001)
GPIO.output(TRIG,0)
while GPIO.input(ECHO) ==0:
pass
start =time.time()
while GPIO.input(ECHO) ==1:
pass
stop=time.time()
print (stop-start) *17000
angle=180
for angle in range(180, 0, -1):
GPIO.setmode(GPIO.BOARD)
duty=float(angle)/10+2.5
pwm.ChangeDutyCycle(duty)
print angle
time.sleep(0.1)
GPIO.output(TRIG,1)
time.sleep(0.00001)
GPIO.output(TRIG,0)
while GPIO.input(ECHO) ==0:
pass
start =time.time()
while GPIO.input(ECHO) ==1:
pass
stop=time.time()
print (stop-start) *17000
for x in range(0,1,1):
To180andBackRead()
GPIO.cleanup()
Для начала вам нужно создать конечную точку на вашем сайте. Самый простой способ – создать файл с именем robot_update.php со следующим содержимым.
<?php
$input_data = file_get_contents('php://input');
$decoded_data = json_decode($input_data);
//Сделайте что-то с $decoded_data, обновите изображение или запишите его в базу данных.
?>
Далее, отправьте ваши данные через HTTP из Python следующим образом:
import json
import urllib2
def update_robot(angle, distance):
data = {
'angle' : angle,
'distance' : distance
}
req = urllib2.Request('http://yourwebsite.com/robot_update.php')
req.add_header('Content-Type', 'application/json')
res = urllib2.urlopen(req, json.dumps(data))
res.read()
Вызовите эту функцию в месте, где рассчитывается ваш угол и расстояние. Это будет работать нормально, но не забудьте добавить соответствующие ограничения на ваш robot_update.php.
Ответ или решение
Теория
Передача данных между Python-скриптом, работающим на Raspberry Pi, и веб-сайтом, обслуживаемым Apache2, может быть решена несколькими способами. Одним из наиболее простых и распространенных методов является использование AJAX-запросов в комбинации с HTTP-сервером, который может обрабатывать запросы от вашего Raspberry Pi и обновлять статус на веб-сайте. В этом сценарии ваш Raspberry Pi играет роль клиента, отправляющего данные на сервер, а сервер, в свою очередь, обновляет данные на веб-странице.
Для реализации этого подхода можно использовать сценарий на PHP для обработки входящих данных, которые затем можно визуализировать с помощью JavaScript и HTML5. Учитывая, что вы уже используете AJAX для управления моторами на вашем Raspberry Pi, это может стать естественным расширением вашей текущей архитектуры.
Пример
-
Создание обработчика на сервере
Вам понадобится серверная часть на PHP, как показано в изначальном предложении. Она будет обрабатывать входящие данные и изменять веб-страницу в зависимости от полученных данных:
<?php $input_data = file_get_contents('php://input'); $decoded_data = json_decode($input_data); // Пример: сохранение данных в файл file_put_contents('robot_data.json', json_encode($decoded_data)); ?>
Этот код принимает входные данные от клиента (вашего Raspberry Pi) и сохраняет их в формате JSON.
-
Код на Python
В вашем Python-скрипте, сразу после того, как вы получите угловые данные и расстояние, передайте их на сервер:
import json import urllib.request def update_robot(angle, distance): data = { 'angle': angle, 'distance': distance } req = urllib.request.Request('http://yourwebsite.com/robot_update.php') req.add_header('Content-Type', 'application/json') res = urllib.request.urlopen(req, json.dumps(data).encode('utf-8')) res.read() # Пример вызова функции в вашем цикле update_robot(90, 15)
Убедитесь, что ваша функция
update_robot
вызывается в цикле, где вы рассчитываете угол и расстояние. -
Обновление веб-страницы
Используйте JavaScript и AJAX для динамического обновления веб-страницы. Например, используя jQuery, вы можете делать периодические AJAX-запросы к вашему серверу для получения обновленных данных:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> function fetchData() { $.getJSON("robot_data.json", function(data) { updateRadar(data.angle, data.distance); }); } function updateRadar(angle, distance) { // Здесь реализуйте логику визуального представления данных console.log("Angle: " + angle + ", Distance: " + distance); // Например, манипулируйте элементами DOM, чтобы показать данные на радаре } setInterval(fetchData, 1000); // Обновление данных каждую секунду </script>
Этот скрипт будет делать запросы каждую секунду, извлекая актуальные данные из файла
robot_data.json
и обновляя визуализацию на вашем сайте.
Применение
-
Настройка и тестирование
Протестируйте интеграцию на локальной копии вашего сайта, чтобы убедиться, что все компоненты работают корректно. Не забудьте учесть такие аспекты, как обработка ошибок и защита от дублирования запросов (например, с помощью фильтров IP или аутентификации).
-
Безопасность
Убедитесь, что ваш PHP-скрипт робот_update.php защищен от несанкционированного доступа. Используйте меры аутентификации и авторизации для проверки легитимности источников данных.
-
Оптимизация производительности
Если система будет испытывать нагрузку, рассмотрите возможность внедрения более сложных схем кеширования данных или перехода на WebSockets для более эффективной поточности данных.
Такой подход обеспечит непрерывную передачу и отображение данных, создавая эффект реального времени для отображения углов и расстояний на вашем веб-интерфейсе.