RPS
Модуль интегрции с парковочной системой RPS "Российская парковочная система" - parking-gate. Описание программного обеспечения RPS по ссылке
Особенности API RPS для интеграции с внешними системами мониторинга и управления:
- система не предоставляет ни каких интерфейсов для получения состояния и управления устройствами из которых она
состоит (например шлагбаум, терминал оплаты, точка доступа, считыватель); - система предоставляет доступ к составу и состоянию зон парковки (названия зон, количество мест, количество
свободных мест, количество зарезервированных мест); - система предоставляет информацию о въезде/выезде объекта с парковки, а также связанную биллинговую информацию.
Установка модуля интеграции
Для установки модулей на хосте требуется наличие JRE (от 21.x и выше)
Создать директорию /opt/parking-gate и поместить в нее parking-gate.jar, application.yml
mkdir /opt/parking-gate
cp parking-gate.jar /opt/parking-gate
cp application.yml /opt/parking-gate
cp parking-gate.conf /opt/parking-gate
Создать файл сервиса /etc/systemd/system/parking-gate.service следующего содержания:
[Unit]
Description=parking-gate
After=syslog.target
[Service]
User=root
Group=root
ExecStart=/opt/parking-gate/parking-gate.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Перечитать список сервисов linux
systemctl daemon-reload
Запуск и остановку сервиса можно осуществлять стандартными командами, т.е.
service parking-gate start
service parking-gate status
service parking-gate stop
Запуск
Запуск с командной строки: java -jar parking-gate.jar
Модуль поддерживает два режима запуска
Чтение конфигурации Rps
Запуск в этом режиме выводит в лог информацию о зонах парковки Rps, для использования при конфигурировании
в типовой конфигурации и конфигурационном модуле, команда:
java -jar sigur-gate.jar print
Пример выдачи в лог конфигурации"
2024-10-03 13:01:44.319 INFO [r.i.sem.parking.PrintApplication] (main) ------------RPS zones:
2024-10-03 13:01:44.319 INFO [r.i.sem.parking.PrintApplication] (main) Order number in config=1, Zone=Zone(id=17d66717-64a1-419a-85e0-0be834a99000, name=Вне парковки, capacity=20000, reserved=0, freeSpace=12000)
2024-10-03 13:01:44.322 INFO [r.i.sem.parking.PrintApplication] (main) Order number in config=2, Zone=Zone(id=17d66717-64a1-419a-85e0-0be834a99001, name=Зона А, capacity=120, reserved=0, freeSpace=98)
2024-10-03 13:01:44.322 INFO [r.i.sem.parking.PrintApplication] (main) Order number in config=3, Zone=Zone(id=c9f6a241-b10a-4c12-aa0e-d99c4e38a737, name=Зона Б, capacity=120, reserved=0, freeSpace=95)
...
2024-10-03 13:01:44.322 INFO [r.i.sem.parking.PrintApplication] (main) ------------RPS tariffs:
2024-10-03 13:01:44.402 INFO [r.i.sem.parking.PrintApplication] (main) Tariff=Tariff(id=f4fba861-fe08-0857-5ba3-05ceaffa23c1, name=НОВЫЙ ТАРИФНЫЙ ПЛАН, idForCard=50)
2024-10-03 13:01:44.402 INFO [r.i.sem.parking.PrintApplication] (main) Tariff=Tariff(id=3f7fb98a-d74a-49eb-847b-17f6e0135bff, name=4 часа бесплатно, idForCard=45)
2024-10-03 13:01:44.403 INFO [r.i.sem.parking.PrintApplication] (main) Tariff=Tariff(id=24f718ff-8b97-42e3-94e8-22299a0efdf6, name=Защитный интервал, idForCard=8)
...
2024-10-03 13:01:44.404 INFO [r.i.sem.parking.PrintApplication] (main) ------------RPS groups:
2024-10-03 13:01:44.466 INFO [r.i.sem.parking.PrintApplication] (main) Group=Group(id=18e93d8f-e9bf-b6bf-3fc0-0b38c4209ac4, name=вфывы, idForCard=10)
2024-10-03 13:01:44.466 INFO [r.i.sem.parking.PrintApplication] (main) Group=Group(id=3761f44c-869d-f8a3-ecc3-0c70f7d2a323, name=Группа А, idForCard=20)
2024-10-03 13:01:44.466 INFO [r.i.sem.parking.PrintApplication] (main) Group=Group(id=9397231d-6337-42d1-af44-1f9d7890bda7, name=Группа А, idForCard=3)
...
Штатная работа
java -jar sigur-gate.jar
Модель Устройств
Для настройки интеграции Inspark с RPS в платформе необходимо завести два типовых устройства:
- Устройство Зона RPS, со следующим списком каналов:
Имя канала | Тип | Описание |
---|---|---|
id | строковый | Идентифкатор зоны |
name | строковый | Название зоны |
capacity | мгновенный | Количество машиномест |
reserved | мгновенный | Количество зарезервированных машиномест |
free_space | мгновенный | Количество свободных машиномест |
- Устройство Въезд/Выезд, со следующим списком каналов:
Имя канала | Тип | Описание |
---|---|---|
enter | импульсный | фиксирует один въезд |
exit | импульсный | фиксирует один выезд |
Инфо
ПО REST API RPS рассматривает все пункты въезда/выезда как одну сущность. В интеграции нет возможности показать через какие пункты проехала машина.
Настройка в модуле parking-gate
Настройка взаимодействия с внешней системой
# параметры интеграции
integration:
# идентификатор справочника внешних систем в Semnext которые должен обрабатывать модуль
ext-system: Rps-Sandbox
Настройки каналов устройства Зона
Для настройки каналов устройства Зона RPS необходимо в конфигурационном модуле описать имена топиков
каналов которые их представляют. Ниже показан пример настройки топиков зон для устройства.
# Настройка стандартных топиков каналов ИП устройства зона Rps в Semnext
zona-channels:
id: id # Идентифкатор зоны в Rps
name: name # Название зоны в Rps
capacity: capacity # Количество машиномест зоны в Rps
reserved: reserved # Количество занятых машиномест зоны в Rps
freeSpace: free_space # Количество свободных машиномест зоны в Rps
Настройки каналов устройства Въезд/Выезд
Из RPS в Inspark можно передавать два события:
- въезд;
- выезд.
Для настройки передачи событий из RPS в Inspark необходимо в конфигурационном файле модуля для событий въезд/выезд, которое передается в Inspark определить (см. ниже пример интеграции событий):
- соответсвующее ему событие (semEventId)
- дополнительно определить шаблон сообщения
- канал устройства Въезд/Выезд (semChannel) и значение (value) которое будет отправляться по событию.
event:
entry:
semEventId: 32231
semEventMessageTemplate: Въезд через $DEVICE_TYPE $DEVICE_NAME из зоны $ZONE_BEFORE в зону $ZONE_AFTER
semChannel: entry
value: 1
exit:
semEventId: 32232
semEventMessageTemplate: Выезд через $DEVICE_TYPE $DEVICE_NAME тип клиента $TYPE_CLIENT, прошла оплата $AMOUNT
semChannel: exit
value: 1
Совет
Шаблон текста события, поддерживаются подстановки:
- $DEVICE_TYPE - тип устройства RPS;
- $DEVICE_NAME - наименование устройства RPS;
- $ZONE_BEFORE - из зоны
- $ZONE_AFTER - в зону
- $TYPE_CLIENT - тип клиента разовый/постоянный;
- $AMOUNT - сумма оплаты.
Создание заявок на проезд
Данный функционал реализован в рамках интеграции с третьими системами по протоколу AMQP(RabbitMQ).
Алгоритм работы модуля по созданию пропусков для парковки
Модуль parking-gate активизируется на создание пропуска при появлении сообщений в очереди "request" заявок на пропуска RabbitMQ. В очередь «request» заявки отправляет взаимодействующее третье ПО. Поддерживаются следующие типы попусков на парковку
- по государственному регистрационному номеру транспортного средства (ГРН);
- по RFID метке;
- по QR коду.
Результат создания пропуска parking-gate отправляет в очередь обработанных заявок "response" RabbitMQ из которой третье (взаимодействующее) ПО их забирает и далее обрабатывает по своему алгоритму. Если заявка выполнена успешно, в ответе будет содержаться
идентификатор тэга (для RFID меток и проезда по гос номеру транспортного средства (ГРН),
далее LPN - license plate number для обозначения типа заявки) или идентификатор QR кода (штрихкод) для проезда
по QR коду. Если пропуск не сформирован, ответ будет содержать описание ошибки.
При обработке каждого сообщения очереди заявок на пропуск выполняются следующие действия:
- Шаг 1. Из тела сообщения выбрать пропуск и прочитать настройки конфигурации для запрашиваемого типа пропуска (ФИО и др. атрибуты, которые позволят связать пропуск с биллинговой информацией)
- Шаг 2. Проверка заявки на заполнение обязательных атрибутов на пропуск, в случаи ошибок переход к шагу 5:
- Шаг 2.1 Для всех типов пропусков является обязательным заполнение идентификатора заявки и идентификатора пропуска (RFID - метка, LPN и QR - ГРН)
- Шаг 2.2 Для LPN и RFID проверка на заполнение данных о юридическом или физическом лице.
- Шаг 2.3 Для QR проверка заполнения информации о юридическом лице запрашивающим пропуск и ФИО гостя.
- Шаг 2.4 Для QR проверка заполнения информации электронной почте гостя и модели транспортного средства, при их отсутствии заполнение из настроек конфигурации модуля
- Шаг 3. Создание пропуска
- Шаг 3.1 Для LPN и RFID:
- Шаг 3.1.1 В зависимости от того задано название юридического лица или физического выполняется его поиск в RPS и его создание, если оно не существует (RPS позволяет создавать юридические и физические лица с одинаковым именем, поэтому если модуль находит несколько действующих записей с одинаковым именем, будет использоваться последняя измененная запись).
- Шаг 3.1.2 Для юридического лица или физического создается парковочная карта, с параметрами биллинга определенными для данного типа пользователей.
- Шаг 3.1.3 В зависимости от LPN и RFID создается метка для парковочной карты созданной на шаге 3.1.2
- Шаг 3.2 Для QR:
- Шаг 3.2.1 Ищется юридическое лицо запросившее QR, если оно еще не зарегистрировано, выполняется его создание (если юр лиц с запрашиваемым именем несколько, см. шаг 3.1.1).
- Шаг 3.2.2 От юридического лица регистрируется QR код в RPS, с параметрами биллинга определенными для создания QR/
- Шаг 4. Отправить ответ в очередь ответов с результатом выполнения заявки: для LPN или FRID идентификатор созданной метки в RPS, для QR штрих кодом для генерации qr кода на стороне взаимодействующего ПО (если передать email гостя RPS сам отработает отправку qr гостю, но это не функционал модуля parking-gate, также RPS не отправляет push уведомления и т.п.)
- Шаг 5. Отправить ответ в очередь ответов с идентификатором заявки и описанием ошибки почему пропуск не выписан, завершить выполнение обработки.
Инфо
Штрих код для QR в RPS это уникальный идентификатор, который создается по стандартным правилам
Описание заявки на пропуск
Заявки на проезд на парковку отправляются в специальную очередь "request" заявок RabbitMQ в json формате.
Атрибуты заявки:
Идентификатор | Тип | Описание |
---|---|---|
id* | integer | Идентификатор заявки на пропуск (уникальный идентификатор от третьего приложения) |
type* | string | Тип пропуска. Значения: PARKING_LPN (ГРН на авто), PARKING_RFID, PARKING_QR |
name | string | Имя физического лица для LPN и RFID, имя гостя для QR, для которого запрашивается пропуск(ФИО) |
departmentName | String | Имя юридического лица (названии компании) |
tagId* | String | Для PARKING_LPN и PARKING_QR - ГРН, для PARKING_RFID идентификатор метки |
String | Для PARKING_QR электронная почта гостя | |
carModel | String | Для PARKING_QR модель транспортного средства гостя |
Совет
- помечены атрибуты обязательные для всех типов заявок
- значения mail и carModel если не заданы для QR, будут установлены из конфигурационного файла по умолчанию
Примеры заявок на пропуск
для ГРН (юридическое лицо):
{
"id": 1022,
"type": "PARKING_LPN",
"departmentName": "Ресторан",
"tagId": "A001AA97"
}
для RFID (физическое лицо):
{
"id": 1024,
"type": "PARKING_RFID",
"name": "Иванов Иван",
"tagId": "100332"
}
для QR:
{
"id": 1023,
"type": "PARKING_QR",
"name": "Иванов Иван",
"departmentName": "Ресторан",
"tagId": "A001AA97",
"carModel": "Mercedes-Benz S-Класс AMG 63 AMG Long",
"email": "test@infsys.ru"
}
Описание ответа на заявку на пропуск
Ответ на заявку на выдачу пропуска отправляются в специальную очередь "response" готовых пропусков RabbitMQ в json
формате. Атрибуты ответа:
Идентификатор | Тип | Описание |
---|---|---|
id | integer | Идентификатор заявки на пропуск (уникальный идентификатор от третьего приложения) |
value | string | Штрихкод для QR кодов, идентификатор тега в RPS для остальных |
error | string | Сообщение об ошибке при создании пропуска в RPS |
Примеры ответа на заявки на пропуск
успешное создание пропуска:
{
"id": 1022,
"value": "9CA96B14-CE75-4324-893D-03C22F1BD60E"
}
пропуск не создан:
{
"id": 1023,
error: "Outstanding payment"
}
Настройки модуля в конфигурационном файле для создания пропусков
Для настройки создания пропусков в Rps с использованием parking-gate необходимо в конфигурационном файле модуля определить настройки интеграции для RabbitMQ и Rps
Настройки модуля для А101
В конфигурационном файле настройте раздел a101 как показано ниже
# Настройка на взаимодействие с RABBITMQ
a101:
# доступность интеграции с RabbitMQ
enabled: true
# настройка на обмен сообщениями по протоколу AMQP
rabbitmq:
# сервер rabbitmq
host: localhost
# порт
port: 5672
# пользователь
user: user
# пароль
password: password
# виртуальный сервер для взаимодействия с RPS
virtualHost: rps
# очередь заявок на пропуск в RPS
request-queue: request
# очередь ответа на заявки на пропуск в RPS
response-queue: response
Настройки Rps
В конфигурационном файле настройте раздел rps как показано ниже
# Настройки на сервер Rps
rps:
server:
# Адрес сервера Rps
host: sandbox.r-p-s.ru
# порт для rest api Rps
port:
# путь для rest api Rps
path: /api2/remote/
# выдаётся администратором рабочей станции или технической службой РПС
token: XXXXXXXXXXXXXXXXXXXXXXXXXX
# выдаётся администратором рабочей станции или технической службой РПС
developerId: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
# Настройки обратной связи для подписок
response:
# Адрес для модуля
host: 127.0.0.1
# порт для rest api Rps
port: 8080
# путь для rest api Rps
path: /parking/rps/
# Настройки создания пропусков
pass-settings:
# для физического лица
client:
# идентификатор тарифной сетки для карты (TSidFC)
tariffScale: 45
# идентификатор тарифного плана для карты (TPidFC)
tariffPlan: 8
# Группа объекта (ClientGroupidFC)
clientGroup: 3
# для физического лица
company:
# идентификатор тарифной сетки для карты (TSidFC)
tariff-scale: 1
# идентификатор тарифного плана для карты (TPidFC)
tariff-plan: 44
# Группа клиента (ClientGroupidFC)
client-group: 2
qrCode:
# идентификатор тарифной сетки для qr кодов (IdTS)
tariff-scale: 27
# идентификатор тарифного плана для qr кодов (IdTP)
tariff-plan: 37
# Группа для BCF=3 (GroupIdFC), для qr кодов можно не задавать
client-group:
# Электронная почта по умолчанию, если она не задана в заявке только для Qr
default-email: test
# Модель трансппортного средства, если она не задана в заявке только для Qr
default-carModel: car
Инфо
Настройки token и developerId выдаётся администратором рабочей станции или технической службой РПС
Настройки response это настройки parking-gate, которые будет вызывать Rps при наступлении событий по подписки на транзакции и зоны
Настройки pass-settings это настройки биллинга для заказа пропусков для каждого типа пропусков, чтобы посмотреть возможные варианты заполнения тарифов и групп клиента см информацию, выдаваемую модулем в режиме печати конфигурации
RPS
Настройка в платформе
В платфоме выполнить следующие действия
- Создать 2 Устройства (см. выше).
- Завести в справочнике Событий события, которые будут передаваться в Журнал событий от системы RPS
- Внести в настройку модуля parking-gate номера событий платформы, соотнеся их с теми событиями RPS, по которым необходимо получать данные
- Внести Устройство RPS в Типовую конфигурацию, которая будет использована на объекте интеграции, указать для Схемы соединения тип GATE. Одна схема соединения должна соответствовать одной Зоне RPS. Для устройства въезд/выезд создается одна схема соединения.
- Создать Провайдера с iD RPS, он должен совпадать с ключом extSystem в application.yml gate модуля.
- В секции Усройства внешней системы зарегистрировать адреса зон и привязать к ним экземпляры устройств-зон.
Ниже приведен пример привязки.
Инфо
- Для устройства въезда/выезда используйте ID enter
- Для парковочных зон воспользуйтесь режимом принт модуля
- После завершение настроек в приложении Inspark, перестартовать модуль sentinel_gate.
Алгоритм работы модуля:
- при старте модуль читает конфигурацию зон в Rps и Inspark и по всем интегрируемым зонам отправляет значения
параметров в Inspark; - при старте модуль подписывается на транзакции и зоны и ждет вызова от Rps;
- периодически в соответствии с настройками модуль отправляет состояние зон парковки, даже если параметры не менялись;
- Rps при изменении в зонах по подписке вызывает модуль parking-gate, модуль обрабатывает данные и отправляет значения параметров по зонам (контролируем количество свободных мест);
- Rps при въезде или выезде по подписке вызывает модуль parking-gate, модуль обрабатывает данные транзакции и если настроено соответсвующее событие отправляет событие в Inspark и связанное с ним значение параметра.