2015-04-01 4 views
0

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

Мои цели:

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

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

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

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

+0

Вы после чего-то вроде pthreads, которые можно использовать для написания службы на PHP? –

+0

@Braduenyo - Если вы решили проблему, и один из ответов на ваш вопрос помог, пожалуйста, отметьте этот ответ как принятый, чтобы помочь будущим посетителям SO посмотреть, как решить эту проблему. Благодаря! –

ответ

0

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

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

Тогда ваш PHP-скрипт просто подберет данные и отправит их через SSE. Вам нужен длительный сценарий, но вы также захотите изучить период ожидания для ваших PHP-скриптов using set_time_limit() as defined on 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

1

Так вот что я в конечном итоге делает:

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

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

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