Мониторинг, диагностика и устранение неполадок подключения устройств к Центру Интернета вещей Azure

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

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

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

    • Функции Azure
    • Логические приложения
    • Cлужба автоматизации Azure
    • WebHooks
    • Хранилище очередей
    • Гибридные подключения
    • Event Hubs

Протоколы и порты

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

Протокол Исходящий порт
MQTT 8883
MQTT через WebSocket. 443
AMQP 5671
AMQP через WebSocket; 443
HTTPS 443

Дополнительные сведения о подключении по протоколу телеметрии очередей сообщений (MQTT) см. в разделе Connect to Центр Интернета вещей.

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

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

Предварительные требования для проверки подключения

  • Azure CLI с установленным расширением azure-iot:

    az extension add --upgrade --name azure-iot
    
  • Устройство, зарегистрированное в Центре IoT с строкой подключения. Чтобы зарегистрировать тестовое устройство и получить строка подключения, выполните следующие команды. Замените <your-device-id> именем нового устройства и замените <your-iot-hub-name> на уже созданным центром Интернета вещей.

    az iot hub device-identity create --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
    az iot hub device-identity connection-string show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    

Проверка аутентификации устройств

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

  1. Используйте Azure CLI для отправки тестового сообщения телеметрии с идентификатора устройства. Успешная отправка подтверждает, что ключ устройства действителен:

    az iot device simulate --device-id <your-device-id> --hub-name <your-iot-hub-name> --msg-count 1
    
  2. Если проверка подлинности завершается ошибкой, убедитесь, что строка подключения устройства актуальна. Сбросьте первичный ключ, чтобы создать новый при необходимости:

    az iot hub device-identity update --device-id <your-device-id> --set authentication.symmetricKey.primaryKey="" --hub-name <your-iot-hub-name>
    

    Затем получите обновленный строка подключения (строку подключения):

    az iot hub device-identity connection-string show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    

Создание тестового маркера SAS

Если ваше устройство использует аутентификацию с помощью токена SAS, вы можете создать известный корректный токен SAS, чтобы устранить проблемы с кодом генерации токена:

az iot hub generate-sas-token --device-id <your-device-id> --hub-name <your-iot-hub-name>

Допустимый маркер SAS выглядит следующим образом: SharedAccessSignature sr=your-hub.azure-devices.net%2Fdevices%2FmyDevice&sig=xxxxxx&se=111111

Примеры кода, показывающие, как создавать маркеры SAS программным способом, см. в примерах Azure IoT для Node.js в папке iot-hub/Tutorials/ConnectivityTests.

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

Чтобы убедиться, что данные телеметрии, отправленные устройством, достигают центра:

  1. Отправка тестовых сообщений телеметрии с устройства:

    az iot device simulate --device-id <your-device-id> --hub-name <your-iot-hub-name> --msg-count 5
    
  2. На портале Azure перейдите к центру Интернета вещей. В разделе "Мониторинг " в боковом меню выберите "Метрики".

  3. В раскрывающемся списке "Метрика " выберите сообщения телеметрии, отправленные в качестве метрики , и задайте диапазон времени в правом верхнем углу значение Last hour. На диаграмме отображается совокупное количество сообщений, отправляемых устройством.

    Примечание.

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

Проверка подключения из облака на устройство

Чтобы проверить путь к облаку на устройство, используйте прямой вызов метода. Запустите имитированное устройство в одном окне терминала, а затем вызовите прямой метод из другого:

az iot hub invoke-device-method --device-id <your-device-id> --method-name TestMethod --timeout 10 --method-payload '{"key":"value"}' --hub-name <your-iot-hub-name>

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

Проверка синхронизации двойников устройств.

Чтобы убедиться, что данные двойника устройства синхронизируются между устройством и узлом:

  1. Просмотрите текущий двойник устройства, чтобы проверить сообщаемые свойства:

    az iot hub device-twin show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
  2. Отправьте требуемое обновление свойства и подтвердите, что устройство получает его:

    az iot hub device-twin update --set properties.desired='{"mydesiredproperty":"propertyvalue"}' --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
  3. Выполните команду twin show еще раз, чтобы подтвердить, что устройство признало требуемое свойство в его сообщаемых свойствах.

Сетка событий и Azure Monitor

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

При выборе того, следует ли использовать сетку событий или Azure Monitor для определенного сценария, учитывайте следующие проблемы:

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

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

  • Упрощенная настройка. Оповещения метрик Azure Monitor поддерживают упрощенную процедуру установки, которая не требует интеграции с другими службами для доставки уведомлений по электронной почте, SMS, Голосовой связи и доставки других видов уведомлений. С помощью службы Сетка событий необходимо интегрироваться с другими службами Azure для доставки уведомлений. Обе службы могут интегрироваться с другими службами для активации более сложных действий.

Сетка событий. Мониторинг событий подключения и отключения

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

Примечание.

Чтобы отслеживать события подключения и отключения устройств в рабочей среде, рекомендуется подписаться на DeviceConnected и DeviceDisconnected события в Сетке событий для активации предупреждений и мониторинга состояния подключения устройства.

При использовании службы Сетка событий для мониторинга или активации оповещений при отключении устройств убедитесь, что при такой реализации фильтруются периодические отключения, возникающие из-за возобновления токена SAS на устройствах, использующих пакеты SDK для Интернета вещей Azure. Дополнительные сведения см. в разделе Поведение при отключении устройств MQTT, использующих пакеты SDK для Интернета вещей Azure.

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

Azure Monitor. Использование журналов для разрешения ошибок подключения

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

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

  1. Перейдите в Центр Интернета вещей на портале Azure.

  2. В разделе «Мониторинг» в боковом меню узла IoT выберите «Журналы».

  3. Переход с простого режима на режим KQL. Чтобы выделить журналы ошибок подключения для Центра Интернета вещей, введите следующий запрос в редакторе запросов, а затем выберите Запустить:

    AzureDiagnostics
    | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. В результатах (если они будут) найдите OperationName, ResultType (код ошибки) и ResultDescription (сообщение об ошибке), чтобы получить более подробную информацию.

    Снимок экрана: пример журнала ошибок.

Сведения об устранении наиболее распространенных ошибок см. в следующих руководствах:

Azure Monitor. Использование журналов для наблюдения за подключением к конкретному устройству

Могут возникнуть ситуации, когда вы хотите использовать Azure Monitor для просмотра ошибок подключения и сведений для конкретного устройства. Чтобы изолировать события подключения для устройства, можно выполнить те же действия, что и в предыдущем разделе, но ввести следующий запрос. Замените <your-device-id> именем устройства.

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend DeviceId = tostring(parse_json(properties_s).deviceId)
| where DeviceId == "<your-device-id>"

Запрос возвращает как события об ошибках, так и информационные события для целевого устройства. В следующем примере выходных данных показано информационное событие deviceConnect:

Снимок экрана: событие deviceConnect в журналах.

Поведение отключения устройств MQTT в SDK Azure IoT

Пакеты SDK для устройств Интернета вещей Azure отключаются от Центра Интернета вещей, а затем повторно подключаются при обновлении токенов SAS по протоколу MQTT (и MQTT через WebSockets). В журналах это отображается как события информационного отключения и подключения устройства, которые иногда сопровождаются событиями ошибок.

По умолчанию срок действия маркера составляет 60 минут для всех пакетов SDK; однако разработчики могут изменить его в некоторых пакетах SDK. В следующей таблице приведены сведения о сроках существования токена, о продлении токена и о поведении при возобновлении токена для каждого из пакетов SDK.

SDK Срок существования токена Продление токена Поведение при возобновлении
.NET 60 минут, настраивается 85 % срока службы, настраиваемый Пакет SDK отключается и повторно подключается в течение срока действия токена плюс 10-минутный льготный период. Информационные события и ошибки, созданные в журналах.
Java 60 минут, настраивается 85 % срока существования, не настраивается Пакет SDK отключается и повторно подключается в течение срока действия токена плюс 10-минутный льготный период. Информационные события и ошибки, созданные в журналах.
Node.js 60 минут, настраивается настраиваемый Пакет SDK отключается и повторно подключается при обновлении токена. В журналах создаются только информационные события.
Python 60 минут, настраивается 120 секунд до истечения срока действия Пакет SDK отключается и повторно подключается в течение срока существования токена.

На следующих снимках экрана показано поведение обновления токена в журналах Azure Monitor для разных пакетов SDK. Срок существования токена и порога его обновления были изменены с настроек по умолчанию, как указано.

  • .NET SDK для устройств с продолжительностью действия токена 1200 секунд (20 минут) и обновлением на 90% от его срока действия. Отключение происходит каждые 30 минут:

    Скриншот, показывающий поведение ошибки при обновлении токена по протоколу MQTT в Azure Monitor Logs с .NET SDK.

  • Пакет Java SDK с временным интервалом действия токена 300 секунд (5 минут) и обновлением срока действия по умолчанию на 85 %. отключение происходит каждые 15 минут:

    Скриншот с проявлением ошибки для обновления токена через MQTT в логах Azure Monitor с использованием Java SDK.

  • Пакет Node SDK со сроком действия токена 300 секунд (5 минут), и обновление токена должно происходить через 3 минуты. Происходит отключение при обновлении токена. Кроме того, нет ошибок. Выдаются только информационные события подключения и отключения.

    Скриншот, отображающий поведение ошибки при обновлении токена через MQTT в журналах Azure Monitor с Node SDK.

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

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend parsed_json = parse_json(properties_s)
| extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId) , Protocol =  tostring(parsed_json.protocol)
| distinct TimeGenerated, OperationName, Level, ResultType, ResultDescription, DeviceId, Protocol, SDKVersion

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

Если вы отслеживаете подключения устройств с помощью Центров событий, убедитесь, что вы настроили систему таким образом, чтобы отфильтровывать периодические отключения из-за возобновления действия маркера SAS. Например, не запускайте действия на основе отключений, пока за событием отключения следует событие подключения в течение определенного периода времени.

Примечание.

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

400027 ConnectionForcefullyClosedOnNewConnection входит в журналы Центр Интернета вещей

Предложенные шаги не помогли устранить проблему

Если предыдущие действия не помогли, попробуйте следующее.