Выжимка формата передачи данных (приказ Росприроднадзора)
Общие принципы
- Протокол: HTTP, метод – стандартный запрос (вероятно POST).
- Формат данных: JSON.
- Подпись: каждая передаваемая структура подписывается электронной подписью (поле
signatureв заголовке HTTP). - Идентификаторы: UUID для АСИ, датчиков, источников, показаний – назначаются при вводе в эксплуатацию и не меняются.
- Временные метки: Unix-time (целое число). Для усреднённых данных указываются
timestamp_startиtimestamp_end, для мгновенных – равны друг другу. - Передача: данные могут передаваться массивами (несколько источников, датчиков, параметров, значений) в одном JSON.
Структура запроса от АСИ в ПТО УОНВОС (передача измерений)
Путь запроса/devices/{device_uuid}/sources/
Заголовки HTTP
onv– уникальный идентификатор объекта в реестре (строка)signature– электронная подпись (строка)
Тело запроса (JSON) – содержит следующие элементы:
| Поле | Тип | Описание |
|---|---|---|
timestamp | integer | Отметка времени отправки запроса АСИ |
sources | array | Массив источников выбросов/сбросов |
source_uuid | string | Уникальный идентификатор источника |
pniv | integer | Порядковый номер источника |
sensors | array | Массив датчиков, относящихся к источнику |
sensor_uuid | string | Уникальный идентификатор датчика |
state | string | Состояние датчика: OK, ERROR, MAINTENANCE |
parameters | array | Массив типов показаний (например, концентрация, расход) |
parameter_uuid | string | Уникальный идентификатор показания |
code | string | Код показания (см. таблицу кодов) |
unit | string | Единица измерения (например, kgPH, mgPdm3, State) |
type | string | Тип данных: float, string |
values | array | Массив конкретных значений за интервалы |
value_uuid | string | Уникальный идентификатор значения |
timestamp_start | integer | Начало интервала усреднения |
timestamp_end | integer | Конец интервала усреднения |
value | float / string | Само значение (число или строка) |
Коды показателей (примеры)
- Выбросы:
HClkgPerHour,SO2kgPerHour,NOxkgPerHour,COxkgPerHour,SuspendedParticulateskgPerHour,ElectronicSealStateи др. - Сбросы:
Volumem3PerHour,TemperatureC,PH,OxygenConsumptionmgPerdm3,SuspendedParticulatesmgPerdm3,NO3mgPerdm3,NH4mgPerdm3,PO43mgPerdm3.
Структура ответа от ПТО УОНВОС к АСИ
Заголовки HTTP
signature– электронная подпись *
Тело ответа (JSON)
| Поле | Тип | Описание |
|---|---|---|
code | integer | HTTP код состояния (200, 403 и т.д.) |
message | string | Сообщение к коду |
commands | array | (опционально) Массив команд для АСИ |
command_uuid | string | Уникальный идентификатор команды |
command | string | Команда: TimeSyncNTP или Maintenance |
arguments | string | Аргумент (URL NTP-сервера или сервера обслуживания) |
errors | array | (опционально) Массив ошибок |
uuid | string | Идентификатор элемента, к которому относится ошибка |
error_message | string | Код ошибки: BadDS (неверная подпись), BadData (неверные данные) |
Структура отчёта о выполнении команды (от АСИ к ПТО)
Путь запроса – такой же: /devices/{device_uuid}/sources/
Заголовки – onv, signature
Тело JSON
command_uuid– идентификатор полученной командыresult–OKилиERROR
Полный JSON (пример успешной передачи одного показателя)
Ниже приведён пример из документа (Пример I) – передача данных о выбросе хлористого водорода и состоянии электронной пломбы.
HTTP-запрос (метод POST)
Путь/devices/296cba51-6936-463d-9d83-911ef06355d0/sources/
Заголовки
onv: "12-3456-789012-П"
signature: "HVWKW1CrcBoYb7TMJzO1HZqfF4vTjZ2X"
Content-Type: application/jsonТело (JSON)
{
"timestamp": 1559315491,
"sources": [
{
"source_uuid": "1659c3c8-e887-4b73-bee7-b1cabf2cc8e9",
"pniv": 1,
"sensors": [
{
"sensor_uuid": "bbc5c3fe-0368-466f-8d7f-efffed500fa2",
"state": "OK",
"parameters": [
{
"parameter_uuid": "1e95b92e-16e4-42d9-b739-ecf6d827285c",
"code": "HClkgPerHour",
"unit": "kgPH",
"type": "float",
"values": [
{
"value_uuid": "4885a599-bb6d-4af0-89cd-1f2be320b56f",
"timestamp_start": 1559313898,
"timestamp_end": 1559315098,
"value": 1.35
}
]
},
{
"parameter_uuid": "c1e754ee-3aee-45dc-a34c-0fc25c55147b",
"code": "ElectronicSealState",
"unit": "State",
"type": "string",
"values": [
{
"value_uuid": "26f37de7-9ae5-45c6-9f81-46cff9bf556a",
"timestamp_start": 1559313898,
"timestamp_end": 1559315098,
"value": "OK"
}
]
}
]
}
]
}
]
}Пояснения к полям примера
| Поле | Значение | Пояснение |
|---|---|---|
timestamp | 1559315491 | Время отправки запроса (Unix-time, соответствует 31.05.2019 ~19:11) |
source_uuid | 1659c3c8-... | Идентификатор источника выброса (закреплён при вводе) |
pniv | 1 | Порядковый номер источника в документации |
sensor_uuid | bbc5c3fe-... | Идентификатор датчика |
state | "OK" | Датчик работает исправно |
parameter_uuid | 1e95b92e-... | Идентификатор конкретного типа показания (выброс HCl) |
code | "HClkgPerHour" | Тип показания – хлористый водород в кг/ч |
unit | "kgPH" | Единица измерения (кг в час) |
type | "float" | Числовое значение |
values[0].value_uuid | 4885a599-... | Идентификатор именно этого значения |
timestamp_start | 1559313898 | Начало интервала усреднения (31.05.2019 18:44:58) |
timestamp_end | 1559315098 | Конец интервала усреднения (31.05.2019 19:04:58) |
value | 1.35 | Усреднённый выброс HCl = 1.35 кг/ч |
Второй parameter | ElectronicSealState | Показание состояния электронной пломбы |
value | "OK" | Пломба не нарушена |
Ответ ПТО УОНВОС (успешный)
Заголовки
signature: "ZLTU8pcgpY+9qg+KMnvgrKqWdKzHqK28"Тело
{
"code": 200,
"message": "OK"
}Ключевые требования
Все UUID должны быть неизменны в течение эксплуатации.
Для усреднённых данных интервал задаётся timestamp_start и timestamp_end.
Каждый блок values может содержать несколько записей за разные интервалы (см. Пример IV – 8 значений за сутки).
Электронная подпись обязательна в каждом запросе и ответе.
При ошибках ПТО возвращает код 403 и команды/сообщения об ошибках.
* Подпись в данном формате — это усиленная квалифицированная электронная подпись (КЭП)-. При передаче данных через API шифруется и подписывается весь HTTP-запрос целиком. Вот из чего складывается её механика и каким нормативным требованиям она отвечает:
📑 Где и как передается подпись?
Согласно приложению к Приказу № 382, подпись и данные для её проверки передаются в трёх местах--28:
В пути HTTP-запроса: обязательно указывается device_uuid — уникальный идентификатор автоматического средства измерения (АСИ)-.
В заголовке (HTTP-хедер): передаются ключевые элементы:
signature — сама электронная подпись-.
serial — уникальный номер сертификата ключа проверки электронной подписи--10. По этому номеру ПТО УОНВОС находит публичный ключ организации и проверяет подпись-27.
onv — уникальный идентификатор объекта в реестре ОНВОС-.
В теле (JSON-структура): содержится timestamp — точное время отправки запроса с указанием часового пояса-.
⚙️ Как формируется и проверяется подпись?
Формирование и проверка подписи опираются на государственные стандарты и инфраструктуру:
Технология и стандарты: используется инфраструктура открытых ключей (PKI), а криптографические алгоритмы строго регламентированы (например, ГОСТ Р 34.10-2012).
Юридическая сила: КЭП приравнивается к собственноручной подписи с печатью, а данные, подписанные ею, служат юридически значимыми доказательствами при проверках.
Порядок проверки: ПТО УОНВОС, получив запрос, по номеру serial находит в государственной системе публичный ключ отправителя и проверяет цифровую подпись signature. Если данные были изменены даже на один байт, проверка не будет пройдена.
Кто выдает: сертификат для такой подписи должен быть получен в аккредитованном Минцифры России удостоверяющем центре-.
Пример в документе: В Примере I показан корректный заголовок запроса от АСИ, где присутствуют поля onv и signature-.
🚨 Контроль и обработка ошибок
Для контроля подписи в формате предусмотрена специальная система:
Обязательная проверка: ПТО УОНВОС проверяет каждую подпись. При её отсутствии или неверности возвращается ответ с кодом 403 Forbidden.
Код ошибки BadDS: это служебный маркер в JSON-ответе системы (см. Пример II), который однозначно сигнализирует о проблемах с электронной подписью-10.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.