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


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

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

Примечание.

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

Сообщения "из облака на устройство" отправляются через обращенную к службе конечную точку, (/messages/devicebound). Затем устройства получают эти сообщения через конечную точку конкретного устройства (/devices/{ИД_устройства}/messages/devicebound).

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

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

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

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

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

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

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

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

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

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

  • Прервать сообщение, в результате чего центр Интернета вещей возвращает его в очередь с состоянием Enqueued (В очереди). Устройства, подключающиеся через протокол MQTT, не могут отказаться от сообщений из облака на устройство.

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

Свойство Максимальное число доставок в центре Интернета вещей определяет, сколько раз сообщение может переходить между состояниями Enqueued (В очереди) и Invisible (Невидимо). После выполнения такого количества переходов центр Интернета вещей устанавливает для сообщения состояние Dead lettered (Не доставлено). Таким же образом Центр Интернета вещей устанавливает для сообщения состояние Dead lettered (Не доставлено) после истечения его срока действия.

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

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

  • Отправить одно или несколько сообщений (с устройства в облако) в серверную часть решения на различных этапах выполнения задачи.

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

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

  • с помощью свойства ExpiryTimeUtc в службе;
  • в центре Интернета вещей с помощью свойства time to live, которое задается как свойство центра Интернета вещей.

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

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

  • могут получать сообщения;
  • находятся в автономном режиме или в состоянии сбоя.

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

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

Значение свойства ack Поведение
ничего По умолчанию. Центр Интернета вещей не создает сообщение обратной связи.
позитивная тональность Центр Интернета вещей создает сообщение отзыва, если сообщение, отправляемое из облака на устройство, достигает состояния Completed (Завершено).
негативная тональность Центр Интернета вещей создает сообщение отзыва, если сообщение, отправляемое из облака на устройство, достигает состояния Dead lettered (Не доставлено).
full Центр Интернета вещей создает сообщение отзыва в любом случае.

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

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

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

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

Основная часть — это сериализованный массив записей JSON, каждая из которых имеет следующие свойства:

Свойство Description
enqueuedTimeUtc Метка времени, указывающая, когда произошло сообщение. Например, метка времени, указывающая, когда центр получил сообщение о отзыве или истек срок действия исходного сообщения.
originalMessageId MessageId сообщения об облачном устройстве, к которому относятся эти сведения об обратной связи.
statusCode Требуемая строка, используемая в сообщениях обратной связи, созданных Центром Интернета вещей:
Успешно
Срок действия истек
DeliveryCountExceeded
Аннулировано
Очищено
описание Строковые значения StatusCode.
deviceId DeviceId целевого устройства сообщения об облаке к устройству, к которому относится этот фрагмент обратной связи.
deviceGenerationId DeviceGenerationId целевого устройства сообщения об облаке к устройству, к которому относится этот фрагмент обратной связи.

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

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

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

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

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

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

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

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

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

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

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

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

  • В 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 пакетах SDK.

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