LINUX.ORG.RU

Когда хочешь помигать лампочкой с двух выключателей

 , , , ,


0

1

Здравствуйте

КДПВ

Есть RS232-модуль с тремя реле (назовем его «Лампочки»). На Лампочки можно послать команды «on 1» (включить первую лампу), «off 2»,.., «state» (получить состояние всех ламп). Так-же на модуле есть 3 физические кнопки (это важно).

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

На сервере 3 блокирующих процесса (на картинке обозначены синими квадратами с цифрами):

1. Ждет fcgi-запросов от nginx. Если запрос быстрый (сменить имя лампочки, получить состояние из redis), то выполняет. Если запрос медленный (послать команду на Лампочки), то добавляет команду в redis-список

2. Ждет появление команды в списке (redis BRPOP, с таймаутом в 1 секунду), выполняет, результат публикует событие в редисовый pub/sub, снова ждет. Так-же периодически запрашивает состояние Лампочек, и если оно изменилось (понмните про физические кнопки?), обновляет данные в redis и публикует об этом в pub/sub.

3. Сначала слушает fcgi. Установив постоянное соединение, подписывается на redis-рассылку (изменение состояния, имени лампы), проксирует эти события на клиенты в формате EventSource. Этот процесс нужен чтобы все веб-клиенты оперативно получали обновления. Например, один клиент поменял имя лампочки, сообщил об этом в Pub/Sub, все остальные тут-же об этом узнали и запросили новые данные.

Если вы дочитали до сюда, то вам скорее всего нечем заняться в данный момент и вы с удовольствием поразмышляете над следующим вопросом:

Вопрос. Очевидно, схема переусложнена. Вот все говорят «выбирай инструмент под задачу». Здесь мы выясняем истину, какой инструмент идеально подойдет под эту задачу и как бы он эту задачу упростил (учитывая, что процесс №2 может, вместе с Лампочками быть на другом устройстве, соединяясь с остальным бэкендом по сети).

Использованные инструменты: c (ioclt, fcntl), lua, redis, hiredis, libfcgi, nginx, yajl

Бонусный вопрос: как обозвать процессы 1, 2 и 3? У меня никаких идей

★★★★★

Последнее исправление: makoven (всего исправлений: 5)

Мигающий свет может вызвать приступ эпилепсии.

anonymous
()

Оверинжениринг как оно есть. тут достаточно cgi и скрипта в 15-20 строчек на баше.

devl547 ★★★★★
()
Ответ на: комментарий от devl547

Почти так и было. Один скрипт по крону читал состояние Лампочек и записывал его в /tmp. Второй, cgi-скрипт, слал состояние в браузер из /tmp. Он же управлялся с отправкой команд Лампочкам и изменением имен.

А потом появился второй веб-клиент.

Поперли отказы (ttyS один, а cgi много), неатомарность (файл с именами один, а cgi много), косяки и задержки синхронизации между клиентами (short-polling зло)

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

в общем вместо вечера за чаем и исправления косяков, ты решил нагородить туда

с (ioclt, fcntl), lua, redis, hiredis, libfcgi, nginx, yajl

devl547 ★★★★★
()
Ответ на: комментарий от devl547

Все косяки исправимы, кроме задержек. И это будет уже не 15 и даже не 150 строчек

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)

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

Или, м.б. подойдет вариант создания модуля к веб-серверу для проксирования информации и соединяющий по сокету к сервису отвечающему за реализацию протоколов к оборудованию, и лонг пуллинг на стороне клиента.

tuk9
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.