Concept of Plugins

nimargolis edited this page Jul 13, 2018 · 19 revisions
  1. Концепция плагинов системы intraHouse

  2. Установка плагина

  3. Механизмы IPC


Концепция плагинов системы intraHouse

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

Принципиальный подход системы intraHouse - плагины не включаются в поток выполнения родительского приложения, а запускаются как независимые дочерние процессы.

Для этой цели в ядре системы определена точка расширения - Plugin Server (сервер плагинов), который полностью контролирует запуск/останов, текущее состояние плагина и реализует обмен данными.

Таким образом, плагин системы intraHouse – это исполняемый программный модуль, который запускается как дочерний процесс. В общем случае плагин может быть написан на любом компилируемом или скриптовом языке. Практически на текущий момент есть плагины, написанные на Javascript, Python, C и Go.

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

По функционалу плагины подразделяются на плагины связи с оборудованием и сервисные плагины.

Плагины связи с оборудованием

Плагины связи с оборудованием обеспечивают связь с оборудованием по конкретному протоколу. Их цель - получать данные о состоянии физических устройств и передавать им управляющие команды с сервера. Плагины могут быть созданы как для реализации протокола в целом (универсальный плагин MQTT, MODBUS, HTTP, COM, etc), так и для конкретного вида оборудования, что часто позволяет построить более быстрый обмен, полнее учесть конкретную реализацию протокола и автоматизировать служебные операции (регистрация устройств, обработка ошибок).

Эти плагины работают в терминах каналов и "не знают" про виртуальные устройства. Описание каналов, с которыми работает плагин, содержится в манифесте плагина. При получении данных от плагина сервер устанавливает значения виртуальных устройств.

Сервисные плагины

Сервисные плагины работают в терминах виртуальных устройств и событий ядра. Их цель - реализация дополнительного функционала (информирование (sendinfo), отправка данных в другие системы и БД (senddata), сложные алгоритмы обработки событий). Для таких плагинов не строятся каналы связи с оборудованием.

Сервисный плагин имеет в манифесте атрибут service.

"service":true

Существуют стандартные сервисы, например sendinfo - отправка сообщений.

"name": "email", "service": "sendinfo"

Сервисный плагин после запуска подписывается на интересующие события и выполняет действия при получении данных по подписке. Например, плагин email при старте выполняет подписку:

{ type: "sub", event:"sendinfo", filter:{type:"email"}}

Теперь в сценарии можно отправить сообщение в канал email

this.info('email','owner,wife', 'Протечка в душе!');

Со своей стороны плагин может отправлять управляющие команды серверу. Также можно реализовать запуск сервисных плагинов по расписанию.


Установка плагина

В версии Cherry ни один плагин не включен в состав дистрибутива системы.

Плагины распространяются в виде пакетов и устанавливаются каждый в отдельную папку внутри каталога плагинов (по умолчанию используется каталог /var/lib/intrahouse-c/plugins)

После установки плагин становится доступен в любом проекте на сервере.

Установка выполняется интерактивно через Project Manager:

Плагины - Дополнительные операции - Загрузить из zip файла

Архив плагина (zip) - это пакет, содержащий программные модули и файлы описания плагина. Название архива значения не имеет.

При установке в корневом каталоге архива ищется ярлык плагина - файл с расширением .ih. Имя файла .ih - это идентификатор плагина.

Идентификатор плагина

При разработке плагина ему присваивается уникальный идентификатор в виде строки, состоящей из малых букв латинского алфавита.

Этот идентификатор используется как:

  • название папки, в которую устанавливается плагин;
  • имя для служебных файлов описания плагина (ярлык, манифест);
  • имя экземпляра плагина в системе.

Например, загрузим плагин для контроллера KernelChip Jerome с идентификатором "jerome".

  • Плагин будет помещен в папку /var/lib/intrahouse-c/plugins/jerome

  • В папке будут находиться файлы jerome.ih - ярлык и jerome.json - манифест

  • В таблице "Плагины" появится запись с ID: jerome1 - это экземпляр плагина.

Таким образом, пакет плагина содержит минимум 3 файла: ярлык, манифест и стартовый исполняемый файл.

Файл - ярлык

Этот файл с расширением .ih используется для операций установки и обновления.

Обязательные атрибуты файла .ih

  • "id":"jerome" // Идентификатор, совпадает с именем файла

  • "description":"KernelChip Jerome" // Описание плагина

  • "version":"1.0.15" // Версия

  • "cross":true // Плагин является кроссплатформенным

Необязательные атрибуты файла .ih

  • "activation":true // Требуется активация лицензионного ключа

  • "resources":true // Плагин имеет ресурсы, которые закачиваются отдельно при загрузке и обновлении


Файл - манифест

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

Атрибуты манифеста

  • "description":"KernelChip Jerome" // Описание (дублирует запись в файле .ih, но реально в таблице плагинов используется это описание)

  • "module":"index.js" // Имя стартового исполняемого файла

  • "single":0 // 1 - может быть запущен только один экземпляр плагина, 0 - разрешен запуск нескольких

  • "params":[] // Массив параметров плагина, которые настраиваются интерактивно

Структура элемента массива params, каждый элемент - объект:

{"name": "host", // имя параметра

"note": "IP узла", // наименование для интерактивного ввода

"type": "string", // тип: "string"|"number"|"cb"|"droplist"

"val": "192.168.0.250" // Значение по умолчанию для свойств кроме type:"droplist"

"data": [{"id":"1", "name":"One"}, {"id":"2", "name":"Two"},...] // Список для выбора для type:"droplist" }

Манифест плагинов для работы с оборудованием содержит информацию для работы с каналами.

Механизмы IPC

После запуска дочерний процесс независим от сервера, но при этом должен иметь с сервером двухсторонний канал связи (IPC - Inter Process Communication). Через IPC плагин получает от сервера параметры запуска и выполняет оперативный обмен данными.

Механизм IPC зависит от реализации плагина.

  1. Плагин на Javascript

Это самый простой вариант реализации. В этом случае запускается новый дочерний процесс Node.js (child_process.fork()), который имеет встроенный IPC:

Отправка сообщения серверу:

process.send(message);

Получение сообщения от сервера:

process.on('message', function(message) { …. });

  1. Любой другой вариант: плагин - бинарник или скрипт на Python

В качестве IPC используются стандартные каналы ввода/вывода stdin/stdout

Пример на С:

Отправка сообщения серверу:

printf(msg);

Получение сообщения от сервера:

read(STDIN_FILENO, buf, BUF_SIZE);

Пример на Python:

Отправка сообщения серверу:

sys.stdout.write(msg)

Получение сообщения от сервера:

sys.stdin.readline()

Форматы сообщений плагин - сервер определены в API плагинов

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.