Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex IoT Core
    • Все руководства
    • Работа с Yandex IoT Core с устройства с Android на языке Java
    • Работа с Yandex IoT Core на языке C#
    • Работа с Yandex IoT Core на языке Java
    • Запись данных с устройства в базу данных
    • Мониторинг состояния географически распределенных устройств
    • Мониторинг показаний датчиков и уведомления о событиях
    • Тестирование доставки сообщения
    • Эмуляция множества IoT-устройств
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Вопросы и ответы

В этой статье:

  • Перед началом работы
  • Отправьте сообщение с отладочными параметрами
  • Используйте два клиента для работы с одним топиком
  • Подпишите реестр на перманентный топик устройства
  • Отправьте сообщение на перманентный топик устройства
  • Проверьте, что реестр получил сообщение от устройства
  1. Практические руководства
  2. Тестирование доставки сообщения

Тестирование доставки сообщения

Статья создана
Yandex Cloud
Улучшена
mmerihsesh
Обновлена 21 апреля 2025 г.
  • Перед началом работы
  • Отправьте сообщение с отладочными параметрами
  • Используйте два клиента для работы с одним топиком
    • Подпишите реестр на перманентный топик устройства
    • Отправьте сообщение на перманентный топик устройства
    • Проверьте, что реестр получил сообщение от устройства

При отправке сообщения полезно убедиться, что оно было доставлено. Сообщение может не достигнуть MQTT-сервера, например, если отправлять сообщение:

  • В несуществующий топик устройства.
  • С клиента, для которого запрещена запись в указанный топик.
  • С клиента, который не прошел аутентификацию в системе.

Структура сети интернета вещей устроена так, что MQTT-клиенты подключаются к MQTT-серверу. Он принимает отправленные сообщения от издателей и пересылает их подписчикам. В MQTT не поддерживаются уведомления о том, что подписчики получили сообщение. Можно получить только подтверждение о доставке сообщения на MQTT-сервер.

Чтобы убедиться, что отправленное сообщение дошло до MQTT-сервера, в команде отправки сообщения укажите дополнительные отладочные параметры. В результате вы получите подробный вывод команды.

Чтобы протестировать работу сервиса Yandex IoT Core, одновременно используйте отправку сообщений и подписку на устройство. Если подписать реестр на топик устройства и отправить сообщение в этот топик, реестр получит сообщение.

Ниже рассмотрен пример, в котором устройство с датчиком интенсивности света отправляет значение освещенности 150 в перманентный топик устройства. Аутентификация клиентов проходит по X.509-сертификатам. В качестве инструментов для отправки сообщений и подписки на устройство используются CLI и Mosquitto — MQTT-брокер сообщений с открытым исходным кодом.

Перед началом работы

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

    По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

  2. Создайте сертификаты для реестра и устройства.

  3. Создайте реестр.

  4. Добавьте сертификат реестру.

  5. Создайте устройство.

  6. Добавьте сертификат устройству.

  7. (Опционально) Скачайте и установите Mosquitto, если хотите использовать его вместо CLI для отправки сообщений и подписки на устройство.

    Для подключения к MQTT-серверу через Mosquitto используйте параметры:

    • Сертификат удостоверяющего центра.
    • Адрес сервера: mqtt.cloud.yandex.net.
    • Порт сервера: 8883.
    • Протокол: TLSv1.2.

Отправьте сообщение с отладочными параметрами

При отправке сообщений добавьте в команду флаги:

  • --qos 1 для CLI или -q 1 для Mosquitto — уровень качества обслуживания (QoS) QoS 1: At least once. Сообщение будет гарантированно доставлено хотя бы один раз.

    С таким уровнем качества обслуживания MQTT-сервер отправляет издателю пакет PUBACK. Так сервер подтверждает, что получил сообщение от издателя.

  • --debug для CLI и Mosquitto — отладка команды. Выводит журнал отладки при выполнении команды и помогает не только диагностировать проблему, но и узнать о получении пакета PUBACK.

Пример отправки сообщения:

CLI
Mosquitto
yc iot mqtt publish \
   --cert sensor-cert.pem \
   --key sensor-key.pem \
   --topic '$devices/b91qprkvbks9********/state' \
   --message '150' \
   --qos 1 \
   --debug

Где:

  • --cert — путь к публичной части сертификата устройства с датчиком.
  • --key — путь к приватной части сертификата устройства с датчиком.
  • --topic — перманентный топик устройства с датчиком.
  • --message — текст сообщения.
  • --qos — уровень качества обслуживания.
  • --debug — вывод журнала отладки.
mosquitto_pub -h mqtt.cloud.yandex.net \
   -p 8883 \
   --cafile rootCA.crt \
   --cert sensor-cert.pem \
   --key sensor-key.pem \
   -t '$devices/b91qprkvbks9********/state' \
   -m '150' \
   -q 1 \
   --debug

Где:

  • -h — адрес MQTT-сервера.
  • -p — порт MQTT-сервера.
  • --cafile — путь к сертификату удостоверяющего центра.
  • --cert — путь к публичной части сертификата устройства с датчиком.
  • --key — путь к приватной части сертификата устройства с датчиком.
  • -t — перманентный топик устройства с датчиком.
  • -m — текст сообщения.
  • -q — уровень качества обслуживания.
  • --debug — вывод журнала отладки.

Пример результата:

CLI
Mosquitto
...
15:02:27.030752   [client]  enter Publish
15:02:27.030797   [client]  sending publish message, topic:$devices/b91qprkvbks9********/state
15:02:27.030923   [net]     obound wrote msg, id:1
15:02:27.030947   [net]     outgoing waiting for an outbound message
15:02:27.261271   [net]     Received Message
15:02:27.261530   [net]     logic got msg on ibound
15:02:27.261587   [store]   memorystore del: message1was deleted
15:02:27.261624   [net]     received puback, id:1
15:02:27.261674   [net]     logic waiting for msg on ibound
15:02:27.261719   [client]  disconnecting
...
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q1, r0, m1, '$devices/b91qprkvbks9********/state', ... (6 bytes))
Client null received PUBACK (Mid: 1, RC:0)
Client null sending DISCONNECT

Такой результат показывает, что клиенту пришел пакет PUBACK. Это является подтверждением от MQTT-сервера, что он получил сообщение.

Используйте два клиента для работы с одним топиком

Чтобы убедиться, что отправленное сообщение было доставлено, подпишите реестр на топик устройства. MQTT-сервер получает сообщения из топиков и отправляет их подписчикам. Поэтому, если подписчик получил сообщение, MQTT-сервер также его получил.

Чтобы использовать два клиента для работы с одним топиком:

  1. Подпишите реестр на перманентный топик устройства.
  2. Отправьте сообщение на перманентный топик устройства.
  3. Проверьте, что реестр получил сообщение от устройства.

Подпишите реестр на перманентный топик устройства

Выполните команду:

CLI
Mosquitto
yc iot mqtt subscribe \
   --cert registry-cert.pem \
   --key registry-key.pem \
   --topic '$devices/b91qprkvbks9********/state' \
   --qos 1 \
   --debug

Где:

  • --cert — путь к публичной части сертификата реестра.
  • --key — путь к приватной части сертификата реестра.
  • --topic — перманентный топик устройства с датчиком.
  • --qos — уровень качества обслуживания.
  • --debug — вывод журнала отладки.
mosquitto_sub -h mqtt.cloud.yandex.net \
   -p 8883 \
   --cafile rootCA.crt \
   --cert registry-cert.pem \
   --key registry-key.pem \
   -t '$devices/b91qprkvbks9********/state' \
   -q 1 \
   --debug

Где:

  • -h — адрес MQTT-сервера.
  • -p — порт MQTT-сервера.
  • --cafile — путь к сертификату удостоверяющего центра.
  • --cert — путь к публичной части сертификата реестра.
  • --key — путь к приватной части сертификата реестра.
  • -t — перманентный топик устройства с датчиком.
  • -q — уровень качества обслуживания.
  • --debug — вывод журнала отладки.

Пример результата:

CLI
Mosquitto
...
15:46:20.619042   [client]  enter Subscribe
15:46:20.619133   [client]  SUBSCRIBE: dup: false qos: 1 retain: false rLength: 0 MessageID: 0 topics: [$devices/b91qprkvbks9********/state]
15:46:20.619170   [client]  exit Subscribe
15:46:20.619214   [net]     obound priority msg to write, type*packets.SubscribePacket
15:46:20.619385   [net]     outgoing waiting for an outbound message
15:46:20.699795   [net]     Received Message
15:46:20.699959   [net]     logic got msg on ibound
15:46:20.700002   [store]   memorystore del: message1not found
15:46:20.700027   [net]     received suback, id:1
15:46:20.700055   [net]     granted qoss[128]
15:46:20.700092   [net]     logic waiting for msg on ibound
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending SUBSCRIBE (Mid: 1, Topic: $devices/b91qprkvbks9********/state, QoS: 1, Options: 0x00)
Client null received SUBACK
Subscribed (mid: 1): 1

Такой результат показывает, что клиент получил пакет SUBACK. Это является подтверждением от MQTT-сервера, что подписка прошла успешно.

После вывода результата команда не завершается. MQTT-клиент периодически пингует топик и ожидает сообщение:

CLI
Mosquitto
15:47:45.554570   [pinger]  ping check5
15:47:50.554346   [pinger]  ping check10
15:47:55.554149   [pinger]  ping check15
Client null sending PINGREQ
Client null received PINGRESP

Отправьте сообщение на перманентный топик устройства

Откройте новое окно терминала и выполните команду:

CLI
Mosquitto
yc iot mqtt publish \
   --cert sensor-cert.pem \
   --key sensor-key.pem \
   --topic '$devices/b91qprkvbks9********/state' \
   --message '150' \
   --qos 1 \
   --debug

Где:

  • --cert — путь к публичной части сертификата устройства с датчиком.
  • --key — путь к приватной части сертификата устройства с датчиком.
  • --topic — перманентный топик устройства с датчиком.
  • --message — текст сообщения.
  • --qos — уровень качества обслуживания.
  • --debug — вывод журнала отладки.
mosquitto_pub -h mqtt.cloud.yandex.net \
   -p 8883 \
   --cafile rootCA.crt \
   --cert sensor-cert.pem \
   --key sensor-key.pem \
   -t '$devices/b91qprkvbks9********/state' \
   -m '150' \
   -q 1 \
   --debug

Где:

  • -h — адрес MQTT-сервера.
  • -p — порт MQTT-сервера.
  • --cafile — путь к сертификату удостоверяющего центра.
  • --cert — путь к публичной части сертификата устройства с датчиком.
  • --key — путь к приватной части сертификата устройства с датчиком.
  • -t — перманентный топик устройства с датчиком.
  • -m — текст сообщения.
  • -q — уровень качества обслуживания.
  • --debug — вывод журнала отладки.

Пример результата:

CLI
Mosquitto
...
15:02:27.030752   [client]  enter Publish
15:02:27.030797   [client]  sending publish message, topic:$devices/b91qprkvbks9********/state
15:02:27.030923   [net]     obound wrote msg, id:1
15:02:27.030947   [net]     outgoing waiting for an outbound message
15:02:27.261271   [net]     Received Message
15:02:27.261530   [net]     logic got msg on ibound
15:02:27.261587   [store]   memorystore del: message1was deleted
15:02:27.261624   [net]     received puback, id:1
15:02:27.261674   [net]     logic waiting for msg on ibound
15:02:27.261719   [client]  disconnecting
...
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q1, r0, m1, '$devices/b91qprkvbks9********/state', ... (3 bytes))
Client null received PUBACK (Mid: 1, RC:0)
Client null sending DISCONNECT

Проверьте, что реестр получил сообщение от устройства

Если сообщение доставлено, команда подписки на устройство выдает результат. Пример:

CLI
Mosquitto
17:23:26.346405   [net]     Received Message
17:23:26.346493   [net]     logic got msg on ibound
17:23:26.346518   [net]     received publish, msgId:4
17:23:26.346530   [net]     putting msg on onPubChan
17:23:26.346580   [net]     done putting msg on incomingPubChan
17:23:26.346590   [net]     logic waiting for msg on ibound
17:23:26.346591   [net]     putting puback msg on obound
17:23:26.346632   [store]   memorystore del: message4was deleted
17:23:26.346646   [net]     done putting puback msg on obound
150
17:23:26.346656   [net]     obound priority msg to write, type*packets.PubackPacket
17:23:26.346761   [net]     outgoing waiting for an outbound message
Client null received PUBLISH (d0, q1, r0, m3, '$devices/b91qprkvbks9********/state', ... (3 bytes))
Client null sending PUBACK (m3, rc0)
150

Результат содержит число 150 — сообщение, которое было отправлено.

Была ли статья полезна?

Предыдущая
Мониторинг показаний датчиков и уведомления о событиях
Следующая
Эмуляция множества IoT-устройств
Проект Яндекса
© 2025 ООО «Яндекс.Облако»