Серийный Push на сервер отправил сценарий

У меня есть веб-сервер LAMP со скриптом Python, постоянно отслеживающий последовательный порт для входящих данных. Это часть системы домашней автоматизации (с Arduino Yun и группой Pro Minis, каждая с радиочастотными трансиверами nrf24L01 +).

Мои цели:

  1. Сохраните входящие данные в MySQL в соответствующем месте, например, «дверь открыта» или «temp = 72F». Я верю, что скрипт Python справится с этим.
  2. Используйте отправленные события сервера (SSE) для отправки новых данных в браузер клиента (когда клиент подключен).

Я понимаю, что могу использовать AJAX, но отправка данных кажется лучше, чем опрос. Проблема заключается в том, что мне нужно каким-то образом передавать связанные с SSE данные из скрипта python в PHP, но только когда PHP-скрипт SSE работает. Кроме того, я считаю, что новый экземпляр скрипта SSE PHP создается с каждым клиентом — поэтому даже не будет соотношения 1: 1 для Python и PHP. Я думал о том, чтобы SSE PHP следил за базой данных MySQL, но это по сути дела назад к опросу, хотя, вероятно, очень высокочастотному опросу.

В качестве альтернативы я думал, что скрипт SSE PHP может контролировать последовательный порт, но я думаю, что последовательные данные могут быть прочитаны только один раз, поэтому несколько скриптов будут конкурировать за данные, что также не будет работать.

Каков наилучший способ достижения этих двух целей — сохранение входящих данных в моей базе данных и использование SSE в качестве транспортного уровня?

0

Решение

Итак, вот что я в итоге сделал:

  • Демон Python работает на Arduino Yun, отслеживая последовательный порт ttyATH0 для получения новых данных. Когда получена новая строка (я хочу завершить строки символом ~), она анализирует ее и сохраняет в базе данных MySQL. Обновление записи MySQL автоматически обновляет отметку времени в этой строке. Это конфигурация таблицы.
  • Загрузка html-страницы запускает подписку браузера на сервер, отправляет события из .php-скрипта, запущенного на сервере
  • Сценарий выполняет поиск в базе данных MySQL записей, возраст которых не превышает пары секунд, и передает JSON на веб-страницу, которая анализируется с помощью javascript для анимации страницы.

Я решил, что 3-секундное время обновления сценария Server Sent было достаточно для моих нужд. Теоретически он может работать непрерывно, но, вероятно, затопит веб-страницу и снизит производительность. Сценарий также может быть настроен на запуск каждую 1 секунду — возможно, я сделаю это обновление когда-нибудь.

…В любом случае, вот как я это сделал, никаких веб-сокетов не требуется! Я также думаю, что это более элегантно, чем зависший запрос AJAX.

1

Другие решения

Из того, что я понимаю о SSE, проблема в том, что долго работающий PHP-скрипт распознает изменения, которые Python-скрипт внесет в базу данных.

Предположим, что ваш скрипт Python правильно добавляет данные в базу данных MySQL.

Тогда ваш PHP-скрипт просто соберет данные и отправит их через SSE. Вы хотели бы длительный сценарий, но вы также хотите посмотреть на время ожидания для ваших сценариев PHP используя set_time_limit () как определено на php.net.

Я бы попробовал что-то вроде этого:

$link = mysqli_connect("myhost","myuser","mypassw","mybd");

$number_of_times = 1;
/*
* Ideally figure out how many times you want to query per consistent
* connection, knowing that your script will eventually time out and
* that EventSource will reconnect within 3 seconds
*/

for ($i=0;$i<$number_of_times;$i++) {
$query = "SELECT name FROM mytable" or die("Error in query: " . mysqli_error($link));
$result = $link->query($query);

while($row = mysqli_fetch_array($result)) {
// echo your SSE data here
}
}

Вас не беспокоит то, что для ваших сценариев это соотношение не равно 1: 1, поскольку веб-страница, использующая EventSource, подключится к сценарию PHP, а сценарий Python отслеживает другой источник входящих данных и записывает его в общую базу данных, которая одновременно скрипты будут использовать.

Кроме того, читайте о лимитах для EventSource

0