Сервер обработки телеметрии
В отличии от предыдущего проекта СКУД, где клиентские сервисы напрямую подключались к БД, в этом проекте общение происходит через главный web сервер системы, разработанный специально для нее. Особенностью данного сервера является перенос обслуживания обращений за текущими данными в оперативную память демона, что освобождает БД от рутинной работы и значительно уменьшает нагрузку на нее. В частности, это сильно помогает при обмене "видео" изображением с камер.
Роль СУБД, в этой связке, - хранение информации и принятие решений. Действия определяются как на уровне настроечных записей в БД (прописаные настройщиком реакции), так и с помощью дополнительного функционала "функции датчиков", позволяющие производить подмену значений, и исполняемые процедуры, определяемые настройщиком.
Обмен данными с сервисными программами
Для общения с клиентскими программами был выбран протокол http. Авторизация служит не только для контроля доступа, но и для определения списка ресурсов (групп устройств), доступных этому соединению. Данные возвращаются в текстовых форматах, легко поддающихся парсингу без использования дополнительных библиотек.
Запрос списка линий
http://user:password@server:port/conn.asp l=33;t=6;p=/dev/ttyAMA0 l=35;t=7;p=/sys/bus/w1/devices/w1_bus_master1
где:
- l= ID линии (группы устройств);
- t= тип линии (прописываемый в БД формат адресов устройств);
- p= "порт" подключения линии на локальном компьютере.
В приведенном примере типы линий - сеть устройств на UART интерфейсе Raspberry Pi и линия 1 wire устройств.
Запрос данных для передачи в линии устройств
http://user:password@server:port/data.asp L=35;A=01;C=o;D=0000FF; L=35;A=01;C=o;D=010000;
где:
- L= ID линии;
- A= адрес устройства;
- C= команда устройству;
- D= данные для вывода в устройство.
Отправка данных на сервер
http://user:password@server:port/pin.asp?l=%LINE%&a=%ADDR%&c=%CMD%&d=%DATA%
где:
- %LINE% - ID линии (группы устройств);
- %ADDR% - адрес устройства;
- %CMD% - команда/идентификатор пина (тип данных);
- %DATA% - данные в шестнадцатеричном формате.
Запрос списка камер для обработки
http://user:password@server:port/cams.asp %id%=%url%
Программы, обслуживающие камеры, получают в этом скрипте список устройств или url камер, изображение с которых надо передать на сервер.
- %id% - номер камеры в системе, под которым ожидается ответ;
- %url% - путь к данным камеры или псевдоним (либо путь) локального устройства захвата видео.
Ответ по обработанному изображению
http://user:password@server:port/cams_ep.asp?id=%id%
Отправка обработанного изображения на сервер в виде POST формы с двумя полями - prewiew и image. Ширина меньшего изображения - 640 точек.
%id% - номер камеры из предыдущего запроса.
Тексты для озвучки или иного вывода
http://user:password@server:port/speaker.asp %some text% %some text% ... %some text%
Очередь текстов возвращается построчно. Кодировка - UTF-8.
Обобщенный запрос данных для робота
http://user:password@server:port/fd.asp?v=%version% [CONN] l=33;t=6;p=/dev/ttyAMA0 [VERS] 5 [DATA] L=35;A=01;C=o;D=0000FF; L=35;A=01;C=o;D=010000; [TEXT] Однажды, в студенную зимнюю пору, я из лесу вышел [CAMS] 3=http://192.168.2.55/live.jpg
В случае "продвинутого" робота, умеющего выполнять все действия, запрос данных выполняется сразу по всем темам, что значительно повышает интенсивность обмена.
Для проверки наличия обновлений в списке линий, осуществляется двухсторонний обмен номерами версий. Клиент, каждый раз, передает номер версии, имеющегося у него списка линий.
Разделы, данные в которых отсутствуют, сервером не возвращаются.