Данные из скрипта Python на веб-сайт

Вопрос или проблема

Это включает в себя 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, это может стать естественным расширением вашей текущей архитектуры.

Пример

  1. Создание обработчика на сервере

    Вам понадобится серверная часть на 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.

  2. Код на 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 вызывается в цикле, где вы рассчитываете угол и расстояние.

  3. Обновление веб-страницы

    Используйте 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 и обновляя визуализацию на вашем сайте.

Применение

  1. Настройка и тестирование

    Протестируйте интеграцию на локальной копии вашего сайта, чтобы убедиться, что все компоненты работают корректно. Не забудьте учесть такие аспекты, как обработка ошибок и защита от дублирования запросов (например, с помощью фильтров IP или аутентификации).

  2. Безопасность

    Убедитесь, что ваш PHP-скрипт робот_update.php защищен от несанкционированного доступа. Используйте меры аутентификации и авторизации для проверки легитимности источников данных.

  3. Оптимизация производительности

    Если система будет испытывать нагрузку, рассмотрите возможность внедрения более сложных схем кеширования данных или перехода на WebSockets для более эффективной поточности данных.

Такой подход обеспечит непрерывную передачу и отображение данных, создавая эффект реального времени для отображения углов и расстояний на вашем веб-интерфейсе.

Оцените материал
Добавить комментарий

Капча загружается...