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

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

Примечание

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

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

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

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

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

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

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

Cloud-to-device message life cycle

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

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

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

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

Поток может не обработать сообщение без уведомления центра Интернета вещей. В этом случае состояние сообщения автоматически меняется с Invisible (Невидимо) на Enqueued (В очереди) после истечения времени ожидания видимости (или блокировки). Значение этого времени ожидания равно одной минуте, и изменить его нельзя.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Параметры конфигурации можно задать одним из следующих способов.

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

Set configuration options for cloud-to-device messaging in the portal

  • В 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, которые можно использовать для получения сообщений "из облака на устройство" см. в разделе Пакеты SDK для Центра Интернета вещей Azure.

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