Использование топиков
Вы можете подписывать устройства и реестры на топики $<devices или registries>/<ID устройства или реестра>/events
и $<devices или registries>/<ID устройства или реестра>/commands
.
Если у вас есть устройства, на показания датчиков которых нужно оперативно реагировать, а в вашей сети возможны перебои со связью и разрыв соединения между устройствами и MQTT-брокером, подписывайте устройства и реестры на перманентные топики $<devices или registries>/<ID устройства или реестра>/state
и $<devices или registries>/<ID устройства или реестра>/config
. В перманентном топике сохраняется последнее сообщение, отправленное в этот топик, и отображается при возобновлении соединения (даже если в момент подключения в топик не пишут устройства и реестры). После возобновления соединения перманентные топики работают как обычные топики, информация в них появляется когда устройство или реестр в них пишет.
В таблице описаны действия, которые устройства и реестры совершают с топиками:
Топики | Устройство | Реестр |
---|---|---|
$devices/<ID устройства>/events $devices/<ID устройства>/state |
Отправляет телеметрические данные. | Получает телеметрические данные. Устройство известно. |
$devices/<ID устройства>/commands $devices/<ID устройства>/config |
Получает команды. | Отправляет команды определенному устройству. |
$registries/<ID реестра>/events $registries/<ID реестра>/state |
Отправляет телеметрические данные. | Получает телеметрические данные от всех устройств в реестре. Устройство неизвестно. |
$registries/<ID реестра>/commands $registries/<ID реестра>/config |
Получает команды. | Отправляет команды всем устройствам в реестре. |
$monitoring/<ID устройства>/json |
Получает данные мониторинга другого устройства в формате JSON. | Получает данные мониторинга устройства в формате JSON. |
Использование алиасов для топиков
Алиас — это псевдоним топика устройства, присвоенный пользователем. Алиасы можно присваивать стандартным топикам, которые уже есть в сервисе, а также топикам с произвольными сабтопиками.
Примечание
Для топика $monitoring/<ID устройства>/json
можно использовать только системный алиас $me
.
Алиас задается в формате ключ-значение:
<алиас>='<топик устройства>'
Алиасы можно использовать для отправки сообщений и подписки на сообщения наравне с обычными топиками устройств. Также вы можете использовать в алиасах символы подстановки при подписке на сообщения, при этом проверяется формат исходного топика, которому был присвоен алиас.
Алиас должен однозначно определять устройство, то есть топик, которому присваивается алиас, должен содержать уникальный идентификатор устройства.
Если создать алиас
my/alias/=$devices/<ID устройства>/
, то можно использовать топикmy/alias/events
. Он будет эквивалентен$devices/<ID устройства>/events
. По аналогии можно использовать и другие топики, начинающиеся с$devices/<ID устройства>/
.
В рамках одного реестра алиасы не могут совпадать с префиксами других алиасов.
Если вы создали алиас
my/alias/=...
, в этом реестре вы не сможете создать алиасыmy/=...
,my/alias/2/=...
,my/ali=...
.
Вы можете создать алиасы
my/alias1/=...
,my/alias2/=...
илиmy/ali/=...
.
Использование системных алиасов $me в $me-топиках
Чтобы каждый раз не вводить идентификатор устройства, от имени которого открыта MQTT-сессия, вы можете использовать $me-топики на основе алиасов $me
, уже созданных в сервисе.
$me-топик | Эквивалентный топик |
---|---|
$me/device/events |
$devices/<ID устройства>/events |
$me/device/commands |
$devices/<ID устройства>/commands |
$me/device/state |
$devices/<ID устройства>/state |
$me/device/config |
$devices/<ID устройства>/config |
$me/registry/commands |
$registries/<ID устройства>/commands |
$me/registry/config |
$registries/<ID устройства>/config |
$me/monitoring/json |
$monitoring/<ID устройства>/json |
При отправке сообщений и подписке на сообщения, $me-топики преобразуются в топики с <ID устройства> на уровне MQTT.
Если вы подписались на $me-топик, данные вы тоже получите в $me-топике.
Подписка на топики с использованием символов подстановки
Вы можете использовать специальные символы подстановки #
и +
, которые позволяют фильтровать подписки на топики.
Если в начале фильтра стоит $devices/
, то в фильтр попадают топики устройств, а если $registries/
, то топики реестров. В остальных случаях в фильтр попадают только алиасы.
Примечание
Подписка на алиасы перманентных топиков с использованием символов подстановки работает как подписка на обычные топики. При возобновлении подключения к MQTT-брокеру текущее состояние топика не отправляется подписанным на него реестрам или устройствам.
Если при подписке на перманентные топики с использованием символов подстановки в фильтр попадают более тысячи топиков, доставка данных по всем топикам не гарантируется.
Символ #
Означает подстановку одной или нескольких частей топика, а также пустой строки. Всегда является последним символом в фильтре.
Примеры использования символа #:
#
— подписаться на все алиасы топиков.$devices/#
— подписаться на все топики всех устройств.$devices/<ID устройства>/#
— подписаться на все топики определенного устройства.$devices/<ID устройства>/events/#
— подписаться на все топики определенного устройства с телеметрическими данными.$devices/<ID устройства>/state/#
— подписаться на все перманентные топики с телеметрическими данными устройства с указанным уникальным идентификатором.
Символ +
Означает подстановку одной части топика между символами /
либо в конце после символа /
.
Например, по подписке $registries/<ID реестра>/commands/+
устройства получат команды, отправленные в топики $registries/<ID реестра>/commands/bedroom
и $registries/<ID реестра>/commands/kitchen
, но проигнорируют команду в топик $registries/<ID реестра>/commands/bedroom/entrance
.
Примеры использования символа +:
$devices/<ID устройства>/+
— подписаться на все топики определенного устройства с телеметрическими данными и командами.$devices/<ID устройства>/events/+
— подписаться на все топики определенного устройства с телеметрическими данными из всех помещений. Предполагается, что в примере символ+
замещает помещение.$devices/+/events/bedroom/temperature
— подписаться на все топики всех устройств с телеметрическими данными о температуре в спальне.$devices/+/events/bedroom/+
— подписаться на все топики всех устройств с телеметрическими данными в спальне. Предполагается, что в примере символы+
замещают уникальный идентификатор устройства и тип датчика.
Фильтры $devices/+
и $registries/+
не работают, т.к. топик должен состоять из трех частей: $<devices или registries>/<ID>/<events или commands>
.
Совместное использование символов + и #
После +
можно использовать #
, чтобы подставить остальную часть топика или сабтопика:
-
$devices/+/#
— подписаться на все топики всех устройств. Эквивалентен фильтру$devices/#
. -
$devices/+/events/#
— подписаться на все топики всех устройств с телеметрическими данными.
При фильтрации также учитываются общие правила подписки на топики, например:
-
Подписка на фильтр
$devices/#
с сертификатом реестра эквивалентна подписке на$devices/+/events/#
.При этом будут получены и все сообщения, отправленные в
$devices/<DeviceID>/events
. -
Подписка на фильтр
$registries/#
с сертификатом устройства эквивалентна подписке на$registries/<ID реестра>/commands/#
.При этом будут получены и все сообщения, отправленные в
$registries/<ID реестра>/commands
.
Триггеры для топиков
Триггер — условие, при наступлении которого автоматически запускается определенная функция.
Триггер для Yandex IoT Core предназначен для управления сообщениями, которыми обмениваются устройства и реестры. Он создается для топиков: принимает из них копии сообщений и передает в функцию Cloud Functions или контейнер Serverless Containers для обработки. Триггер должен находиться в одном облаке с устройством или реестром, из топика которого он читает сообщения.
Вы можете создать триггер:
- Для стандартного топика, реализованного сервисом, кроме топика
$monitoring/<ID устройства>/json
. - Для топика с произвольными сабтопиками и подстановочными символами.
- Для алиаса топика.
Триггеру для Yandex IoT Core необходим сервисный аккаунт для вызова функции или контейнера.
Подробнее о триггерах читайте в документации Cloud Functions.