Взаимодействие с Центром Интернета вещей с помощью протокола MQTT

Центр Интернета вещей позволяет устройствам взаимодействовать с конечными точками устройств Центра Интернета вещей с помощью:

  • протокола MQTT версии 3.1.1 на порту 8883;
  • протокола MQTT версии 3.1.1 через WebSocket на порту 443.

Центр Интернета вещей не является полнофункциональным брокером MQTT и не поддерживает все функциональные возможности, указанные в стандарте MQTT версии 3.1.1. В этой статье описывается, как устройства могут использовать поддерживаемые MQTT поведения для связи с Центром Интернета вещей.

Примечание

Некоторые функции, упоминаемые в этой статье, например обмен сообщениями между облаком и устройством, двойники устройств и управление устройствами, доступны только для Центра Интернета вещей уровня "Стандартный". Дополнительные сведения о базовом и стандартном уровнях см. в статье о выборе нужного уровня Центра Интернета вещей.

Весь обмен данными Центра Интернета вещей с устройствами защищен с помощью протокола TLS/SSL. Таким образом, Центр Интернета вещей не поддерживает небезопасные подключения через порт 1883.

Подключение к Центру Интернета вещей

На устройстве протокол MQTT можно использовать для подключения к Центру Интернета вещей с помощью любого из следующих способов.

Порт MQTT (8883) блокируется во многих корпоративных и образовательных сетевых средах. Если в брандмауэре не удается открыть порт 8883, рекомендуется использовать MQTT через веб-сокеты. MQTT через веб-сокеты передает данные через порт 443, который почти всегда открыт в сетевых средах. Чтобы узнать, как указать протоколы MQTT и MQTT через веб-сокеты при использовании пакетов SDK для Azure IoT, см. раздел Использование пакетов SDK для устройств.

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

Доступны пакеты SDK для устройств с поддержкой протокола MQTT для Java, Node.js, C, C# и Python. Для установки подключения к Центру Интернета вещей пакеты SDK для устройств используют стандартную строку подключения к Центру Интернета вещей. Чтобы использовать протокол MQTT, параметр протокола клиента должен быть задан как MQTT. В параметре протокола клиента можно также указать MQTT через веб-сокеты. По умолчанию пакеты SDK для устройств подключаются к Центру Интернета вещей, если для флага CleanSession установлено значение 0, и используют качество обслуживания первого уровня для обмена сообщениями с Центром Интернета вещей. Несмотря на возможность настройки параметров QoS 0 для ускорения обмена сообщениями, необходимо помнить, что доставка не гарантируется и не подтверждается. По этой причине QoS 0 часто называют "отправлено и забыто".

Когда устройство подключено к Центру Интернета вещей, пакеты SDK для устройства предоставляют методы, позволяющие устройству осуществлять обмен сообщениями с Центром Интернета вещей.

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

Язык Параметр протокола MQTT Параметр протокола MQTT через веб-сокеты
Node.js azure-iot-device-mqtt.Mqtt azure-iot-device-mqtt.MqttWs
Java IotHubClientProtocol.MQTT IotHubClientProtocol.MQTT_WS
C MQTT_Protocol MQTT_WebSocket_Protocol
C# TransportType.Mqtt Если происходит сбой MQTT, для TransportType.Mqtt используется MQTT через веб-сокеты. Если нужно задать только протокол MQTT через веб-сокеты, используйте TransportType.Mqtt_WebSocket_Only.
Python Поддерживает MQTT по умолчанию Добавьте websockets=True в вызов, чтобы создать клиент.

В следующем фрагменте кода показано, как указать протокол MQTT через веб-сокеты при использовании пакета SDK Node.js для Azure IoT:

var Client = require('azure-iot-device').Client;
var Protocol = require('azure-iot-device-mqtt').MqttWs;
var client = Client.fromConnectionString(deviceConnectionString, Protocol);

В следующем фрагменте кода показано, как указать протокол MQTT через веб-сокеты при использовании пакета SDK Python для Azure IoT:

from azure.iot.device.aio import IoTHubDeviceClient
device_client = IoTHubDeviceClient.create_from_connection_string(deviceConnectionString, websockets=True)

Время ожидания проверки активности по умолчанию

Чтобы обеспечить постоянную активность подключения клиента c Центром Интернета вещей, служба и клиент регулярно отправляют друг другу проверки связи. Клиент, использующий пакет SDK для IoT, отправляет проверку связи через интервал, указанный в следующей таблице.

Язык Интервал проверки активности по умолчанию Настраивается
Node.js 180 секунд нет
Java 230 секунд нет
C 240 секунд Да
C# 300 секунд Да
Python 60 секунд нет

В соответствии с техническими характеристиками MQTT, Центр Интернета вещей поддерживает интервал запроса проверки на активность, в 1,5 раза превышающий значение запроса проверки на активность клиента. При этом Центр Интернета вещей ограничивает максимальное время ожидания на стороне сервера значением 29,45 минут (1767 секунд), так как все службы Azure привязаны к времени ожидания неактивного подключения TCP в Azure Load Balancer, которое составляет 29,45 минут.

Например, устройство, использующее Java SDK отправляет запрос проверки на активность и теряет подключение к сети. Через 230 секунд устройство не отвечает на проверку связи, так как она находится в автономном режиме. Однако центр Интернета вещей не закрывает подключение немедленно — он ожидает еще один (230 * 1.5) - 230 = 115 секунд перед отключением устройства с ошибкой (230 * 1.5) - 230 = 115.

Максимальное значение интервала проверки активности клиента, которое можно задать, — 1767 / 1.5 = 1177 секунд. Любой трафик сбрасывает отсчет интервала проверки активности. Например, обновление маркера SAS сбрасывает интервал проверки активности.

Переход от AMQP на MQTT в приложении устройства

Если вы используете SDK устройства, то переключение от использования AMQP на MQTT требует изменения параметра протокола в исходных данных клиента, как указано ранее.

При этом обязательно проверьте следующее:

  • AMQP возвращает ошибки для многих условий, а MQTT завершает подключение. В результате может потребоваться изменить логику обработки исключений.

  • MQTT не поддерживает операции отклонения при получении сообщений из облака на устройство. Если нужно, чтобы внутреннее приложение получало ответы от приложения для устройства, стоит использовать прямые методы.

  • AMQP не поддерживается в Python SDK.

Пример в C используют MQTT без пакета SDK для устройств Интернета вещей Azure

В репозитории образцов Центра Интернета вещей IoT MQTT приведены несколько примеров демонстрационных проектов C/C++, показывающих процедуры отправки сообщений телеметрии и получения событий с Центром Интернета вещей Azure без использования.

В этих примерах для отправки сообщений MQTT Broker, внедренному в Центр Интернета вещей, используется библиотека Eclipse Mosquitto.

Дополнительные сведения об адаптации образцов для использования конвенций Azure IoT Plug and Play см. в Учебные материалы: использование MQTT для разработки IoT Plug and Play для устройства клиента.

Этот репозиторий включает следующее содержимое.

Для Windows.

  • TelemetryMQTTWin32: содержит код для отправки сообщения телеметрии в центр Интернета вещей Azure, который создается и запускается на компьютере Windows.

  • SubscribeMQTTWin32: содержит код для подписки на события определенного центра Интернета вещей на компьютере Windows.

  • DeviceTwinMQTTWin32: содержит код для запроса событий двойника устройства в центре Интернета вещей на компьютере Windows и подписки на них.

  • PnPMQTTWin32: содержит код для отправки телеметрических данных с помощью возможностей устройства IoT Plug and Play в Центр Интернета вещей Azure, созданный и запущенный на машине Windows. Подробнее см. в статье IoT Plug and Play

Для Linux.

  • MQTTLinux: содержит код и скрипт сборки для запуска в Linux (на данный момент протестированы в WSL, Ubuntu и Raspbian).

  • LinuxConsoleVS2019: содержит тот же код, но в проекте VS2019, предназначенном для WSL (подсистема Windows для Linux). В этом проекте можно пошагово отлаживать выполняемый в Linux код в Visual Studio.

Для mosquitto_pub.

Эта папка содержит два примера команд, которые используются со служебным инструментом mosquitto_pub, предоставляемым Mosquitto.org.

  • Mosquitto_sendmessage: для отправки простого текстового сообщения в центр Интернета вещей Azure, выполняющий роль устройства.

  • Mosquitto_subscribe: для просмотра событий, происходящих в центре Интернета вещей Azure.

Непосредственное использование протокола MQTT (как устройство)

Если устройство не может использовать пакеты SDK для устройств, оно может подключаться к общедоступным конечным точкам устройства по протоколу MQTT по порту 8883. В пакете CONNECT устройство должно использовать следующие значения.

  • В поле Идентификатор клиента укажите значение идентификатор устройства.

  • В поле username (имя пользователя ) укажите , где {iothubhostname} — это полная запись CNAME центра Интернета вещей.

    Например, если имя Центра Интернета вещей — contoso.azure-devices.net, а имя устройства — MyDevice01, то полное поле Username (Имя пользователя) должно содержать:

    contoso.azure-devices.net/MyDevice01/?api-version=2018-06-30

    Рекомендуется в поле указать api-версию. В противном случае может иметь место непредусмотренное поведение.

  • В поле Пароль укажите маркер SAS. Формат маркера SAS аналогичен описанному для протоколов HTTPS и AMQP:

    SharedAccessSignature sig={signature-string}&se={expiry}&sr={URL-encoded-resourceURI}

    Примечание

    При использовании аутентификации с помощью сертификата X.509 пароли маркеров SAS не требуются. Дополнительные сведения см. в статье Настройка безопасности X.509 в вашем Центре Интернета вещей Azure и соблюдайте инструкции по коду в разделе настройки параметров TLS/SSL.

    Дополнительные сведения о способах создания маркеров SAS см. в соответствующем разделе статьи Управление доступом к Центру Интернета вещей.

    При проведении тестирования вы можете использовать кросс-платформенную версию Azure IoT Tools для кода Visual Studio Code или команду расширения CLI az iot hub generate-sas-token для быстрого формирования SAS токена, который вы сможете использовать для копирования и вставки в собственный код.

Инструкции для Azure IoT Tools

  1. Разверните вкладку AZURE IOT HUB DEVICES (Устройства Центра Интернета вещей Azure) в левом нижнем углу Visual Studio Code.

  2. Щелкните устройство правой кнопкой мыши и выберите Generate SAS Token for Device (Создать маркер безопасности SAS для этого устройства).

  3. Задайте время истечения срока действия и нажмите клавишу "ВВОД".

  4. Маркер SAS создается и копируется в буфер обмена.

    Созданный маркер SAS имеет следующую структуру.

    HostName={your hub name}.azure-devices.net;DeviceId=javadevice;SharedAccessSignature=SharedAccessSignature sr={your hub name}.azure-devices.net%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

    Его часть используется в поле Пароль для подключения с использованием MQTT:

    SharedAccessSignature sr={your hub name}.azure-devices.net%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

Для пакетов подключения и отключения MQTT Центр Интернета вещей создает событие в канале мониторинга операций. Это событие содержит дополнительные сведения, которые помогут устранить неполадки с подключением.

Приложение устройства может указать сообщение Will в пакете CONNECT. Приложение устройства должно использовать devices/{device_id}/messages/events/ или devices/{device_id}/messages/events/{property_bag} как имя раздела, которое devices/{device_id}/messages/events/ для определения, devices/{device_id}/messages/events/{property_bag} пересылаться в виде сообщения телеметрии. В этом случае, если сетевое соединение закрыто, но пакет DISCONNECT ранее не был получен с устройства, то концентратор Центр Интернета вещей отправляет сообщение Will, содержащееся в пакете CONNECT, в канал телеметрии. Канал телеметрии может быть либо конечной точкой События по умолчанию, либо настраиваемой конечной точкой, определяемой маршрутизацией Центра Интернета вещей. Сообщение имеет свойство iothub-MessageType со значением Will, назначенным ему.

Непосредственное использование протокола MQTT (как модуль)

Подключение к Центру Интернета вещей по протоколу MQTT с использованием модуля проверки подлинности аналогично подключению к устройству (описано в разделе использования протокола MQTT непосредственно, как устройства), но вам необходимо выполнить следующие действия:

  • Задайте идентификатор клиента {device_id}/{module_id}.

  • При аутентификации с использованием имени пользователя и пароля задайте для имени пользователя значение <hubname>.azure-devices.net/{device_id}/{module_id}/?api-version=2018-06-30 и используйте в качестве пароля маркер SAS, связанный с удостоверением модуля.

  • Используйте devices/{device_id}/modules/{module_id}/messages/events/ в качестве раздела для публикации телеметрии.

  • Используйте devices/{device_id}/modules/{module_id}/messages/events/ как раздел WILL.

  • Разделы двойников GET и PATCH идентичны для модулей и устройств.

  • Раздел состояния двойников идентичны для модулей и устройств.

конфигурация протокола TLS/SSL

Чтобы напрямую использовать протокол MQTT, ваш клиент должен подключиться по протоколу TLS/SSL. Попытки пропустить этот шаг будут завершаться ошибками соединения.

Чтобы установить соединение TLS, может потребоваться скачать корневой сертификат DigiCert Baltimore и добавить ссылку на него. Этот сертификат используется в Azure для обеспечения безопасного подключения. Он хранится в репозитории Azure-iot-sdk-c. Дополнительные сведения об этих сертификатах можно найти на веб-сайте Digicert.

Пример реализации с помощью версии библиотеки Paho MQTT для Python от Eclipse Foundation может выглядеть следующим образом.

Сначала установите библиотеку Paho из командной строки:

pip install paho-mqtt

Затем запустите клиент в сценарии Python. Замените заполнители следующим образом.

  • <local path to digicert.cer> — путь к локальному файлу, содержащему корневой сертификат DigiCert Baltimore. Этот файл можно создать, скопировав сведения о сертификате из certs. c в пакете SDK для Azure IOT для c. Включите строки и -----END CERTIFICATE----- , удалите " метки в начале и конце каждой строки и удалите \r\n символы в конце каждой строки.

  • <device id from device registry> — идентификатор устройства, добавленного в Центр Интернета вещей.

  • <generated SAS token> — маркер SAS для устройства, созданного как описано ранее в этой статье.

  • <iot hub name> — имя Центра Интернета вещей.

from paho.mqtt import client as mqtt
import ssl

path_to_root_cert = "<local path to digicert.cer file>"
device_id = "<device id from device registry>"
sas_token = "<generated SAS token>"
iot_hub_name = "<iot hub name>"


def on_connect(client, userdata, flags, rc):
    print("Device connected with result code: " + str(rc))


def on_disconnect(client, userdata, rc):
    print("Device disconnected with result code: " + str(rc))


def on_publish(client, userdata, mid):
    print("Device sent message")


client = mqtt.Client(client_id=device_id, protocol=mqtt.MQTTv311)

client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish

client.username_pw_set(username=iot_hub_name+".azure-devices.net/" +
                       device_id + "/?api-version=2018-06-30", password=sas_token)

client.tls_set(ca_certs=path_to_root_cert, certfile=None, keyfile=None,
               cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
client.tls_insecure_set(False)

client.connect(iot_hub_name+".azure-devices.net", port=8883)

client.publish("devices/" + device_id + "/messages/events/", '{"id":123}', qos=1)
client.loop_forever()

Чтобы выполнить проверку подлинности с помощью сертификата устройства, внесите в фрагмент кода выше следующие изменения (сведения о подготовке к проверке подлинности на основе сертификата см. в разделе Как получить сертификат ЦС X.509).

# Create the client as before
# ...

# Set the username but not the password on your client
client.username_pw_set(username=iot_hub_name+".azure-devices.net/" +
                       device_id + "/?api-version=2018-06-30", password=None)

# Set the certificate and key paths on your client
cert_file = "<local path to your certificate file>"
key_file = "<local path to your device key file>"
client.tls_set(ca_certs=path_to_root_cert, certfile=cert_file, keyfile=key_file,
               cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)

# Connect as before
client.connect(iot_hub_name+".azure-devices.net", port=8883)

Отправка сообщений из устройства в облако

После успешного подключения устройство может отправить сообщения в центр Интернета вещей, используя devices/{device_id}/messages/events/ или devices/{device_id}/messages/events/{property_bag} как devices/{device_id}/messages/events/. Элемент {property_bag} позволяет устройству отправлять сообщения с дополнительными свойствами в формате URL-адреса. Пример:

RFC 2396-encoded(<PropertyName1>)=RFC 2396-encoded(<PropertyValue1>)&RFC 2396-encoded(<PropertyName2>)=RFC 2396-encoded(<PropertyValue2>)…

Примечание

В этом элементе {property_bag} используется та же кодировка символов, что и для строк запросов в протоколе HTTPS.

Ниже приведен список реакций на события, характерных для реализации Центра Интернета вещей:

  • Центр Интернета вещей не поддерживает сообщения со вторым уровнем качества обслуживания. Если приложение для устройства публикует сообщение со вторым уровнем качества обслуживания, то Центр Интернета вещей закрывает сетевое подключение.

  • Центр Интернета вещей не сохраняет сообщения retain. Если устройство направляет сообщение СОХРАНИТЬ с флажком установленном на 1, Центр Интернета вещей добавляет в сообщение свойство mqtt-retain приложения. В этом случае Центр Интернета вещей не хранит сообщение retain, а передает его во внутреннее приложение.

  • Центр Интернета вещей поддерживает только одно активное подключение MQTT на устройство. Любое новое подключение MQTT от имени того самого идентификатора устройства вызывает разрыв существующего соединения с Центром Интернета вещей и запись 400027 ConnectionForcefullyClosedOnNewConnection регистрируется в журнале Центра Интернета вещей

Дополнительные сведения см. в статье Отправка сообщений с устройства в облако и из облака на устройство с помощью Центра Интернета вещей.

Получение сообщений из облака на устройство

Чтобы получить сообщения из центра Интернета вещей, устройство должно подписываться с помощью devices/{device_id}/messages/devicebound/# в качестве devices/{device_id}/messages/devicebound/#. Многоуровневый подстановочный знак # в параметре Topic Filter (Фильтр разделов) используется только для того, чтобы разрешить устройству получать дополнительные свойства в имени раздела. В Центре Интернета вещей запрещено использовать подстановочные знаки # или ? для фильтрации подразделов. Так как Центр Интернета вещей не является универсальным брокером службы сообщений на основе шаблона "издатель-подписчик", то он поддерживает только задокументированные имена и фильтры разделов.

Устройство не сможет получать никаких сообщений от Центра Интернета вещей до его успешной подписки к специальной конечной точке для устройства, представленного фильтром темы devices/{device_id}/messages/devicebound/#. Когда подписка выполнена, устройство получает сообщения, переданные из облака на устройство, только с момента подписки. Если устройство подключается с флагом CleanSession, имеющим значение 0, то подписка будет сохраняться в разных сеансах. В этом случае при следующем подключении с флагом CleanSession 0 устройство получает ожидающие сообщения, отправленные на него, пока оно было отключено. Если устройство использует флаг CleanSession со значением 1, то оно не будет получать сообщения из Центра Интернета вещей, пока не будет подписано на конечную точку устройства.

Центр Интернета вещей передает сообщения с именем раздела или devices/{device_id}/messages/devicebound/{property_bag} при наличии свойств сообщения. {property_bag} содержит закодированные в формате URL-адреса пары "ключ-значение" свойств сообщения. В контейнер свойств входят только свойства приложений и задаваемые пользователем системные свойства (такие как messageId или correlationId). Имена системных свойств имеют префикс $ , свойства приложений используют исходное имя свойства без префикса. Дополнительные сведения о формате пакета свойств, см. в статье Отправка сообщений из устройства в облако.

В сообщениях из устройства в облако значения в пакете свойств представлены в следующей таблице:

Значение свойства Представление Описание
null key В пакете свойств отображается только ключ
пустая строка key= За ключом указывается знак "равно" без значения
не нулевое, не пустое значение key=value За ключом указывается знак "равно" и значение

В следующем примере показан контейнер свойств, содержащий три свойства приложения: Prop1 со значением ; Prop2, пустая строка (""); и Prop3 со значением «строка».

/?prop1&prop2=&prop3=a%20string

Если приложение для устройства подписывается на раздел со вторым уровнем качества обслуживания, то Центр Интернета вещей присваивает пакету SUBACK уровень качества обслуживания не выше первого. После этого Центр Интернета вещей доставляет сообщения на устройство, используя первый уровень качества обслуживания.

Получение свойств двойника устройства

Сначала устройство подписывается на $iothub/twin/res/#, чтобы получать ответы операций. Затем он отправляет пустое сообщение в раздел $iothub/twin/GET/?$rid={request id} с заполненным ЗНАЧЕНИЕМ $iothub/twin/GET/?$rid={request id}. Затем служба отправляет ответное сообщение, содержащее данные двойникаа устройства в разделе $iothub/twin/res/{status}/?$rid={request id} , используя тот же $iothub/twin/res/{status}/?$rid={request id} , что и в запросе.

Запрос идентификатора может быть любым действительным значением для значения свойства сообщения, в соответствии с Руководством для разработчика обмена сообщениями в Центре Интернета вещей, а состояние оценивается как целое.

Текст ответа содержит раздел properties двойника устройства, как показано в следующем примере ответа:

{
    "desired": {
        "telemetrySendFrequency": "5m",
        "$version": 12
    },
    "reported": {
        "telemetrySendFrequency": "5m",
        "batteryLevel": 55,
        "$version": 123
    }
}

Возможны следующие коды состояний:

Состояние Описание
200 Успешно
429 Слишком много запросов (регулирование), как указано в статье Квоты и регулирование в Центре Интернета вещей
5** ошибки сервера;

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

Обновление сообщаемых свойств двойника устройства

Чтобы обновить сообщаемые свойства, устройство отправляет запрос в Центр Интернета вещей с помощью публикации в указанном разделе MQTT. После обработки запроса Центр Интернета вещей выводит ответ с состоянием "Успех" или "Сбой" операции обновления путем публикации в другом разделе. Это устройство может быть подписано на раздел, чтобы уведомить его о запросе на обновление двойника. Чтобы реализовать этот тип взаимодействия "запрос — ответ" в MQTT, мы используем понятие идентификатора запроса ($rid), изначально предоставленное устройством в запросе на обновление. Этот идентификатор запроса также включается в ответ Центра Интернета вещей, чтобы позволить устройству сопоставить ответ с конкретным более ранним запросом.

Следующая последовательность действий описывает, как устройство обновляет сообщаемые свойства в двойнике устройства в Центре Интернета вещей:

  1. Сначала устройство должно подписаться на раздел $iothub/twin/res/#, чтобы получать ответы операций из Центра Интернета вещей.

  2. Устройство отправляет сообщение, содержащее обновление двойника устройства, в раздел $iothub/twin/PATCH/properties/reported/?$rid={request id}. Это сообщение содержит значение request ID (идентификатор запроса).

  3. Затем служба отправляет ответное сообщение, содержащее новое значение ETag для коллекции сообщаемых свойств в разделе $iothub/twin/res/{status}/?$rid={request id}. В этом ответном сообщении используется то же значение request ID, что и в запросе.

Текст запроса содержит документ JSON, в котором имеются новые значения для переданных свойств. Каждый элемент документа JSON обновляет или добавляет соответствующий компонент в документе двойника устройства. Элемент, установленный на null, удаляет элемент из содержащего объекта. Пример:

{
    "telemetrySendFrequency": "35m",
    "batteryLevel": 60
}

Возможны следующие коды состояний:

Состояние Описание
204 Успех (содержимое не возвращается)
400 Недопустимый запрос. Неправильно сформированный JSON.
429 Слишком много запросов (регулирование), как указано в статье Квоты и регулирование в Центре Интернета вещей
5** ошибки сервера;

Фрагмент кода Python, приведенный ниже, демонстрирует процесс обновления свойств, сообщаемых двойником, по MQTT (с помощью клиента Paho MQTT):

from paho.mqtt import client as mqtt

# authenticate the client with IoT Hub (not shown here)

client.subscribe("$iothub/twin/res/#")
rid = "1"
twin_reported_property_patch = "{\"firmware_version\": \"v1.1\"}"
client.publish("$iothub/twin/PATCH/properties/reported/?$rid=" +
               rid, twin_reported_property_patch, qos=0)

При успешном выполнении операции обновления сообщаемых двойником свойств, указанных выше, в сообщении публикации из Центра Интернета вещей будет следующий раздел: $iothub/twin/res/204/?$rid=1&$version=6, где 204 — это код состояния, указывающий на успешность, $rid=1 соответствует идентификатору запроса, предоставленному устройством в коде, а $version соответствует версии раздела сообщаемых двойником устройства свойств после обновления.

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

Получение уведомлений об обновлении требуемых свойств

При подключении устройства Центр Интернета вещей отправляет уведомления в раздел $iothub/twin/PATCH/properties/desired/?$version={new version}, в котором находится содержимое обновления, выполненного серверной частью решения. Пример:

{
    "telemetrySendFrequency": "5m",
    "route": null,
    "$version": 8
}

В обновлениях свойств значение null означает, что элемент объекта JSON удаляется. Кроме того, обратите внимание, что $version содержит новую версию раздела с требуемыми свойствами двойника.

Важно!

Центр Интернета вещей создает уведомления об изменении только в том случае, если устройства подключены. Убедитесь, что выполняется процедура повторного подключения устройства, чтобы требуемые свойства продолжали синхронизироваться между Центром Интернета вещей и приложением для устройства.

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

Ответ на прямой метод

Сначала устройство должно подписаться на $iothub/methods/POST/#. Центр Интернета вещей отправляет запросы метода в раздел $iothub/methods/POST/{method name}/?$rid={request id} с допустимым документом JSON или без текста.

В качестве ответа устройство отправляет сообщение без текста или с допустимой строкой JSON в раздел $iothub/methods/res/{status}/?$rid={request id}. В этом сообщении значение request ID должно совпадать с идентификатором в сообщении запроса, а в качестве status должно быть указано целое число.

Дополнительные сведения см. в разделе Руководство для разработчика прямого метода.

Дополнительные сведения

Последнее замечание. Если на стороне облака требуется настроить реакцию на событие протокола MQTT, ознакомьтесь со статьей Поддержка дополнительных протоколов для Центра Интернета вещей. Это программное обеспечение позволяет развернуть шлюз протокола с высокой производительностью, который взаимодействует непосредственно с Центром Интернета вещей. Шлюз протокола Azure IoT позволяет настроить протокол устройства для уже существующих развертываний MQTT или других настраиваемых протоколов. Однако при этом подходе необходимо запустить настраиваемый шлюз протокола и управлять им.

Дальнейшие действия

Дополнительные сведения о протоколе MQTT см. в документации по MQTT.

Дополнительные сведения о планировании развертывания Центра Интернета вещей см. в следующих руководствах:

Для дальнейшего изучения возможностей Центра Интернета вещей см. следующие статьи: