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

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

Примечание

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

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

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

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

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

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

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

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

Отправляя сообщение на устройство, служба центра Интернета вещей задает для него состояние 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"
  },
  {
    ...
  },
  ...
]

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

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

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

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

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

Свойство Описание Диапазон и значение по умолчанию
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 не поддерживается установка свойств 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.

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