![]() |
![]() |
#6 |
Junior Member
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0 ![]() |
![]()
Немного о деталях реализации:
Arduino: скетч обрабатывает запросы на считывание статусов и управление нагрузками, приходящие из uart. Демон serd: демон (приложение-сервис), исполняющийся на роутере, и отвечающий за работу с uart. Он необходим для того, чтобы сразу несколько процессов не пытались работать с портом, и не происходило конфликтов из-за параллельного доступа. База данных sqlite: БД хранит состояния портов, которые в ней постоянно обновляются демоном. БД введена на перспективу того, чтобы в дальнейшем в нее также можно было писать логи состояний отдельных портов, и использовать для статистики/графиков. В варианте модуля БД съедает 300Кб. cgi-скрипты модуля: sh-скрипты, вызываемые веб-сервером и отвечающие за подготовку данных, выдаваемых клиентам. constructor.cgi - страница настроек, читающая настройки из файла settings, и позволяющая управлять списком портов и логикой их работы (выключатель, диммер, кнопка...). По результатам работы страницы формируется новый набор settings. generate.cgi - скрипт генерации index.cgi (основной страницы модуля), создающий страницу по настройкам из settings-файла Остальные cgi не делают страниц, а отдают данные для ajax-запросов: getstate.cgi - мониторит состояние запрошенного списка пинов, и отвечает клиентам обновленным состоянием. На входе принимает список пинов, и то состояние, которое уже есть у клиента (параметр old) recover.cgi - восстанавливает старую версию index.cgi из резервной копии switch.cgi - отправляет в порт запросы на управление выключателями, кнопками и триггером ("спусковым курком") uart.cgi - отправляет в порт запросы на управление диммером, возвращает новое показание в % Клиентская часть constructor.cgi выдает страницу конфигурации, в которой можно настроить набор пинов и логику их работы. Допускаются следующие виды элементов управления: Выключатель (кодируется как DSxx, например, DS07): элемент, имеющий состояния ВКЛ и ВЫКЛ, висящий на 7 пине Диммер (кодируется как DDxx): диммер, имеющий состояния от 0 до 255 (0 - выключен, 255 - полная яркость), отображающий слайдер регулировки и значение, приведенное к % от 0 до 100. Слайдер можно перемещать не только мышью, но и кнопками клавиатуры, если хочется плавности. Кнопка (кодируется как DB) - это кнопка без фиксации. В момент нажатия в порт отправляется 1, в момент отпускания - 0. Если страница открыта на смартфоне или планшете, то полноценно кнопка работать не будет: ввиду особенностей работы браузеров на тачскрине, происходит "клик", то есть нажатие и сразу же автоматическое отпускание. Триггер (кодируется как Db) отличается от кнопки тем, что в порт происходит отправка 1, и только в момент нажатия Отправка сигналов управления диммером происходит через асинхронный запрос к uart.cgi. Формат - "DD13=053". В ответ возвращается значение в %, которое подставляется к слайдеру. Управление выключателями и кнопками осуществляется через асинхронный запрос к switch.cgi. Формат - "DS07=001". Для кнопки при отпускании выдается 002. Ответы при этом не обрабатываются. Как работает считывание состояний пинов: демон serd осуществляет ежесекундный опрос пинов Arduino для получения актуального состояния. В случае изменения состояния какого-либо из портов он производит его запись в БД. Благодаря этому нет никаких конфликтов в чтении порта, а к БД может обращаться хоть сотня параллельных процессов. JavaScript на странице index.cgi создает ajax-запрос к getstate.cgi с временем ожидания ответа 30 секунд. Если ответ за это время не получен, открывается новый запрос с теми же параметрами. Если от сервера приходит ответ, то происходит изменение состояний элементов управления на странице, и снова открывается запрос к серверу. Серверная часть getstate.cgi работает следующим образом: при получении запроса начинает ежесекундно мониториться БД по выбранным пинам. Если изменений состояния нет, то сервер не отвечает клиенту, искусственно заставляя его ждать. Если же состояние какого-то из пинов изменилось, то сервер сразу же отдает ответ клиенту. Такой подход позволяет снизить количество запросов клиентов к серверу до двух в минуту, уменьшив как трафик, так и количество крутящихся на сервере процессов. С таким подходом и десяток клиентов не будут оказывать сколь-нибудь серьезной нагрузки на роутер. Благодаря использованию одного демона исключаются конфликты при доступе к порту. А БД в будущих версиях можно будет использовать для хранения истории состояний отедельных портов |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|