SDK плагинов

SberMobile Server и SberMobile IIoT Platform Client поддерживают несколько видов плагинов для связи с разными Devices, добавляя новые контексты в серверное дерево контекстов, создавая пользовательские запросы, локализуя и индивидуализируя текстуальные и графические ресурсы и прочее. Основная информация доступна в разделе Плагины, при этом данная часть документации рассказывает о разработке новых плагинов.

Архитектура плагина

Архитектура плагина основывается на библиотеке Модульной архитектуры Java (JPF). JPF выбран из-за архитектуры наподобие OSGi, так как занимает мало места. Это позволяет серверу оперировать в среде с небольшой памятью, наподобие одноплатных компьютеров, шлюзов IoT, сенсорных панелей и программируемых логических контроллеров Linux (PLC).

Большинство серверных модулей реализуются как плагины, поэтому являются опциональными.

Точки расширения

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

Типы плагинов

Доступно несколько типов плагинов.

Типы плагинов SberMobile Server отмечены в таблице ниже:

Тип плагина

ID точки расширения

Путь к архиву плагина

Драйвер устройства

device

/plugins/device

Плагин контекста

context

/plugins/context

Постоянный плагин

persistence

/plugins/persistence

Плагин UI компонента

component

/plugins/component

Внешний плагин аутентификации

auth

/plugins/auth

Плагин сервера устройства (устаревший)

ds

/plugins/ds

Структура плагина

У плагина SberMobile Server есть два основных компонента:

  • Plugin Java class, который реализует интерфейс ContextPlugin. Большинство реализаций расширяют дочерний класс класса BasePlugin, чтобы избежать реализации ненужных методов и сохранить функциональность по умолчанию.
  • Дескриптор плагина, который определяет свойства плагина и его место в иерархии плагинов SberMobile Server.

Эти компоненты могут быть упакованы в Java Archive (JAR). Дескриптор плагина (plugin.xml) должен располагаться в корневой папке архива.

ID плагина

У каждого плагина есть уникальный ID, к примеру, com.tibbo.linkserver.plugin.context.uniqueid. В некоторых местах такой ID может быть заменен коротким ID, который является последним сегментом полного ID плагина, например, uniqueid.

Создание нового плагина SberMobile Server

Чтобы создать с нуля новый плагин SberMobile Server, необходимо создать новый класс Java, наследуемый из дочерних классов BasePlugin (таких как AbstractDeviceDriver, AbstractContextPlugin или AbstractAuthPlugin). Вам придется переписать по крайней мере некоторые из методов, чтобы обеспечить фукциональность плагина.

Процесс создания плагина включает в себя следующие основные стадии:

Базовые методы плагина

У каждого плагина SberMobile есть следующие методы (заявленные в интерфейсе AggreGatePlugin):

  • getId(), getShortId(), getDescription() и getSortIndex() вызываются ядром, чтобы собрать основную информацию о плагине. Обычно не запрашивается переписывание этих методов с момента, когда классы абстрактного плагина предоставляют верные реализации.
  • globalInit(), globalDeinit(), userInit() и userDeinit() должны быть переписаны, чтобы выполнить базовую инициализацию/деинициализаю плагина. Эти методы вызываются в период загрузки/выгрузки процессов включения и выключения сервера. Методы реализации должны вызывать createGlobalConfigContext() и createUserConfigContext(), чтобы установить конфигурацию плагина.
  • globalStart() и globalStop() должны быть переписаны, чтобы реализовать логику включения и выключения. Эти методы вызываются в период запуска/остановки дерева контекстов, в процессе включения и выключения сервера.

Загрузчики классов плагинов

У каждого плагина есть собственный загрузчик класса (реализация java ClassLoader), отделенный от первичного загрузчика класса сервера.

Доступ к загрузчику класса отдельного плагина возможен путем передачи ID плагина в метод getPluginClassLoader(String) PluginDirector, который, в свою очередь, может быть получен посредством метода getPluginDirector() ContextManager.