[Документация Yandex Cloud](../../index.md) > [Практические руководства](../index.md) > [Бессерверные технологии](index.md) > Интернет вещей (IoT) > Тестирование доставки сообщения

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

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

{% note warning %}

Сервис Yandex IoT Core больше не доступен для новых пользователей. 

Текущие пользователи могут создавать ресурсы до 1 ноября 2026 года. После сервис перейдет в режим read-only, а 1 декабря 2026 года — прекратит работу. Подробнее о сроках и порядке закрытия читайте на странице [Закрытие сервиса](../../iot-core/sunset.md).

{% endnote %}

При отправке сообщения полезно убедиться, что оно было доставлено. Сообщение может не достигнуть MQTT-сервера, например, если [отправлять сообщение](../../iot-core/operations/publish.md):

* В несуществующий [топик устройства](../../iot-core/concepts/topic/devices-topic.md).
* С клиента, для которого запрещена запись в указанный топик.
* С клиента, который не прошел [аутентификацию в системе](../../iot-core/concepts/authorization.md).

[Структура сети интернета вещей](../../glossary/mqtt-server.md#iot-net) устроена так, что MQTT-клиенты подключаются к [MQTT-серверу](../../glossary/mqtt-server.md). Он принимает отправленные сообщения от издателей и пересылает их подписчикам. В MQTT не поддерживаются уведомления о том, что подписчики получили сообщение. Можно получить только подтверждение о доставке сообщения на MQTT-сервер.

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

Чтобы протестировать работу сервиса Yandex IoT Core, одновременно используйте [отправку сообщений и подписку на устройство](#several-clients). Если подписать [реестр](../../iot-core/concepts/index.md#registry) на топик устройства и отправить сообщение в этот топик, реестр получит сообщение.

Ниже рассмотрен пример, в котором устройство с датчиком интенсивности света отправляет значение освещенности `150` в [перманентный топик устройства](../../iot-core/concepts/topic/devices-topic.md). Аутентификация клиентов проходит по X.509-сертификатам. В качестве инструментов для отправки сообщений и подписки на устройство используются CLI и [Mosquitto](https://mosquitto.org) — MQTT-брокер сообщений с открытым исходным кодом.

## Перед началом работы {#before-you-begin}

1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

   По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

1. [Создайте сертификаты для реестра и устройства](../../iot-core/operations/certificates/create-certificates.md).
1. [Создайте реестр](../../iot-core/operations/registry/registry-create.md).
1. [Добавьте сертификат реестру](../../iot-core/operations/certificates/registry-certificates.md#add-cert).
1. [Создайте устройство](../../iot-core/operations/device/device-create.md).
1. [Добавьте сертификат устройству](../../iot-core/operations/certificates/device-certificates.md#add-cert).
1. (Опционально) [Скачайте и установите Mosquitto](https://mosquitto.org/download/), если хотите использовать его вместо CLI для отправки сообщений и подписки на устройство.

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

   * [Сертификат удостоверяющего центра](https://storage.yandexcloud.net/mqtt/rootCA.crt).
   * **Адрес сервера**: `mqtt.cloud.yandex.net`.
   * **Порт сервера**: `8883`.
   * **Протокол**: `TLSv1.2`.

## Отправьте сообщение с отладочными параметрами {#debugging-parameters}

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

* `--qos 1` для CLI или `-q 1` для Mosquitto — [уровень качества обслуживания](../../iot-core/concepts/index.md#qos) (QoS) `QoS 1: At least once`. Сообщение будет гарантированно доставлено хотя бы один раз.

   С таким уровнем качества обслуживания MQTT-сервер отправляет издателю [пакет PUBACK](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901022). Так сервер подтверждает, что получил сообщение от издателя.

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

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```bash
   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 {#mosquitto}

   ```bash
   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` — вывод журнала отладки.

{% endlist %}

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```text
   ...
   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
   ...
   ```

- Mosquitto {#mosquitto}

   ```text
   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
   ```

{% endlist %}

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

## Используйте два клиента для работы с одним топиком {#several-clients}

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

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

1. [Подпишите реестр на перманентный топик устройства](#subscribe).
1. [Отправьте сообщение на перманентный топик устройства](#publish).
1. [Проверьте, что реестр получил сообщение от устройства](#check).

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

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```bash
   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 {#mosquitto}

   ```bash
   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` — вывод журнала отладки.

{% endlist %}

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```text
   ...
   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
   ```

- Mosquitto {#mosquitto}

   ```text
   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
   ```

{% endlist %}

Такой результат показывает, что клиент получил [пакет SUBACK](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901022). Это является подтверждением от MQTT-сервера, что подписка прошла успешно.

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```text
   15:47:45.554570   [pinger]  ping check5
   15:47:50.554346   [pinger]  ping check10
   15:47:55.554149   [pinger]  ping check15
   ```

- Mosquitto {#mosquitto}

   ```text
   Client null sending PINGREQ
   Client null received PINGRESP
   ```

{% endlist %}

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

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```bash
   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 {#mosquitto}

   ```bash
   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` — вывод журнала отладки.

{% endlist %}

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```text
   ...
   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
   ...
   ```

- Mosquitto {#mosquitto}

   ```text
   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
   ```

{% endlist %}

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

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

{% list tabs group=instructions %}

- CLI {#cli}

   ```text
   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
   ```

- Mosquitto {#mosquitto}

   ```text
   Client null received PUBLISH (d0, q1, r0, m3, '$devices/b91qprkvbks9********/state', ... (3 bytes))
   Client null sending PUBACK (m3, rc0)
   150
   ```

{% endlist %}

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