使用事件网格来触发操作以响应物联网中心事件

通过将 Azure IoT 中心与 Azure 事件网格进行集成,使你可以向其他服务发送事件通知,并触发下游流程。 将商业应用程序配置为侦听 IoT 中心事件,以便能够以可靠、可缩放且安全的方式对关键事件作出反应。 例如,生成一个应用程序来更新数据库、创建工作票证,并在每当有新的 IoT 设备注册到 IoT 中心时,发送一封电子邮件通知。

Azure 事件网格 是一种完全托管的事件路由服务,它使用发布-订阅模型。 事件网格包含对 Azure 服务(如 Azure FunctionsAzure 逻辑应用)的内置支持,还可使用 Webhook 向非 Azure 服务传递事件警报。 有关事件网格支持的事件处理程序的完整列表,请参阅什么是 Azure 事件网格?

显示 Azure 事件网格架构的架构图。

区域可用性

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

事件类型

IoT 中心将发布以下事件类型:

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

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

事件架构

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

设备已连接架构

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

[{  
  "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 中心将以 base 64 编码格式写入消息。

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

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

[{  
  "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 中心作为事件网格源

筛选事件

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

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

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

设备连接状态事件的限制

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

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

设备连接状态间隔

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

使用事件的提示

处理 IoT 中心事件的应用程序应遵循以下建议的操作:

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

后续步骤