监视、诊断和排查 Azure IoT 中心设备连接问题

由于存在许多可能的故障点,IoT 设备的连接问题有时很难排查。 应用程序逻辑、物理网络、协议、硬件、IoT 中心和其他云服务都可能导致问题。 检测和查明问题根源的能力至关重要。 但是,大规模的 IoT 解决方案可能有数千台设备,因此,手动检查各个设备是不切实际的。 IoT 中心集成了两项 Azure 服务以提供帮助:

  • Azure Monitor:使用 Azure Monitor 可以从 IoT 中心收集遥测数据并对其进行分析和处理。 为了帮助你大规模检测、诊断和排查这些问题,请使用 IoT 中心通过 Azure Monitor 提供的监视功能。 此方法包括设置警报以在连接断开时触发通知和操作,并包括配置日志以便用于查明导致连接断开的情况。

  • Azure 事件网格 - 对于关键基础结构和每设备断开连接,请使用 Azure 事件网格来订阅 IoT 中心发出的设备连接和断开连接事件。 借助 Azure 事件网格,可以使用以下任何事件处理程序:

    • Azure Functions
    • 逻辑应用
    • Azure 自动化
    • WebHook
    • 队列存储
    • 混合连接
    • 事件中心

事件网格与Azure Monitor

事件网格提供了一个低延迟、每设备监视解决方案,可用于跟踪关键设备和基础结构的设备连接。 Azure Monitor 提供了一个名为“连接的设备数”的指标,可用于监视连接到 IoT 中心的设备数,并在连接的设备数低于静态阈值时触发警报。

决定对特定方案使用事件网格还是 Azure Monitor 时,请考虑以下问题:

  • 警报延迟:通过事件网格传递 IoT 中心连接事件的速度要快得多。 对于需要快速通知的方案,这一事实使得事件网格成为更好的选择。

  • 每设备通知:事件网格提供了跟踪各个设备的连接和断开连接的功能。 对于需要监视关键设备的连接的方案,这一事实使得事件网格成为更好的选择。

  • 轻型设置:Azure Monitor 指标警报提供了一种轻型设置体验,无需与其他服务集成即可通过电子邮件、短信、语音和其他通知传递通知。 使用事件网格,需要与其他 Azure 服务集成才能传递通知。 这两项服务都可与其他服务集成来触发更复杂的操作。

事件网格:监视连接和断开连接事件

若要监视生产环境中的设备连接和断开连接事件,我们建议订阅事件网格中的 DeviceConnected 和 DeviceDisconnected 事件以触发警报并监视设备连接状态 。 与 Azure Monitor 相比,事件网格的事件延迟较低,并且可以按设备进行监视。 这些因素使事件网格成为监视关键设备和基础结构的首选方法。

使用事件网格监视或触发有关设备断开连接的警报时,请确保在使用 Azure IoT SDK 的设备上以筛选掉定期断开连接(SAS 令牌续订所导致)的方式进行生成。 若要了解详细信息,请参阅 Azure IoT SDK 的 MQTT 设备断开连接行为

浏览以下文章,详细了解如何使用事件网格监视设备连接事件:

Azure Monitor:使用日志解决连接错误

使用 Azure Monitor 指标警报或事件网格检测到设备断开连接时,可以使用日志来帮助排查原因。 本部分介绍了如何在 Azure Monitor 日志中查找常见问题。 以下步骤假定你已创建可将 IoT 中心连接日志发送到 Log Analytics 工作区的诊断设置

创建可将 IoT 中心资源日志发送到 Azure Monitor 日志的诊断设置后,请按照以下步骤在 Azure 门户中查看日志。

  1. Azure 门户中导航到 IoT 中心。

  2. 在 IoT 中心左侧窗格中的“监视”下,选择“日志” 。

  3. 若要隔离 IoT 中心的连接错误日志,请在查询编辑器中输入以下查询,然后选择“运行”:

    AzureDiagnostics
    | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. 如果返回了结果,请查看 OperationNameResultType(错误代码)和 ResultDescription(错误消息),以获取更多详细信息。

    错误日志示例

使用以下问题解决指南来帮助解决最常见的错误:

Azure Monitor:使用日志监视特定设备的连接

在某些情况下,你可能想要使用 Azure Monitor 查看特定设备的连接错误和信息。 若要隔离设备的连接事件,可以执行上一部分中的相同步骤,但输入以下查询。 将 test-device 替换为设备的名称。

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

该查询将返回目标设备的错误和信息性事件。 以下示例输出显示了信息性 deviceConnect 事件:

日志中 deviceConnect 事件的屏幕截图。

Azure IoT SDK 的 MQTT 设备断开连接行为

Azure IoT 设备 SDK 与 IoT 中心断开连接,然后在通过 MQTT(以及基于 WebSocket 的 MQTT)协议续订 SAS 令牌时重新连接。 在日志中,这将显示为信息性设备断开连接和连接事件,有时还伴随错误事件。

默认情况下,所有 SDK 的令牌有效期为 60 分钟;但是在某些 SDK 中,其令牌有效期可由开发人员进行更改。 下表总结了各个 SDK 的令牌有效期、令牌续订和令牌续订行为:

SDK 令牌生存期 令牌续订 续订行为
.NET 60 分钟,可配置 85% 的有效期,可配置 在令牌有效期结束并加上 10 分钟宽限期后,SDK 将断开连接,再重新连接。 信息性事件和错误在日志中生成。
Java 60 分钟,可配置 85% 的有效期,不可配置 在令牌有效期结束并加上 10 分钟宽限期后,SDK 将断开连接,再重新连接。 信息性事件和错误在日志中生成。
Node.js 60 分钟,可配置 可配置 在令牌续订时,SDK 将断开连接,再重新连接。 日志中仅生成信息性事件。
Python 60 分钟,可配置 过期前的 120 秒 在令牌有效期结束时,SDK 将断开连接,再重新连接。

以下屏幕截图显示不同 SDK 的 Azure Monitor 日志中的令牌续订行为。 如前所述,令牌有效期和续订阈值已更改了默认值。

  • .NET 设备 SDK 的令牌有效期为 1200 秒(20 分钟),其续订设置在 90% 的有效期时进行。 每隔 30 分钟断开连接一次:

    .NET SDK 的 Azure Monitor 日志中通过 MQTT 的令牌续订的错误行为。

  • Java SDK,令牌生存期为 300 秒(5 分钟),续订默认为生存期的 85%。 每隔 15 分钟断开连接一次:

    Java SDK 的 Azure Monitor 日志中通过 MQTT 的令牌续订的错误行为。

  • 节点 SDK,其令牌生存期为 300 秒(5 分钟),令牌续订设置为 3 分钟。 令牌续订时会断开连接。 此外不会发生其他错误。 仅发出信息性连接/断开连接事件:

    Node SDK 的 Azure Monitor 日志中通过 MQTT 的令牌续订的错误行为。

使用以下查询收集结果。 查询会从属性包中提取 SDK 名称和版本。 有关详细信息,请参阅 IoT 中心日志中的 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

作为 IoT 解决方案开发人员或操作员,需要注意此行为,以便解释连接/断开连接事件以及日志中的相关错误。 如果要更改设备的令牌有效期或续订行为,请检查设备是否实施了相应的设备孪生设置或设备方法来使这种更改成为可能。

如果使用事件中心监视设备连接,请确保以筛选出定期断开连接(SAS 令牌续订所导致)的方式进行生成。 例如,只要在发生断开连接事件后,接着在特定时间范围内发生连接事件,就不要基于断开连接来触发操作。

注意

IoT 中心仅支持每个设备一个活动 MQTT 连接。 代表相同设备 ID 的任何新 MQTT 连接都会导致 IoT 中心删除现有连接。

400027 ConnectionForcefullyClosedOnNewConnection 将记录到 IoT 中心日志中

我尝试了这些步骤,但没有奏效

如果前面的步骤没有帮助,可尝试以下操作:

后续步骤