Downlink — отозвать данные из очереди
Отзывает кадр downlink, который стоит в очереди и ещё не ушёл на устройство. Устройство класса A получает downlink только в ответ на свой следующий uplink, поэтому кадр может ждать в очереди часами — всё это время его можно отозвать.
Команды нет в описании v0.17: она добавлена в сервер в августе 2026.
Отзыв работает в двух режимах:
- Один кадр — по
dataId, идентификатору элемента очереди на сервере. Это не тотdataId, который возвращаетdownlink_data_resp: тот служит дляdownlink_ack_req. Идентификатор элемента очереди сервер возвращает только в ответе на отзыв всей очереди (data_ids): команды постановки в очередь и истории его не возвращают. - Вся очередь устройства — по
devEuiс"allScheduled": true: отзываются все запланированные кадры устройства. Без флагаallScheduledзапрос отклоняется: в очереди могут быть кадры, поставленные другими клиентами.
Отзываются только кадры в статусе 0 (Scheduled) или 4 (Realtime Scheduled) — те, что ещё не переданы шлюзу. Отозванный кадр не удаляется: в истории (get_downlink_data_req) он остаётся со статусом 6 (Canceled) — см. статусы кадра. Сервер ищет элемент очереди за последний месяц.
Запрос и ответ: cancel_downlink_req → cancel_downlink_resp.
Доступ: токен любого уровня; отзываются только кадры устройств приложения, к которому выполнено подключение.
Запрос
Поля без пометки «обязательно» можно не передавать.
| Поле | Тип | Описание |
|---|---|---|
cmd | string | cancel_downlink_req |
operation_id | string | Произвольная строка; сервер вернёт её в ответе — по ней сопоставляют запрос и ответ |
dataId | uint64 | Обязательно dataId или devEui. Идентификатор элемента очереди — чтобы отозвать один кадр |
devEui | string | Обязательно dataId или devEui. DevEUI устройства — чтобы отозвать всю его очередь; требует allScheduled |
allScheduled | bool | Вместе с devEui. true — отозвать все запланированные кадры устройства. По умолчанию false |
{
"cmd": "cancel_downlink_req",
"operation_id": "abc",
"devEui": "6F1E570FFE14DBFC",
"allScheduled": true
}
Ответ
| Поле | Тип | Описание |
|---|---|---|
cmd | string | cancel_downlink_resp |
operation_id | string | Значение из запроса |
status | uint8 | 1 — кадр отозван, 2 — не отозван |
cancelStatus | string | Итог отзыва, см. таблицу ниже |
reason | string | Причина текстом |
data_id | uint64 | Элемент очереди — при отзыве одного кадра |
dev_eui | string | Устройство |
dev_addr, fport, data, mtype | string, uint8, string, uint8 | Параметры отозванного кадра — только при cancelStatus = canceled и отзыве одного кадра |
count | uint32 | Сколько кадров отозвано |
data_ids | array | Отозванные элементы очереди — при отзыве всей очереди |
Поля без значения в ответ не включаются.
cancelStatus | status | Значение |
|---|---|---|
canceled | 1 | Кадр отозван; при отзыве всей очереди — все запланированные кадры (count, data_ids) |
already_canceled | 2 | Кадр уже был отозван; повторять запрос безопасно |
too_late | 2 | Кадр уже передан шлюзу или получил итоговый статус, либо сервер забрал его на передачу в момент запроса |
not_found | 2 | Элемента очереди нет или он принадлежит другому приложению |
not_downlink | 2 | Элемент с этим идентификатором — не downlink |
error | 2 | Не указаны ни dataId, ни devEui; отзыв всей очереди без "allScheduled": true; внутренняя ошибка сервера |
Примеры ответа
Отозвана вся очередь устройства:
{
"cmd": "cancel_downlink_resp",
"operation_id": "abc",
"status": 1,
"cancelStatus": "canceled",
"reason": "Cancelled every scheduled downlink of the device",
"dev_eui": "6F1E570FFE14DBFC",
"count": 2,
"data_ids": [ 48211, 48212 ]
}
Кадр уже передан шлюзу (статус 1, Sent):
{
"cmd": "cancel_downlink_resp",
"operation_id": "xyz",
"status": 2,
"cancelStatus": "too_late",
"reason": "Already Sent",
"data_id": 48213,
"dev_eui": "6F1E570FFE14DBFC"
}
См. также
- Отправка данных на устройство — сценарий целиком и статусы кадра.
downlink_purge_req— отменить ожидающие кадры с токеном высокого уровня.