EDGE шлюз
Описание
Модуль используется для получения и обработки json-пакета, структура которого задается в модуле и платформе.
Программно-определяемая схема обработки json-пакета позволяет гибко задать требуемые атрибуты для парсинга данных.
Для обмена между источником данных и платформой используется любой MQTT брокер, в том числе MQTT-брокер в составе платформы.
Модуль выполняет следующие функции:
- описывает json структуру с данными, которая будет поступать на MQTT брокер;
- подписывается на заданный топик для получения данных;
- обрабатывает пакет данных, который должен соответствовать заданной структуре данных.
Модуль позволяет описать структуру с разными типами данных, определить в структуре штамп времени, гео тэг, а также массивы.
Совместимость
Для корректной работы 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Модель Устройства
Модель устройства определяется самим пользователем. Тип и количество параметров может быть любым, которые поддерживает платформа.
Например, приведем пример пакета который будет приходить на модуль:
{
"time": 1707393139,
"batteryVoltage": 654.7,
"errors": [
"Need acknowledge"
],
"softwareVersion": "2.7.0",
"batteryLocation": "-36.785418, 148.102977",
"lon-lat-alt": "39.5:45.4:200",
"array-of-objects": [
{
"id": 5,
"name": "object5"
},
{
"id": 6,
"name": "object6"
}
],
"param-state": {
"id": 99
}
}Если требуется получать все данные пакета, в разделе Устройства зададим ему модель:
| Название параметра | Тип |
|---|---|
| batteryVoltage | мгновенный |
| errors | строковый |
| softwareVersion | строковый |
| batteryLocation | строковый |
| lon-lat-alt | гео |
| name_1 | строковый |
| name_2 | строковый |
| param_state | мгновенный |
Ниже, в разделе Настройка модуля показана как для такого json пакета необходимо задать схему обработки.
Настройка модуля
Настройка модуля производится в файле application.yml.
Настройки позволяют выбрать профиль логирования (console - вывод в консоль, file - вывод в файл).
spring:
profiles:
# console - вывод в консоль, file - вывод в файлы logs/logN с ротацией по размеру
active: consoleСледует задать настройки подключения к рест-сервисам inspark и идентификатор внешней системы (провайдера данных чьи устройства будут обслуживаться)
# подключение к рест-сервисам inspark (должен заканчиваться слэшем)
rest:
url: http://localhost:8080/sem-restservices/
user: <user>
password: <password>
extSystemId: EDGE-GATE # имя внешней системы в разделе ПровайдерыЗадаем настройки подключения к брокеру MQTT
# настройки подключения к брокеру MQTT
mqtt:
url: tcp://localhost:1883
user: <user>
password: <password>Настройки парсинга измерений
measure-parser:
# топик 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: "name_1"
array:
index: 1
json-path: "name"
- json-path: "array-of-objects"
channel: "name_2"
array:
index: 2
json-path: "name"Инфо
Комментарии к понятию группы идентификатора устройства. В приведенном примере ожидается, что пакеты будут приходить в следующем формате:
/measures/<ID_Устройства>
или
/measures/<ID_Устройства>/data
Важно, что <ID_Устройства> будет определено в регулярном выражении как первая группа, что и задано в ключах topic-template и topic-template-unit-group.
Настройка в платформе
- Создать ТК, где в схеме подключения будет подключено Устройство с типом подключения GATE.
- Привязать ТК к Объекту через контроллер.
- Создать Провайдера (например ID = EDGE-GATE).
- В Секции Устройства внешней системы зарегистрировать ID устройств, см. материал по настройке модуля, раздел группы.
- Связать каждый
ID_УСТРОЙСТВАс экземпляром устройства платформы. - Запустить edge-gate в режиме интеграции