Стандартный набор инструментов драйвера
Набор для разработки драйверов SberMobile Server также включает в себя так называемый стандартный набор инструментов драйвера, который является набором классов, упрощающим создания типичных драйверов для сетевых устройств, программируемых логических контроллеров (PLCs), шлюзов и сенсоров интернета вещей (IoT), спутниковых трекеров и т.д.
Стандартный набор инструментов - это технически полная, простая разработка драйверос со следующими характеристиками:
- Связь по TCP, UDP или по последовательному соединению
- Разбор входящих данных потока в раздельные команды
- Поддержка оповещений (асинхронные входящие команды) и ответов (синхронные ответы на ранее отправленные команды)
- Дополнительный разбор и обработка входящих команд по коду пользователя
- Кодировка и отправка исходящих команд
- Соотнесение входящих команд с ранее отправленными исходящими посредством пользовательских идетификаторов
- Поддержка отправления множественных исходящих команд одновременно и получения ответов вне очереди
Разработка драйверов с помощью стандартного набора инструментов
Чтобы разработать драйвер устройств SberMobile Server, который основывается на стандартном наборе инструментов и использует полностью дополнительную настройку соединения и код соединений устройства, следует:
- Создать новый общий драйвер устройства (плагин класс + драйвер класс), как описано в других статьях этого раздела
- Создать новый класс команды устройства, наследуемый от
Command
, а также, по желанию, больше дочерних классов для различных типов входящих и исходящих команд. Классы команды главным образом содержат обе базы устройств: первичную и обработанную - Создать новый класс контроллера устройства, наследуемый от
AbstractDeviceController
и установить его параметры по базе входящих/исодящих классов команды. Контроллер устройства отвечает за управление связями устройства и за данные - Создать новый командовый анализаторный класс путем реализации интерфейса
CommandParser
или (лучше) путем наследования уAbstractCommandParser
- Для второго подхода (при использовании
AbstractCommandParser)
система будет добавлять входящие данные для вашего буфера анализатора байт за байтом, затем вызовет методreadCommand()
. Если вы увидите, что буфер содержит полностью сформированную команду, просто создайте объектCommand
и верните его, в другом случае верните null. Собранные на данном этапе данные хранятся вByteArrayOutputStream
и доступны посредствомbyte[] getData()
- Переопределить методы
connectImpl()
,loginImpl()
, иdisconnectImpl()
вашего контроллера устройства и установить связь устройств, имя пользователя и логику разрыва соединения в них - Убедиться, что вы вызываете метод
setCommandParser()
из вашей настройкиconnectImpl()
, чтобы предоставить правильный анализатор команды для контроллера устройства - Переопределить метод
send(Command cmd)
вашего контроллера устройства и реализовать команду, отправляя в нее логику, например отправьте данные команды в сокет, созданный в течение соединения - Переопределить методы драйверов устройств
setupDeviceContext(DeviceContext deviceContext)
и добавить свойства контроллера устройства в группу переменных контекста устройстваontextUtils.GROUP_ACCESS
- Переопределить метод
connect()
вашего класса драйвера устройства, чтобы создать настроенный вами контроллер устройства и вызвать его методconnect()
. Реализовать метод драйвераdisconnect()
путем переноса логики в вызовdisconnect()
контроллера устройства - Внести необходимую логику связи устройства в методы драйвера
readVariableDefinitions()
,readFunctionDefinitions()
,readEventDefinitions()
,readVariableValue()
,writeVariableValue()
иexecuteFunction()
. Эти методы обычно взаимодействуют с контроллером устройства путем отправления различных команд, получения ответов и нормализации значений протокола устройста, например, конвертируя их в/изDataTable
экземпляров - Если ваше устройство отправляет асинхронные команды (события), убедитесь в реализации метода
processAsyncCommand()
уAbstractDeviceController
. Его реализация обычно должна создавать любое событие в контексте устройства. Убедитесь, что тип события был ранее представлен в ядре, полученном от драйвераreadEventDefinitions()
Разработка драйверов с помощью набора инструмента и связи устройств
Этот раздел описывает, каким образом разработать драйверы устройств, которые:
- Используют TCP (протокол управления передачей), UDP (протокол пользовательских датаграмм) или серийные связи и единый подход конфигурации устройства
- Используют бинарные или текстовые команды устройства, разделенные одним или двумя пользовательскими символами characters ("разделители")
В таком случае вам необходимо следовать инструкции, написанной в разделе Разработка драйверов с помощью стандартного набора инструментов. Однако разработка такого драйвера даже проще. Список различий представлен ниже:
- Создать объект связянных свойств путем разработки интерфейс
ConnectionProperties
или увеличения классаDefaultConnectionProperties
- Используя наследование от
DefaultConnectionProperties
, клонировать его свойстваFORMAT
в статическом блоке, сделать необходимые модификации, добавить поля и передать новый формат конструкторуDefaultConnectionProperties
- Использовать ваш контроллер устройства с помощью
StandardDeviceController
вместоAbstractDeviceController
. Вам не понадобится разрабатывать логику установки/разрыва соединения, а также логику, которую отправляет команда. Просто убедитесь, что вы перезаписываетеconnectImpl()
, чтобы установить анализатор команды с помощьюsetCommandParser()
после вызоваsuper.connectImpl()
.
Резюмируя вышесказанное, важно отметить, что в этом случае вы не разбираете проблемы, касающиеся связи устройства, а имеете возможность полностью концентрироваться на обмене данными устройства.
Количество кодов, которые могут быть разработаны для создания нового драйвера устройств, относительно этого случая действительно минимально.