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

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

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

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

Статья создана
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 ООО «Яндекс.Облако»