Отправка данных на устройство
Downlink — это данные от сервера к устройству: команда, новая настройка, ответ на запрос. Отправка асинхронная: сервер принимает кадр в очередь, сразу отвечает идентификатором dataId и передаёт кадр, когда у устройства открыто окно приёма. О том, что стало с кадром дальше, сервер уведомляет отдельными сообщениями.
Когда устройство может принять кадр
| Класс | Когда принимает | Когда уйдёт кадр |
|---|---|---|
| A | Только в двух коротких окнах (RX1, RX2) сразу после своего uplink | После очередного uplink устройства — через минуты или часы |
| C | Приёмник включён постоянно | Сразу после постановки в очередь |
| B | — | Сервер класс B пока не поддерживает |
Подробнее о классах — в разделе Классы устройств. Класс конкретного устройства возвращает dev_lw_class_req.
Порядок команд
- Подпишитесь на данные и статусы кадров:
consume_reqс"downlink_status": true. Флаг учитывается только при оформлении подписки: если соединение уже подписано без него, сначала отпишитесь командойunconsume_req. - Проверьте, поместятся ли данные:
max_dl_data_req. - Поставьте кадр в очередь:
downlink_data_req. СохранитеdataIdиз ответа: по нему узнают статус кадра. - Дождитесь сообщения
downlink_statusс итоговым статусом. Если сообщение не пришло, запросите статус командойdownlink_ack_req. - Если кадры ещё не ушли, а отправлять их уже не нужно, отзовите все запланированные кадры устройства:
cancel_downlink_reqсdevEuiи"allScheduled": true. Отозвать один кадр поdataIdиз шага 3 нельзя.
Устройство класса A — кадр ждёт в очереди до очередного uplink:
Устройство класса C — сервер передаёт кадр сразу, не дожидаясь uplink:
Кадр устройству класса C уходит через шлюз, который лучше всех принял последний uplink устройства. Пока устройство после подключения к сети не прислало ни одного uplink, сервер не знает, через какой шлюз передавать, и кадр остаётся в очереди.
Статус кадра
Статус кадра виден в трёх местах:
- в сообщении
downlink_status, которое сервер присылает сам, если подписка оформлена с"downlink_status": true; - в ответе
downlink_ack_req— по запросу; - в истории
get_downlink_data_req— за период.
| Код | Название | Что значит | Итоговый |
|---|---|---|---|
| 0 | Scheduled | Кадр в очереди, ждёт окна приёма | нет |
| 4 | Realtime Scheduled | Кадр с realTime ждёт ближайшего окна | нет |
| 1 | Sent | Кадр передан шлюзу, сервер ждёт подтверждения передачи | нет |
| 14 | DC Limit | Исчерпан бюджет эфирного времени шлюза; кадр остался в очереди и уйдёт позже | нет |
| 3 | Delivered | Шлюз излучил кадр. Это подтверждение от шлюза, а не от устройства | да |
| 2 | Late | Шлюз отклонил кадр: слишком поздно для окна приёма | да |
| 9 | Too Early | Шлюз отклонил кадр: слишком рано для передачи | да |
| 10 | Collision | Шлюз отклонил кадр: на это время уже запланирована другая передача | да |
| 11 | TX Freq Rejected | Шлюз не поддерживает частоту передачи | да |
| 12 | TX Power Rejected | Шлюз не поддерживает мощность передачи | да |
| 13 | GPS Unlocked | Шлюз без GPS-синхронизации не может передать в назначенное время | да |
| 7 | TX_ACK Timeout | Шлюз не подтвердил передачу за 10 секунд | да |
| 5 | Realtime Late | Кадр с realTime не успел в окно за 2 секунды и отброшен | да |
| 8 | Expired | Истёк ttl (по умолчанию 1 час) — кадр отброшен | да |
| 6 | Canceled | Кадр отозван командой cancel_downlink_req или downlink_purge_req | да |
Сообщение downlink_status
Сервер присылает его при каждой смене статуса, кроме постановки в очередь (0 и 4) и отзыва (6).
- Статусы приходят в приложение, которому принадлежит устройство, — по кадрам, отправленным любым способом, не только через WebSocket API.
- Очередь статусов одна на приложение. Если подписано несколько соединений одного приложения, каждое сообщение получит только одно из них — так же, как сообщения
realtime_data. - Неполученные сообщения сервер хранит 5 минут. Если соединения не было дольше, запросите статус командой
downlink_ack_req. - В текущей версии сервера подписка на статусы не снимается при отписке и закрытии соединения, поэтому после переподключения часть сообщений
downlink_statusможет не дойти. Итоговый статус важных кадров проверяйте командойdownlink_ack_req.
| Поле | Тип | Описание |
|---|---|---|
cmd | string | downlink_status |
devEui, devAddr | string | Устройство |
dataId | uint32 | Идентификатор кадра из downlink_data_resp |
downlink_status | uint8 | Код статуса, см. таблицу выше |
downlink_status_text | string | Название статуса |
downlink_status_time | string | Когда статус установлен, UTC, ISO 8601 |
emit_ts | string | Когда сервер отправил сообщение, UTC, ISO 8601. Помогает упорядочить сообщения, если они пришли не по порядку |
{
"cmd": "downlink_status",
"devEui": "6F1E570FFE14DBFC",
"devAddr": "78130AE1",
"dataId": 3046127811,
"downlink_status": 3,
"downlink_status_text": "Delivered",
"downlink_status_time": "2026-10-08T09:47:21.402113+00:00",
"emit_ts": "2026-10-08T09:47:21.415870+00:00"
}
Если кадр не дошёл
| Статус | Что сделать |
|---|---|
| 8 Expired | Устройство не выходило на связь, пока кадр ждал. Увеличьте ttl до интервала, с которым устройство присылает uplink, с запасом |
| 5 Realtime Late | Окно приёма не открылось за 2 секунды. Для отложенной отправки не ставьте realTime |
| 2 Late, 9 Too Early, 10 Collision | Шлюз не смог передать в назначенное время. Отправьте кадр повторно |
| 11 TX Freq Rejected | Частота передачи не подходит шлюзу. Уберите freq из запроса или проверьте частотный план устройства |
| 12 TX Power Rejected | Мощность передачи не подходит шлюзу. Проверьте частотный план устройства и настройки шлюза |
| 13 GPS Unlocked | Проверьте GPS-антенну и синхронизацию шлюза |
| 7 TX_ACK Timeout | Проверьте связь шлюза с сервером |
| 14 DC Limit | Ничего делать не нужно: кадр остался в очереди и уйдёт позже |
Устройство приём кадра не подтверждает: сервер отправляет кадры неподтверждаемыми (Unconfirmed Data Down). Убедиться, что устройство выполнило команду, можно только по его ответу в uplink.
Команды группы
| Команда | Зачем |
|---|---|
dev_lw_class_req | Узнать класс устройства — от него зависит, когда уйдёт кадр |
max_dl_data_req | Узнать, сколько байт поместится в кадр |
downlink_data_req | Поставить кадр в очередь |
downlink_ack_req | Узнать статус кадра по запросу |
cancel_downlink_req | Отозвать запланированные кадры устройства, которые ещё не ушли |
downlink_purge_req | Очистить очередь устройства: отменить кадры в статусе 0 (токен высокого уровня) |