通过使用事件网格来响应IoT 中心事件并触发操作

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

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

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

区域可用性

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

事件类型

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

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

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

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

设备连接状态事件的限制

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

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

设备连接状态间隔

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

处理事件的技巧

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

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

后续步骤