===== Описание протокола REST API =====
==== Общие настройки ====
Протокол предназначен для обмена данными с устройствами и сторонними системами сбора данных, подключаемых по шине REST API. Обмен данными осуществляется в формате JSON.
**Подключение к серверу системы мониторинга по протоколу REST API**
Для подключения к серверу системы мониторинга по протоколу REST API используется //http//-протокол соединения. В //http//-адресе нужно указать домен или IP-адрес сервера. Например:
http://[Домен или IP адрес]/api/[Параметр запроса]
На сервере поддерживается два типа запроса:
* GET-запрос для получения данных из системы мониторинга;
* POST-запрос для записи данных в систему мониторинга.
**Регистрация устройств и сторонних систем сбора данных по протоколу REST API**
Для авторизации необходимо указать API-токен. Токен указан в настройках Пользователя. Для того, чтобы токен работал, в настройках Пользователя должен быть включен чек-бокс «Доступ к API».
{{:документация:описание_протокола_rest_api:rest_api_токен_.jpg?200|}}
Для запроса данных необходимо использовать GET-запрос с параметром «Authorization» в заголовке запроса. В адресной строке в качестве GET-параметра указать API-токен. Например:
http://[SERVER]/api/[Параметр_запроса]?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn)
Для отправки данных на сервер создать POST-запрос одним из трех способов:
1. В адресной строке в качестве GET-параметра указать API-токен. Например:
http://[SERVER]/api/[Параметр_запроса]?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn)
2. В теле запроса указать параметр API-токен
3. В заголовке запроса («Bearer») указать параметр «Authorization», значение «Bearer» ''hBI4O8rClizALOPcrJ4DbljhHS8cVthn''.
**Синхронизация времени сервера и источника данных**
Для синхронизации времени формируется запрос метки времени, который возвращает текущее время сервера в формате JSON. Параметр GET запроса – «''timestamp''». Время указано в формате GMT.
Пример запроса:
http://[SERVER]/api/timestamp?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn
Пример ответа:
{
"code":200,
"status":"success",
"data":{
"timestamp":1660039669
}
}
==== Запросы ====
**Запрос списка шин**
Запрос списка шин формируется для отображения параметров активных шин в системе. Параметр GET запроса – «''/buses''».
Таблица 1.
^ Параметр в JSON^Поле в системе мониторинга|
|//id// |Уникальный номер шины в системе мониторинга|
|//code// |Код шины|
|//comment// |Комментарий|
|//tcp_remote_address// |IP-адрес (Конвертор, OPC Gateway Service, XNB mqtt URL)|
|//tcp_port// |Порт сервера|
|//bus_type// |Тип шины|
|//enabled/disabled// |Шина включена/выключена|
Пример запроса:
http://[SERVER]/api/buses?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn
Пример ответа:
{
"code": 200,
"status": "success",
"data": [{
"id": 1,
"code": "rest1",
"comment": null,
"tcp_remote_address": null,
"tcp_port": null,
"bus_type": "restapijson",
"enabled": true
}]
}
**Запрос информации по выбранной шине**
Для получения параметров шины и списка устройств необходимо сформировать GET-запрос «''/buses/{buse_code}''».
Для выбора шины необходимо указать «''code''» (код шины) вместо переменной «''{buse_code}''». Входные данные на запрос содержат информацию по запрошенной шине (см. Таблица 1) и информацию по всем устройствам, подключенным к шине (см. Таблица 2).
Таблица 2.
^Параметр в JSON (массив значений: //device//)^Поле в системе мониторинга|
|//id// |Уникальный номер устройства в системе мониторинга|
|//code// |Код устройства|
|//device_type// |Тип устройства|
|//comment// |Комментарий|
|//active_metering_period// |Периодичность опроса устройства, секунд|
|//auto_metering_period// |Периодичность сеансов измерений, секунд|
|//correction_angle// |Коррекция азимута, градус|
|//correction_reverse// |Система координат|
Пример запроса:
http://[SERVER]/api/buses/rest1?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn
Пример ответа:
{
"code": 200,
"status": "success",
"message": "Information on devices and buses"
"data": {
"id": 1,
"code": "rest1",
"comment”: "",
"tcp_remote_address": "192.168.0.1",
"tcp_port": 0,
"bus_type": "restapijson",
"device1": {
"id": 1,
"code": "test1"
"device_type": "Спектроанализатор",
"comment": "",
"active_metering_period": 600,
"auto_metering_period": 60,
"correction_angle": 0,
"correction_reverse": 0
}
}
}
**Запрос информации по выбранному устройству**
Для получения параметров устройства и списка каналов необходимо сформировать GET-запрос «''/sensors/{device_code}''».
Для выбора устройства необходимо указать «''code''» (код устройства) вместо переменной «''{device_code}''». Входные данные на запрос содержат информацию по шине (см. Таблица 1), запрошенному устройству (см. Таблица 2) и информацию по всем каналам выбранного устройства (см. Таблица 3).
Таблица 3.
^Параметр в JSON (массив значений: //channels//)^Поле в системе мониторинга|
|//id// |Уникальный номер канала в системе мониторинга|
|//sensor_id// |Уникальный номер устройства в системе мониторинга|
|//addr// |Адрес|
|//code// |Код канала|
|//height// |Высотная отметка, м|
|//correction_ratio// |Коэффициент преобразования|
|//correction// |Смещение 0|
Пример запроса (запрос возвращает данные за последние 24 часа):
http://[SERVER]/api/sensors/test1?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn
Пример ответа:
{
"code": 200,
"status": "success",
"data": {
"id": 1,
"bus_id": 1,
"code": "test1",
"device_type": "spectroanalyzer",
"comment": null,
"active_metering_period": "600.00",
"auto_metering_period": "0.0000",
"correction_angle": "0",
"correction_reverse": false,
"enabled": true,
"channels": [{
"id": 1,
"sensor_id": 1,
"addr": "t1",
"code": "t1",
"height": "0",
"correction_ratio": null,
"correction": "0"
}, {
"id": 2,
"sensor_id": 1,
"addr": "t2a",
"code": "t2c",
"height": "0",
"correction_ratio": null,
"correction": "0"
}],
"bus": {
"id": 1,
"code": "rest1",
"tcp_remote_address": "62.213.109.66",
"tcp_port": 0,
"bus_type": "restapijson",
"enabled": true,
"comment": null
}
}
}
**Запрос данных измерения по выбранному Каналу**
Для получения информации об измерениях за выбранный период времени необходимо сформировать GET-запрос «''/channels_data/{channel_id}''».
Для выбора канала необходимо указать «''id''» (уникальный номер канала в Системе Мониторинга) вместо переменной «''{channel_id}''». Входные данные на запрос содержат информацию данных в выбранном канале (см. Таблица 4).
Таблица 4.
^Параметр в JSON^Поле в системе мониторинга|
|//dateFrom// |Дата начала запрошенного периода|
|//dateTo// |Дата окончания запрошенного периода|
|//values→time// |Время измерения|
|//values→val// |Значения измерения|
Пример запроса:
http://[SERVER]/api/channels_data/2?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn
Пример ответа:
{
"code": 200,
"status": "success",
"data": {
"dateFrom": "2022-08-09 20:14:35",
"dateTo": "2022-08-10 20:14:35",
"values": [{
"time": 1660058075,
"val": null
, {
"time": 1660058675,
"val": null
}, {
"time": 1660115343,
"val": null
"time": 1660116283,
"val": 160
}, {
"time": 1660144475,
"val": null
}]
}
}
**Запрос статусов по объекту мониторинга**
Для получения статусов по каналам (сигнализации) на объекте мониторинга необходимо сформировать GET-запрос «''/objects_status/{object_id}''».
Для выбора объекта мониторинга укажите «''id''» (уникальный номер объекта мониторинга в Системе) вместо переменной «''{object_id}''». Входные данные на запрос содержат информацию по объекту мониторинга (см. Таблица 5).
Таблица 5.
^Параметр в JSON^Поле в системе мониторинга|
|//id// |Уникальный номер объекта мониторинга|
|//title// |Название объекта|
|//interval// |Интервал, секунды (для внешних систем)|
|//date// |Дата и время запроса данных|
|//enabled_buses→bus_id// |Уникальный номер шины|
|//enabled_buses→name// |Название шины|
|//enabled_buses→code// |Код шины|
|//enabled_sensors→sensor_id// |Уникальный номер устройства|
|//enabled_sensors→name// |Название устройства|
|//enabled_sensors→code// |Код устройства|
|//channels→channel_id// |Уникальный номер канала|
|//channels→name// |Название канала|
|//channels→code// |Код канала|
|//channels→state// |Статус|
Пример запроса:
http://[SERVER]/api/objects_status/{object_id}?api_token=hBI4O8rClizALOPcrJ4DbljhHS8cVthn
Пример ответа:
{
"code": 200,
"status": "success",
"data": {
"id": 1,
"title": "Название объекта",
"interval": 15,
"date": "2022-10-03 22:24:34",
"enabled_buses": [{
"bus_id": 1,
"name": "REST API (JSON)",
"code": "rest1",
"enabled_sensors": [{
"sensor_id": 1,
"name": "Название устройства",
"code": "Код устройства",
"channels": [{
"channel_id": 1,
"name": "Название канала",
"code": "Код канала",
"state": "gray"
}, {
"channel_id": 2,
"name": "Название канала",
"code": "Код канала",
"state": "gray"
}]
},{
"sensor_id": 2,
"name": "RestAPI 2",
"code": "test2",
"channels": [{
"channel_id": 3,
"name": "T1",
"code": "t1",
"state": "red"
}, {
"channel_id": 4,
"name": "T2",
"code": "t2c",
"state": "green"
}]
}, ....
**Запрос элементов конструкции по объекту мониторинга**
Для получения информации о параметрах конструктивных элементов и сигнализации по каналам на объекте мониторинга необходимо сформировать GET-запрос «''object_elements/{object_id}''». Для выбора объекта мониторинга укажите «''id''» (уникальный номер объекта мониторинга в Системе) вместо «''{object_id}''». Назначение параметров в JSON-формате – см. Таблица 6.
Таблица 6.
^Параметр в JSON^Поле в системе мониторинга|
|//location_id// |Уникальный номер ОМ|
|//location_title// |Название объекта мониторинга|
|//location_code// |Код объекта мониторинга|
|//elements→id// |ID элемента|
|//elements→bus_id// |Уникальный номер шины|
|//elements→_lft// |Параметр для построения дерева элемента конструкции|
|//elements→_rgt// |Параметр для построения дерева элемента конструкции|
|//elements→parent_id// |Параметр для построения дерева элемента конструкции|
|//elements→title// |Название элемента|
|//elements→type// |Тип элемента|
|//elements→code// |Код элемента|
|//elements→description// |Описание элемента|
|//elements→state// |Категория технического состояния|
|//elements→sensors// |Параметры устройства, привязанного к элементу|
|//elements→sensor_channels// |Параметры Канала, привязанного к элементу|
Пример запроса:
http://[HOSTNAME]/api/object_elements/{object_id}?api_token=1I18lUJW0lIiBjE0zvSeum3TSs06vcKi
Пример ответа:
{
"code": 200,
"status": "success",
"data": {
"location_id": 1,
"location_title": "1",
"location_code": null,
"elements": [{
"id": 9,
"_lft": 2,
"_rgt": 5,
"parent_id": 1,
"title": "L1E1",
"type": "",
"code": "l1e1",
"description": null,
"state": "",
"sensors": [{
"id": 8,
"name": "A1.1 X",
"code": "8",
"enabled": true,
"channels": [{
"channel_id": 26,
"name": "1 d1",
"code": "d1",
"state": "gray"
}, {
"channel_id": 34,
"name": "5 f5-2",
"code": "f5-2",
"state": "gray"
}]
}],
"sensor_channels": [{
"channel_id": 26,
"sensor_id": 8,
"name": "1 d1",
"code": "d1",
"enabled": true,
"state": "gray"
}]
}, {
"id": 15,
"_lft": 9,
"_rgt": 10,
"parent_id": 14,
"title": "L1E2222",
"type": “",
"code": "l1e2222",
"description": null,
"state": "",
"sensors": [{
"id": 9,
"name": "A1.1 Z",
"code": "9",
"enabled": true,
"channels": [{
"channel_id": 41,
"name": "1 d1",
"code": "d1",
"state": "gray"
}, {
"channel_id": 42,
"name": "1 f1",
"code": "f1",
"state": "gray"
}, {
"channel_id": 48,
"name": "5 f5",
"code": "f5",
"state": "gray"
}, {
"channel_id": 49,
"name": "5 f5-2",
"code": "f5-2",
"state": "gray"
}]
}],
"sensor_channels": []
}]
}
}
==== Запись данных по протоколу ====
Запись данных в базу данных Систему Мониторинга осуществляется при условии, что для устройства выбран тип шины «REST API (JSON)».
Для записи данных необходимо сформировать POST-запрос «''/sensors_data/ {device_code}''».
Для выбора устройства укажите «''code''» (код устройства) вместо переменной «''{device_code}''». Данные запроса для записи в базу данных содержат информацию по каналу выбранного устройства (см. Таблица 7).
Таблица 7.
^Параметр в JSON^Поле в системе мониторинга|
|//api_token// |Токен для доступа к API|
|//timestamp// |Время измерения|
|//data→addr// |Адрес канала|
|//data→value// |Значения измерения|
Пример адреса для POST запроса:
http://[SERVER]/api/sensors_data/test1
Пример JSON-формата, где параметр ''data'' – строковое значение:
{
"api_token": "hBI4O8rClizALOPcrJ4DbljhHS8cVth",
"timestamp": 1659696538,
"data": “[{\"addr\": \"t1\", \"value\": 12}, {\"addr\": \"t2a\",\"value\": 22}]”
==== Сообщения об ошибках в протоколе ====
А. Ответ при отсутствии ID объекта мониторинга при запросе списка элементов:
{
"code": 404,
"status": "error",
"message": "Object with this id was not found.",
"data": {
"object_id": 15
}
}
Б. Ответ при отключении пользователя (чек-бокс «Доступ к API» выключен у Пользователя):
{
"code": 404,
"status": "error",
"message": "Device with this code was not found.",
"data": {
"device_code": "test3"
}
}
В. Ответ при неверном API-Токене:
{
"code": 401,
"status": "error",
"message": "Unauthenticated."
}
Г. Не найдена шина в системе мониторинга:
{
"code": 404,
"status": "error",
"message": "Bus with this code was not found.",
"data": {
"bus_code": "rest2"
}
}
Д. При записи данных протокол обмена указан неверно (не «REST API (JSON)»):
{
"code": 403,
"status": "error",
"message": "Bus type must be REST API (JSON).",
"data": {
"bus_code": "rest1"
}
}
Е. Шина выключена или не создана:
{
"code": 403,
"status": "error",
"message": "The bus is off.",
"data": {
"bus_code": "rest1"
}
}
Ж. Код устройства не найден:
{
"code": 404,
"status": "error",
"message": "Device with this code was not found.",
"data": {
"device_code": "test3"
}
}
З. Устройство выключено или отсутствует в системе мониторинга:
{
"code": 403,
"status": "error",
"message": "The device is off.",
"data": {
"bus_code": "rest1",
"sensor_code": "test1"
}
}
И. Ответ при отсутствии записи отдельных каналов в базе данных (при этом запись в базе данных других каналов не останавливается):
{
"code": 201,
"status": "success",
"data": {
"sensor_code": "test2",
"answer": "Skipped addresses: ['t1v']"
}
}