Тестирование доставки сообщения
При отправке сообщения полезно убедиться, что оно было доставлено. Сообщение может не достигнуть MQTT-сервера, например, если отправлять сообщение:
- В несуществующий топик устройства.
- С клиента, для которого запрещена запись в указанный топик.
- С клиента, который не прошел аутентификацию в системе.
Структура сети интернета вещей устроена так, что MQTT-клиенты подключаются к MQTT-серверу. Он принимает отправленные сообщения от издателей и пересылает их подписчикам. В MQTT не поддерживаются уведомления о том, что подписчики получили сообщение. Можно получить только подтверждение о доставке сообщения на MQTT-сервер.
Чтобы убедиться, что отправленное сообщение дошло до MQTT-сервера, в команде отправки сообщения укажите дополнительные отладочные параметры. В результате вы получите подробный вывод команды.
Чтобы протестировать работу сервиса Yandex IoT Core, одновременно используйте отправку сообщений и подписку на устройство. Если подписать реестр на топик устройства и отправить сообщение в этот топик, реестр получит сообщение.
Ниже рассмотрен пример, в котором устройство с датчиком интенсивности света отправляет значение освещенности 150
в перманентный топик устройства. Аутентификация клиентов проходит по X.509-сертификатам. В качестве инструментов для отправки сообщений и подписки на устройство используются CLI и Mosquitto
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
(Опционально) Скачайте и установите 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.
Пример отправки сообщения:
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
— вывод журнала отладки.
Пример результата:
...
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-сервер также его получил.
Чтобы использовать два клиента для работы с одним топиком:
- Подпишите реестр на перманентный топик устройства.
- Отправьте сообщение на перманентный топик устройства.
- Проверьте, что реестр получил сообщение от устройства.
Подпишите реестр на перманентный топик устройства
Выполните команду:
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
— вывод журнала отладки.
Пример результата:
...
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-клиент периодически пингует топик и ожидает сообщение:
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
Отправьте сообщение на перманентный топик устройства
Откройте новое окно терминала и выполните команду:
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
— вывод журнала отладки.
Пример результата:
...
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
Проверьте, что реестр получил сообщение от устройства
Если сообщение доставлено, команда подписки на устройство выдает результат. Пример:
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 — сообщение, которое было отправлено.