EDGE шлюз
Описание
Модуль используется для получения и обработки json-пакета, структура которого задается в модуле и платформе.
Программно-определяемая схема обработки json-пакета позволяет гибко задать требуемые атрибуты для парсинга данных.
Для обмена между источником данных и платформой используется любой MQTT брокер, в том числе MQTT-брокер в составе платформы.
Модуль выполняет следующие функции:
- описывает json структуру с данными, которая будет поступать на MQTT брокер;
- подписывается на заданный топик для получения данных;
- обрабатывает пакет данных, который должен соответствовать заданной структуре данных.
Модуль поддерживает следующие возможности:
- описать структуру с разными типами данных, определить в структуре штамп времени, гео тэг, а также массивы;
- поддержать прием и обработку нескольких моделей устройств;
- обеспечить прием данных большого размера в виде N-пачек.
Совместимость
Для корректной работы gate модуля требуется версия ядра > 4.4
Установка в качестве демона линукс:
Создать директорию /opt/edge-gate и поместить в нее edge-gate.jar, application.yml
mkdir /opt/edge-gate
cp edge-gate.jar /opt/edge-gate
cp application.yml /opt/edge-gate
cp edge-gate.conf /opt/edge-gate
Создать файл сервиса /etc/systemd/system/edge-gate.service следующего содержания:
[Unit]
Description=edge-gate
After=syslog.target
[Service]
User=root
Group=root
ExecStart=/opt/edge-gate/edge-gate.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.targetПеречитать список сервисов linux
systemctl daemon-reloadЗапуск и остановку сервиса можно осуществлять стандартынми командами, модуль работает только в режиме 2
service edge-gate start
service edge-gate status
service edge-gate stopЕсли нужно добавить в автозапуск при рестарте, обычно это делается так:
systemctl enable edge-gateОграничение памяти в качестве демона
Для установки лимитов памяти нужно создать в директории edge-gate.jar файл конфигурации edge-gate.conf
и задать в нем нужные лимиты, например:
JAVA_OPTS="-Xms100m -Xmx300m"Запуск
В режиме печати конфигурации приборов Орион-Болид
Используется для получения идентификаторов устройств для создания подключения устройств в типовой конфигурации Inspark
java -jar edge-gate.jar printМодель Устройства
Модель устройства определяется самим пользователем. Тип и количество параметров может быть любым, которые поддерживает платформа.
Например, приведем пример пакета который будет приходить на модуль:
{
# Настройки парсеров измерений (список парсеров)
parsers:
# топик MQTT (в случа нескольких через запятую, пример: /measures/+/tag1,/measures/+/tag8)
- mqtt-topic: "/measures/+"
# Шаблон топика. Важно: местоположение идентификатора устройства должно быть оформлено в виде группы,
# чтобы можно было по индексу группы понять откуда его извлечь.
# Важно: экранирование обратного слэша в yaml требует двойного обратного слэша.
topic-template: "^\\/measures\\/([a-zA-Z0-9-_]+)$"
# Группа в которой находится идентификатор устройства ext-device-id. Место откуда требуется извлечь идентификатор
# устройства в topic-template (номер группы регулярного выражения, начиная с 1)
topic-template-unit-group: 1
# Настройки для определения времени измерений. Опредеяет атрибут из которого следует извлечь время и применить ко всем
# измерениям пакета.
time:
# в сообщение присутствует атрибут времени (true - да и его есть откуда прочитать, false - нет, использовать текущее время)
present: true
# формат времени (UNIX, UNIX-MS, строка с форматом java)
# UNIX - время представлено в виде числа unix-time, в стандартных для него секундах
# UNIX-MS - время представлено в виде числа unix-time, но число содержит миллисекунды а не секунды
# шаблон времени Java (см шаблоны DateTimeFormatter - https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)
format: "UNIX"
# путь в json дереве для чтения значения (только если present = true)
json-path: "time"
# Каналы устройства. Настройки откуда брать значения и в каие каналы складывать. Массив.
channels:
# путь в json дереве для чтения значения
- json-path: "batteryVoltage"
# топик канала параметра в платформе, в который значение будет отправлено (Channel.channeltopic)
channel: "battery-voltage"
- json-path: "softwareVersion"
channel: "softwareVersion"
# пример извлечения атрибута вложенного объекта
- json-path: "param-state.id"
channel: "param-state-id"
- json-path: "batteryLocation"
channel: "batteryLocation"
# дополнительные настройки для парсинга геометки
geotag:
# LAT_LON - Формат в виде строки "широта долгота", где значения градусы и их доли. Разделителем широты и долготы может
# быть пробел, запятая, запятая пробел, двоеточие.
# GEOTAG - Формат в виде строки "долгота:широта" и "долгота:широта:высота" (инспарк GEOTAG).
format: LAT_LON
# Формат в виде строки "долгота:широта" и "долгота:широта:высота" (инспарк GEOTAG).
# пример для геометки инспарк (без высоты)
- json-path: "lon-lat-alt"
channel: "lon-lat-alt"
geotag:
format: GEOTAG
- json-path: "errors"
channel: "errors"
# дополнительные настройки для массовов
array:
# индекс элемента массива (0 - первый элемент, 1 - второй и т.д.)
index: 0
# путь к атрибуту если элемент массива является объектом (для примитивов должен оставаться пустым)
json-path:
- json-path: "array-of-objects"
channel: "array-of-objects-6-id"
array:
index: 1
json-path: "id"
- json-path: "array-of-objects"
channel: "array-of-objects-6-name"
array:
index: 1
json-path: "name"
}Если требуется получать все данные пакета, в разделе Устройства зададим ему модель:
| Название параметра | Тип |
|---|---|
| batteryVoltage | мгновенный |
| errors | строковый |
| softwareVersion | строковый |
| batteryLocation | строковый |
| lon-lat-alt | гео |
| name_1 | строковый |
| name_2 | строковый |
| param_state | мгновенный |
Ниже, в разделе Настройка модуля показана как для такого json пакета необходимо задать схему обработки.
Настройка модуля
Настройка модуля производится в файле application.yml.
Настройки позволяют выбрать профиль логирования (console - вывод в консоль, file - вывод в файл).
# порт http сервера (метрики http://localhost:port/metrics)
server:
port: 8036
spring:
application:
name: edge-gate
# профили логирования, console - вывод в консоль, file - вывод в файл
profiles:
active: console
datasource:
url: jdbc:h2:file:./edge;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
driver-class-name: org.h2.Driver
username: sa
password:
h2:
console:
enabled: true
path: /h2-console
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: update
show-sql: false
properties:
hibernate:
format_sql: true
temp:
use_jdbc_metadata_defaults: false
# уровни логирования модулей
logging:
level:
root: INFOСледует задать настройки подключения к рест-сервисам inspark и идентификатор внешней системы (провайдера данных чьи устройства будут обслуживаться)
# подключение к рест-сервисам inspark (должен заканчиваться слэшем)
rest:
url: http://localhost:8080/sem-restservices/
user: <user>
password: <password>
extSystemId: EDGE-GATE # имя внешней системы в разделе ПровайдерыЗадаем настройки подключения к брокеру MQTT
# параметры подключения к артемис inspark
artemis:
url: tcp://localhost:61616
user: artemis
password: pass
# количество потоков в пуле для отправки JMS-сообщений
senderThreads: 8
# настройки очередей (см. имена свойств и дефолты в lib-gate)
queue:
event:
destination: jms.queue.Event
measure:
destination: jms.queue.Measure
emulator:
# включен ли эмулятор (если включен эмулирует данные от устройства bms-movicon)
enabled: false
# топик в который он будет эмулировать сообщения (в нем есть и ext-device-id)
mqtt-topic: /measures/bms-movicon
# топик для эмуляции пакета приходящего частями
mqtt-partial-topic: /partial/edge-partial-device
# настройки подключения к брокеру MQTT
mqtt:
url: tcp://localhost:1883
user: admin
password: adminНастройки парсинга измерений
app:
# Задержка для формирования частичного пакета перед обработкой и отправкой, секунд
partial-delay-sec: 10
# Настройки парсеров измерений (список парсеров)
parsers:
# топик MQTT (в случа нескольких через запятую, пример: /measures/+/tag1,/measures/+/tag8)
- mqtt-topic: "/measures/+"
# Шаблон топика. Важно: местоположение идентификатора устройства должно быть оформлено в виде группы,
# чтобы можно было по индексу группы понять откуда его извлечь.
# Важно: экранирование обратного слэша в yaml требует двойного обратного слэша.
topic-template: "^\\/measures\\/([a-zA-Z0-9-_]+)$"
# Группа в которой находится идентификатор устройства ext-device-id. Место откуда требуется извлечь идентификатор
# устройства в topic-template (номер группы регулярного выражения, начиная с 1)
topic-template-unit-group: 1
# Настройки для определения времени измерений. Опредеяет атрибут из которого следует извлечь время и применить ко всем
# измерениям пакета.
time:
# в сообщение присутствует атрибут времени (true - да и его есть откуда прочитать, false - нет, использовать текущее время)
present: true
# формат времени (UNIX, UNIX-MS, строка с форматом java)
# UNIX - время представлено в виде числа unix-time, в стандартных для него секундах
# UNIX-MS - время представлено в виде числа unix-time, но число содержит миллисекунды а не секунды
# шаблон времени Java (см шаблоны DateTimeFormatter - https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)
format: "UNIX"
# путь в json дереве для чтения значения (только если present = true)
json-path: "time"
# Каналы устройства. Настройки откуда брать значения и в каие каналы складывать. Массив.
channels:
# путь в json дереве для чтения значения
- json-path: "batteryVoltage"
# топик канала параметра в платформе, в который значение будет отправлено (Channel.channeltopic)
channel: "battery-voltage"
- json-path: "softwareVersion"
channel: "softwareVersion"
# пример извлечения атрибута вложенного объекта
- json-path: "param-state.id"
channel: "param-state-id"
- json-path: "batteryLocation"
channel: "batteryLocation"
# дополнительные настройки для парсинга геометки
geotag:
# LAT_LON - Формат в виде строки "широта долгота", где значения градусы и их доли. Разделителем широты и долготы может
# быть пробел, запятая, запятая пробел, двоеточие.
# GEOTAG - Формат в виде строки "долгота:широта" и "долгота:широта:высота" (инспарк GEOTAG).
format: LAT_LON
# Формат в виде строки "долгота:широта" и "долгота:широта:высота" (инспарк GEOTAG).
# пример для геометки инспарк (без высоты)
- json-path: "lon-lat-alt"
channel: "lon-lat-alt"
geotag:
format: GEOTAG
- json-path: "errors"
channel: "errors"
# дополнительные настройки для массовов
array:
# индекс элемента массива (0 - первый элемент, 1 - второй и т.д.)
index: 0
# путь к атрибуту если элемент массива является объектом (для примитивов должен оставаться пустым)
json-path:
- json-path: "array-of-objects"
channel: "array-of-objects-6-id"
array:
index: 1
json-path: "id"
- json-path: "array-of-objects"
channel: "array-of-objects-6-name"
array:
index: 1
json-path: "name"
# парсер другого топика MQTT с другими данными (как пример конфигурирования списка)
- mqtt-topic: "/another-measures/+"
topic-template: "^\\/another-measures\\/([a-zA-Z0-9-_]+)$"
topic-template-unit-group: 1
time:
present: true
format: "UNIX"
json-path: "time"
channels:
- json-path: "another-measures-channel"
channel: "another-measures-channel"
# Пример настроек парсера для разбора пакетов, приходящих частями
- mqtt-topic: "/partial/+"
topic-template: "^\\/partial\\/([a-zA-Z0-9-_]+)$"
topic-template-unit-group: 1
# Настройки частей сообщений
partial:
# Включено ли
enabled: true
# Название json-атрибута содержащего номер пакета (единый для всех частей)
id: "ID"
# Название json-атрибута содержащего номер части пакета
part: "part"
# Название json-атрибута содержащего признак конца пакета
end: "end"
# Номер первой части (используется при определении пропусков пакетов).
first-part: 0
time:
present: true
format: "UNIX"
json-path: "ts"
channels:
- json-path: "data"
channel: "data"Инфо
Комментарии к понятию группы идентификатора устройства. В приведенном примере ожидается, что пакеты будут приходить в следующем формате:
/measures/<ID_Устройства>
или
/measures/<ID_Устройства>/data
Важно, что <ID_Устройства> будет определено в регулярном выражении как первая группа, что и задано в ключах topic-template и topic-template-unit-group.
Настройка в платформе
- Создать ТК, где в схеме подключения будет подключено Устройство с типом подключения GATE.
- Привязать ТК к Объекту через контроллер.
- Создать Провайдера (например ID = EDGE-GATE).
- В Секции Устройства внешней системы зарегистрировать ID устройств, см. материал по настройке модуля, раздел группы.
- Связать каждый
ID_УСТРОЙСТВАс экземпляром устройства платформы. - Запустить edge-gate в режиме интеграции