Поделиться через


Общие сведения об обмене сообщениями между облаком и устройствами из Центра Интернета вещей

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

Замечание

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

Вы отправляете сообщения из облака на устройство через конечную точку, находящуюся на стороне службы, /messages/devicebound. Затем устройство получает сообщения через конечную точку, относящуюся к устройству, /devices/{deviceId}/messages/devicebound.

Чтобы нацелить каждое сообщение из облака на одно устройство, Центр Интернета Вещей устанавливает для свойства to значение /devices/{deviceId}/messages/devicebound.

Каждая очередь устройств содержит не более 50 сообщений из облака на устройство. Ошибка возникает при попытке отправить больше сообщений на то же устройство.

В этой статье рассматриваются основные понятия и процессы, связанные с сообщениями из облака на устройство. Рекомендации по разработке приложений, обрабатывающих сообщения из облака на устройство, см. в статье "Отправка и получение сообщений из облака на устройство".

Жизненный цикл сообщения "облако — устройство"

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

График состояния жизненного цикла отображается на следующей схеме:

Схема, показывающая график состояния жизненного цикла сообщений из облака на устройство.

Когда служба Центра Интернета вещей отправляет сообщение устройству, она устанавливает состояние сообщения в Enqueued. Когда поток устройства готов к получению сообщения, центр Интернета вещей блокирует сообщение, задав состояние "Невидимый". Это состояние позволяет другим потокам на устройстве начать получать другие сообщения. Когда поток устройства завершает обработку сообщения, он уведомляет Центр Интернета вещей, завершив сообщение. Затем Центр Интернета вещей задает состояние Completed.

Устройство может также:

  • Отклонить сообщение, которое приводит к тому, что Центр Интернета вещей устанавливает его в состояние "Мертвые буквы ". Для восстановления этих сообщений нет очереди недоставленных писем. Устройства, подключающиеся по протоколу MQTT (транспорт телеметрии с очередью сообщений), не могут отклонять сообщения, поступающие из облака на устройство.

  • Отказаться от сообщения, которое приводит к тому, что Центр Интернета вещей помещает сообщение обратно в очередь, при этом для состояния задано значение Enqueued. Устройства, подключающиеся через протокол MQTT, не могут отказаться от сообщений из облака на устройство.

Поток может не обработать сообщение без уведомления IoT-хаба. В этом случае сообщения автоматически переходили из невидимого состояния обратно в состояние enqueued после времени ожидания видимости (или времени ожидания блокировки). Длина этого времени ожидания составляет одну минуту и не может быть изменена.

Свойство максимальное количество доставок в IoT-хабе определяет максимальное количество раз, которое сообщение может переходить между состояниями В очереди и Невидимое. После этого числа переходов центр Интернета вещей задает состояние сообщения в значение "Мертвый". Аналогичным образом центр Интернета вещей отмечает состояние сообщения как Dead lettered после истечения срока действия.

Обычно устройство завершает сообщение из облака на устройство, если потеря сообщения не влияет на логику приложения. Примером этого завершения может быть то, что устройство сохраняет содержимое сообщения локально или успешно выполняет операцию. Сообщение также может содержать временные сведения, потери которых не повлияют на функциональные возможности приложения. Иногда для долгосрочных задач можно:

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

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

Срок действия сообщения (время жизни)

Каждое сообщение из облака на устройство имеет время окончания срока действия. Любой из следующих параметров задает время окончания срока действия:

  • Свойство ExpiryTimeUtc в службе
  • Центр Интернета вещей, используя время жизни по умолчанию, указанное в качестве свойства Центра Интернета вещей

Дополнительные сведения об истечении срока действия сообщения см. в параметрах конфигурации "Облако — устройство".

Распространенный способ использовать истечение срока действия сообщения и избежать отправки сообщений на отключенные устройства — это установить короткие значения времени жизни. Этот подход достигает того же результата, что и для поддержания состояния подключения устройства, но это более эффективно. При запросе подтверждения сообщений центр Интернета вещей уведомляет вас о том, какие устройства:

  • Могут получать сообщения.
  • Не подключены к сети или завершились сбоем.

Отзывы о сообщении

При отправке сообщения об облаке на устройство служба может запросить доставку отзывов по каждому сообщению о окончательном состоянии этого сообщения. Вы можете настроить обратную связь для сообщения, установив свойство приложения iothub-ack в сообщении облака на устройство, задав его в одно из следующих четырех значений:

Значение свойства Ack Поведение
никакой По умолчанию. Центр Интернета вещей не создает сообщение обратной связи.
позитивная тональность Если сообщение "облако — устройство" достигает состояния "Завершено ", Центр Интернета вещей создает сообщение обратной связи.
негативная тональность Если сообщение от облака к устройству достигает состояния невостребованный, IoT-хаб создает сообщение обратной связи.
полный Центр Интернета вещей создает сообщение обратной связи в любом случае.

Если значение свойства Ack установлено на полный, и вы не получите сообщение обратной связи, это означает, что срок действия сообщения истек. Служба не может знать, что произошло с исходным сообщением. На практике служба должна убедиться, что она может обрабатывать отзывы до истечения срока действия. Максимальное время окончания срока действия составляет два дня, что оставляет время для повторного запуска службы, если произойдет сбой.

Как объясняется в конечных точках центра IoT, центр IoT предоставляет отзывы через конечную точку, ориентированную на службу, /messages/servicebound/feedback, в виде сообщений. Семантика получения отзывов совпадает с семантикой для сообщений из облака на устройство. По возможности отзывы сообщений пакетируются в одном сообщении со следующим форматом:

Недвижимость Описание
EnqueuedTime Метка времени, указывающая, когда концентратор получил сообщение обратной связи.
UserId {iot hub name}
ТипКонтента application/vnd.microsoft.iothub.feedback.json

Система отправляет отзыв либо в случае, когда пакет достигает 64 сообщений, либо через 15 секунд после последнего отправки, в зависимости от того, что происходит в первую очередь.

Текст представляет собой сериализованный в формате JSON массив записей, каждый из которых содержит следующие свойства:

Недвижимость Описание
enqueuedTimeUtc Метка времени, указывающая, когда произошло событие сообщения. Например, метка времени, указывающая, когда центр получил сообщение о отзыве или истек срок действия исходного сообщения.
originalMessageId MessageId сообщения из облака на устройство, к которому относятся эти сведения об обратной связи.
код состояния Требуемая строка, используемая Центром Интернета вещей при создании сообщений обратной связи:
Успешно
Срок действия истек
ПревышеноКоличествоДоставок
Отвергнуты
Очищены
description Строковые значения для StatusCode.
идентификатор устройства DeviceId целевого устройства для сообщения из облака к устройству, к которому относится данный фрагмент обратной связи.
Идентификатор поколения устройства DeviceGenerationId устройства-получателя сообщения от облака к устройству, к которому относится данный фрагмент обратной связи.

Служба должна указать MessageId, чтобы сообщение из облака на устройство могло соотнести свой отзыв с исходным сообщением.

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

[
  {
    "originalMessageId": "0987654321",
    "enqueuedTimeUtc": "2015-07-28T16:24:48.789Z",
    "statusCode": "Success",
    "description": "Success",
    "deviceId": "123",
    "deviceGenerationId": "abcdefghijklmnopqrstuvwxyz"
  },
  {
    ...
  },
  ...
]

Ожидание обратной связи для удаленных устройств

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

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

Параметры конфигурации облачных устройств

Каждый Центр Интернета вещей предоставляет следующие параметры конфигурации для обмена сообщениями между облаком и устройствами:

Недвижимость Описание Диапазон и значение по умолчанию
defaultTtlAsIso8601 TTL по умолчанию для сообщений из облака в устройство интервал ISO_8601 до двух дней (минимум одна минута); по умолчанию: один час
maxDeliveryCount Максимальное количество доставки для очередей между устройствами на облако от 1 до 100; по умолчанию: 10
feedback.ttlAsIso8601 Хранение сообщений обратной связи с привязкой к службе интервал ISO_8601 до двух дней (минимум одна минута); по умолчанию: один час
feedback.maxDeliveryCount Максимальное количество доставки для очереди отзывов от 1 до 100; по умолчанию: 10
feedback.lockDurationAso8601 Длительность блокировки для очереди отзывов ISO_8601 интервал от 5 до 300 секунд (минимум пять секунд); значение по умолчанию: 60 секунд.

Параметры конфигурации можно задать на портале Azure или Azure CLI:

  • Портал Azure. В разделе "Параметры Центра " в Центре Интернета вещей выберите встроенные конечные точки и перейдите в облако для обмена сообщениями с устройствами. (Установка свойства feedback.maxDeliveryCount или feedback.lockDurationAsIso8601 в настоящее время не поддерживается на портале Azure.)

    Настройка параметров конфигурации для обмена сообщениями между облаком и устройствами на портале

  • Azure CLI: используйте команду az iot hub update :

    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.defaultTtlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.ttlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.lockDurationAsIso8601=PT0H1M0S
    

Дальнейшие шаги

Сведения о SDK, которые можно использовать для обработки сообщений из облака на устройство, см. в разделе Azure IoT Hub SDKs.

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