Compartilhar via

使用事件网格触发操作以响应IoT Hub事件

Azure IoT Hub与Azure Event Grid集成,以便你可以将事件通知发送到其他服务并触发下游进程。 将业务应用程序配置为侦听IoT Hub事件,以便能够以可靠、可缩放且安全的方式对关键事件做出响应。 例如,生成一个应用程序,用于更新数据库、创建工作票证,并在每次将新的 IoT 设备注册到IoT hub时发送电子邮件通知。

Azure Event Grid是使用发布-订阅模型的完全托管事件路由服务。 事件网格内置支持 Azure 服务,例如 Azure FunctionsAzure Logic Apps,并且可以使用 Webhook 将事件警报传送到非Azure服务。 有关事件网格支持的事件处理程序的完整列表,请参阅 什么是 Azure Event Grid?

展示 Azure Event Grid 架构的图示。

区域可用性

事件网格集成适用于支持事件网格的区域中的 IoT 中心。 有关区域的最新列表,请参阅按区域提供的产品

事件类型

IoT Hub发布以下事件类型:

事件类型 DESCRIPTION
Microsoft.Devices.DeviceCreated 当设备注册到物联网中心时发布。
Microsoft.Devices.DeviceDeleted 从IoT中心中删除某个设备时进行发布。
Microsoft.Devices.DeviceConnected 当设备连接到IoT hub时发布。
Microsoft.Devices.DeviceDisconnected 当设备与IoT hub断开连接时发布。
Microsoft.Devices.DeviceTelemetry 当设备遥测消息发送到IoT中心时发布

使用Azure portal或Azure CLI来配置要从每个IoT hub发布的事件。 例如,请尝试本教程使用事件网格和逻辑应用发送有关Azure IoT Hub事件的电子邮件通知

事件架构

IoT Hub事件包含响应设备生命周期中更改所需的所有信息。 可以通过检查 eventType 属性是否以 Microsoft.Devices0 开头来标识IoT Hub事件。 有关如何使用事件网格事件属性的详细信息,请参阅 Azure Event Grid 事件架构

设备连接架构

以下示例显示了设备已连接事件的架构:

[{  
  "id": "f6bbf8f4-d365-520d-a878-17bf7238abd8",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceConnected",
  "eventTime": "2018-06-02T19:17:44.4383997Z",
  "data": {
      "deviceConnectionStateEventInfo": {
        "sequenceNumber":
          "000000000000000001D4132452F67CE200000002000000000000000000000001"
      },
    "hubName": "egtesthub1",
    "deviceId": "LogicAppTestDevice",
    "moduleId" : "DeviceModuleID",
  }, 
  "dataVersion": "1",
  "metadataVersion": "1"
}]

设备遥测架构

设备遥测消息必须采用有效的 JSON 格式,其中 contentType 设置为 application/json,并且消息系统属性中 contentEncoding 设置为 UTF-8。 这两个属性都不区分大小写。 如果未设置内容编码,则IoT Hub以 base 64 编码格式写入消息。

可以通过选择终结点作为事件网格来扩充设备遥测事件,然后再将其发布到事件网格。 有关详细信息,请参阅设备到云 IoT Hub 消息的消息扩展

以下示例显示了设备遥测事件的架构:

[{  
  "id": "9af86784-8d40-fe2g-8b2a-bab65e106785",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceTelemetry",
  "eventTime": "2019-01-07T20:58:30.48Z",
  "data": {
      "body": {
          "Weather": {
              "Temperature": 900
            },
            "Location": "USA"
        },
        "properties": {
            "Status": "Active"
        },
        "systemProperties": {
          "iothub-content-type": "application/json",
          "iothub-content-encoding": "utf-8",
          "iothub-connection-device-id": "d1",
          "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
          "iothub-connection-auth-generation-id": "123455432199234570",
          "iothub-enqueuedtime": "2019-01-07T20:58:30.48Z",
          "iothub-message-source": "Telemetry"
        }
  },
  "dataVersion": "",
  "metadataVersion": "1"
}]

由设备创建的架构

以下示例显示了设备创建事件的架构:

[{
  "id": "56afc886-767b-d359-d59e-0da7877166b2",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceCreated",
  "eventTime": "2018-01-02T19:17:44.4383997Z",
  "data": {
    "twin": {
      "deviceId": "LogicAppTestDevice",
      "etag": "AAAAAAAAAAE=",
      "deviceEtag":"null",
      "status": "enabled",
      "statusUpdateTime": "0001-01-01T00:00:00",
      "connectionState": "Disconnected",
      "lastActivityTime": "0001-01-01T00:00:00",
      "cloudToDeviceMessageCount": 0,
      "authenticationType": "sas",
      "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
      },
      "version": 2,
      "properties": {
        "desired": {
          "$metadata": {
            "$lastUpdated": "2018-01-02T19:17:44.4383997Z"
          },
          "$version": 1
        },
        "reported": {
          "$metadata": {
            "$lastUpdated": "2018-01-02T19:17:44.4383997Z"
          },
          "$version": 1
        }
      }
    },
    "hubName": "egtesthub1",
    "deviceId": "LogicAppTestDevice"
  },
  "dataVersion": "1",
  "metadataVersion": "1"
}]

警告

与设备创建事件关联的孪生数据是默认配置,不应依赖于新创建的设备中的实际authenticationType设备和其他设备属性。 对于新创建的设备中的 authenticationType 和其他设备属性,请使用Azure IoT SDK 中提供的注册管理器 API。

有关每个属性的详细说明,请参阅Azure IoT Hub作为事件网格源

筛选事件

事件 网格支持对 事件类型、主题和数据内容进行筛选。 创建事件网格订阅时,可以选择订阅所选择的 IoT 事件。

  • 事件类型:有关IoT Hub事件类型的列表,请参阅 Event 类型
  • 主题:对于IoT Hub事件,主题是设备名称。 主题采用格式 devices/{deviceId}。 可以根据 “以开头 ”(前缀)和 “结尾 ”(后缀)匹配来筛选主题。 该筛选器使用 AND 运算符,以便将主题同时符合前缀和后缀条件的事件传送给订阅方。
  • 数据内容:IoT Hub使用消息格式填充数据内容。 可以根据遥测消息的内容选择传递的事件。 有关示例,请参阅 高级筛选。 若要筛选遥测消息正文,必须将 contentType 设置为 application/json,并将消息系统属性中的 contentEncoding 设置为 UTF-8。 这两个属性都不区分大小写。

对于设备遥测事件,IoT Hub 基于订阅创建默认的消息路由 RouteToEventGrid。 若要在发送遥测数据之前筛选消息,请更新 路由查询

设备连接状态事件的限制

设备通过 MQTT 或 AMQP 协议,或通过 WebSockets 上的这两种协议之一连接时,可以使用设备连接和设备断开事件。 仅使用 HTTPS 发出的请求不会触发设备连接状态通知。

有关使用事件网格监视设备状态的详细信息,请参阅 “监视设备连接状态”。

设备连接状态间隔

IoT Hub尝试报告每个设备连接状态更改事件,但有些可能会错过。 IoT Hub至多每隔60秒报告一次连接状态更改事件。 此行为可能会导致结果,例如报告了多个设备连接事件,且它们之间没有设备断开连接事件。

处理事件的技巧

处理IoT Hub事件的应用程序应遵循以下建议的做法:

  • 可以配置多个订阅将事件路由至同一事件处理程序,因此不可假定事件均来自某个特定的源。 请始终检查消息主题,以确保它来自预期的IoT hub。
  • 请勿假定所接收的事件均为预期的类型。 在处理消息前,总是先检查 eventType。
  • 消息可能不按顺序到达,或者延迟达到。 使用 etag 字段判断有关对象的信息是否在设备创建或删除事件中是最新的。

后续步骤