Сообщения передают события, происходящие в системе, на сервер. Сервер подтверждает получение сообщений. В настоящее время подтверждение по LoRa не реализовано, сообщение считается отправленным, если получен confirm на uplink с данными.
При отсутствии подтверждения события копятся в буфере и попытки отправки повторяются периодически. События из буфера отправляются, начиная со старейшего. Если буфер переполняется, новые события вытесняют старые. События имеют циклический порядковый номер (параметр SEQ uint16_t), что позволяет обнаруживать потерю событий.
Размер буфера зависит от версии программы (и транспорта).
Сообщение может передаваться:
- CAS360, CAS1/2: через LoRa инфраструктуру
- CAS360, CAS1/2: по IP-сети (WiFi, LAN) на заданный в конфигурации CoAP-сервер.
- C
AS360: по IP-сети (LTE) на заданные в конфигурации HTTPS-сервер и его контекст. Upload бинарных данных.Метод POST, ресурс <в настройках CAS360>, Content-Type: application/cbor
Сообщение в HTTP body
Подтверждение получения – HTTP response 2xx
Отправка через LoRa
На LoRa порт 11
Заголовок пакета такой же, как для сенсоров, далее сообщение (вместо блока сенсоров), см. Описание форматов пакетов
Подтверждение получения – не реализовано, подтверждением считается confirmation пакета с базы LoRa
Отправка через IP
По IP-сети (LTE, WiFi, LAN) на заданный в конфигурации CoAP-сервер.
Метод POST, ресурс /msg
Пример запроса: POST /msg
Content-Format:application/cbor
Сообщение в payload
Подтверждение получения – CoAP Response 2.xx
Структура сообщения
Структура сообщения – последовательность CBOR-элементов (CBOR-stream, rfc7049 section 3.1):
VERSION(int=-1), HEADER, EVENT, EVENT, ...
VERSION иденифицирует дальнейшую структуру, должен быть integer и равен -1. Иначе формат сообщения считать неизвестным.
HEADER идентифицирует отправляющую систему CAS360 и несет общие параметры, EVENT несет информацию об одном событии.
Каждый HEADER и EVENT – CBOR map, то есть, набор полей key:value (key это int).
Могут приходить сообщения без EVENT, это keepalive – используются для проверки связи при отсутствии полезных данных.
События могут приходить повторно, если устройство не получило подтверждение получения из-за плохой связи.
Идентификаторы полей (key) обычно выбираем в диапазоне -24..23, чтобы занимали 1 байт в CBOR.
Элемент VERSION
Тип integer, значение определяет дальнейшее содержимое. Для нижеописанной структуры значение =-1. Чтобы отличать от сенсоров в случае чего.
Поля HEADER
Множественные Key это альтернативы, придет какой-то один.
| Name | Key | Value Type | Description |
|---|---|---|---|
CASID SERIAL | 1 2 | uint32 uint32 | Unique (hopefully) identifier of sending CAS360 system, generated automatically (linked to tablet PC hardware) Looks like arbitrary number Serial number of sending CAS1 reader |
| UPTIME | 3 | uint32 | optional Device Uptime at pack sending, seconds |
Поля EVENT
| Name | Key | Value Type | Description |
|---|---|---|---|
UPTIME TIME | -4 -3 | uint32 uint32 | Device Uptime of Event, seconds Время события, секунды с UNIX epoch, UTC+0 |
| SEQ | -2 | uint16 | Циклический сквозной порядковый номер события, для обнаружения потерь |
| KIND | -1 | int | Род события: 0-SYS, 1-CAS, ... |
| EVENT | 0 | int | Событие |
| ... | дополнительные поля, специфичные для каждого события EVENT |
События SYS (KIND=0)
EVENT | Value | Description |
|---|---|---|
| Test | -123 | test event (CLI: msgtest N) |
| Reset | 0 |
Дополнительные поля события Test
Name | Key | Value Type | Description |
|---|---|---|---|
TESTCNT | -456 | uint | Счетчик тестовых событий |
События CAS (KIND=1)
EVENT | Value | Description |
|---|---|---|
| ZoneRed | 0 | Вход в Красную зону |
| ZoneYellow | 1 | Вход в Желтую зону |
| ZoneGreen | 2 | Вход в Зеленую зону |
| ZoneOut | 3 | Выход (пропадание метки из эфира) |
| ZonePark | 4 | Парковка метки (прекращение обнаружения) |
| ZoneUndef | 5 | Зона не определилась |
Дополнительные поля событий CAS. Множественные Key это альтернативы, придет какой-то один.
Name | Key | Value Type | Description |
|---|---|---|---|
EUI SERIAL CASID | 1 2 3 4 | uint64 uint32 uint32 <TBD> | Идентификатор метки. EUI64 (для меток не-ULUN) серийный номер (для меток ULUN, пересчитывать в EUI64) CAS_ID для систем CAS360 (при сближении с другой системой CAS360) reserved Основным идентификатором меток (по IEEE 802.12.4) является EUI64. В метках ULUN EUI64 однозначно связан с серийным номером. CAS_ID не связан с серийными номерами меток и анкеров; используется, потому что система CAS360 в целом не имеет одного меточного серийного номера. |
| DIST_CM | 5 | int16 | Дистанция до метки, см |
| BEARER | 6 | int (enum) | Носитель метки: 0-Generic, 1-Person, 2-Vehicle, 3-Stationary Опционально, при отсутствии =Generic |
SECTOR_DEG SECTOR_256 | 7 8 | array_uint16[2] array_uint8[2] | Сектор [ dir angle ], градусы Сектор [ dir angle ], в 1/256 круга (1.40625 градуса) dir - центральное направление сектора, angle - размах сектора Отсчет вправо от направления вперед транспортного средства (на экране CAS360 по часовой стрелке от направления вверх) Опционально, при отсутствии – сектор не определен (полный круг) |
15 Comments
Eugenia Kalnina
Jul 08, 2024Нет описания способа получения этих данных по разным каналам. Предварительная договоренность была про бинарник, передаваемый по HTTP с типоп application/cbor. Это актуально?
Dmitry Matytsin
Jul 08, 2024Да, вот описание же есть:
"по IP-сети (LTE) на заданные в конфигурации HTTPS-сервер и его контекст. Upload бинарных данных с типом Content-Type: application/cbor"
Eugenia Kalnina
Jul 08, 2024ага, пропустила.
Oleg Tabarovsky
Jun 01, 2026Evgeniy Emelyanov Нужно описать требования к серверу: 1) какие методы поддерживаются ? 2) какие endpoints ? 3) коды возврата 4) нужна ли поддержка блочного режима ?
Evgeniy Emelyanov
Jun 01, 2026Я так понимаю, требования к CoAP серверу?
А, ну еще лора есть, для нее, наверное, отдельный endpoint нужен
И еще LTE, тут не знаю, тот же LANовский будет работать, или отдельный.
Конкретно для мессенджера запрос-ответ я подробнее позже опишу, когда сделаю его.
Eugenia Kalnina
Jun 01, 2026Evgeniy Emelyanov
Jun 01, 2026Eugenia Kalnina
Jun 01, 2026в описание потом только добавь, пожалуйста, ресурс по умолчанию, чтобы по комментариям не шариться
Eugenia Kalnina
Jun 16, 2026Если формат не COAP_MEDIATYPE_APPLICATION_CBOR будет BadRequest (400) возвращаться
Evgeniy Emelyanov
Jun 16, 2026Хорошо
Oleg Tabarovsky
Jul 16, 2026Evgeniy Emelyanov как Uptime может быть идентификатором системы ? Если он меняется каждый раз.
Evgeniy Emelyanov
Jul 16, 2026Он и не является. HEADER::UPTIME это часть заголовка, но не идентификатор. Это опорное значение для пересчета Uptime в событиях в этом сообщении в реальное время.
Oleg Tabarovsky
Jul 16, 2026Тогда как понимать фразу перед табличкой в разделе HEADER - Множественные Key это альтернативы, придет какой-то один ?
Evgeniy Emelyanov
Jul 16, 2026Множественные это которые в одной клеточке несколько
Oleg Tabarovsky
Jul 16, 2026Увидеть бы там еще границы этих клеточек. Я бы явно написал что casid или serial