使用 Azure Cosmos DB 将来自 Azure IoT 中心的设备连接事件排序

借助 Azure 事件网格,可以生成基于事件的应用程序,并轻松地在业务解决方案中集成 IoT 事件。 本文将指导你完成一项使用 Cosmos DB、逻辑应用、IoT 中心事件和模拟 Raspberry Pi 的设置,以收集和存储设备连接与断开连接事件。

从设备运行的那一刻起,就会激活以下操作顺序:

  1. 启动然后停止使用 IoT 中心设备密钥的 Pi 设备

  2. IoT 中心事件捕获设备活动,然后向逻辑应用发送 HTTP 请求

  3. 逻辑应用根据设置的条件处理 HTTP 请求

  4. 逻辑应用将连接或断开连接事件记录到 Cosmos DB 上的新文档中

    我们将为本文创建的设置的屏幕截图。此设置显示所有服务和设备的连接方式。

先决条件

  • 有效的 Azure Cosmos DB for NoSQL 帐户。 如果尚未创建此帐户,请参阅创建数据库帐户中的演练。

  • 数据库中的集合。 请参阅添加集合中的演练。 创建集合时,请对分区键使用 /id

  • Azure 订阅。 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户

  • Azure 订阅中的 IoT 中心。 如果还没有中心,则可以按照创建 IoT 中心中的步骤进行操作。

创建逻辑应用

让我们创建一个逻辑应用并添加事件网格触发器,以便监视虚拟机的资源组。

创建逻辑应用资源

  1. Azure 门户中,依次选择“+创建资源”、“集成”、“逻辑应用”。

    如何在 Azure 门户中查找和选择逻辑应用的屏幕截图。

  2. 填写窗体以创建新的逻辑应用,其中包括:

    • 你的订阅

    • 你的资源组(或新建一个)

    • 在你的订阅中唯一的逻辑应用名称

    • 你的 IoT 中心所在的区域

    • 是否启用 Log Analytics 的“否”选项

    • “消耗”计划类型

      注意

      “消耗”计划类型是用于在 UI 中启用“逻辑应用设计器”的选项。 如果选择“标准”(默认设置),则必须创建一个新的工作流才能使“逻辑应用设计器”可用。

    如何在 Azure 门户中创建逻辑应用的屏幕截图。

  3. 选择“查看 + 创建”以查看配置,然后选择“创建”以创建逻辑应用。

  4. 你现在已为逻辑应用程序创建 Azure 资源。 在 Azure 部署逻辑应用后,选择“转到资源”。 “逻辑应用设计器”会显示常用模式的模板,以便你可以更快地开始操作。

  5. 在“逻辑应用设计器”中滚动到“模板”部分,然后选择“空白逻辑应用”,这样就可以从头开始生成逻辑应用。

选择触发器

触发器是启动逻辑应用的特定事件。 在本教程中,触发工作流的触发器通过 HTTP 接收请求。

  1. 在连接器和触发器搜索栏中,键入 HTTP 并按 Enter。

  2. 选择请求“当收到 HTTP 请求时”作为触发器。

    如何查找和选择 HTTP 请求触发器的屏幕截图。

  3. 选择“使用示例有效负载生成架构”。

    如何使用示例有效负载生成架构的屏幕截图。

  4. 在文本框中粘贴以下示例 JSON 代码,然后选择“完成”。

    此 JSON 仅用作模板,因此确切的值并不重要。

    [{
     "id": "fbfd8ee1-cf78-74c6-dbcf-e1c58638ccbd",
     "topic":
       "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/EGTESTRG/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/MYIOTHUB",
     "subject": "devices/Demo-Device-1",
     "eventType": "Microsoft.Devices.DeviceConnected",
     "eventTime": "2018-07-03T23:20:11.6921933+00:00",
     "data": {
       "deviceConnectionStateEventInfo": {
         "sequenceNumber":
           "000000000000000001D4132452F67CE200000002000000000000000000000001"
       },
       "hubName": "MYIOTHUB",
       "deviceId": "48e44e11-1437-4907-83b1-4a8d7e89859e",
       "moduleId": ""
     },
     "dataVersion": "1",
     "metadataVersion": "1"
    }]
    

    粘贴到 Azure 上的文本框中的示例 JSON 有效负载的屏幕截图。

创建条件

在满足特定的条件后,该条件可帮助运行特定的操作。 在本文中,条件是检查 eventType 是设备已连接还是设备已断开连接。 当 eventType 为 true 时执行的操作是在 Azure Cosmos DB 中创建文档。 此条件是在“逻辑应用设计器”中创建的。

  1. 选择“+ 新建步骤”,选择“内置”选项卡,然后找到并选择名为“条件”的控件。

  2. 在条件中,将“和”更改为“或”,因为我们要在单次分析中捕获连接事件或断开连接事件。

  3. 在“选择值”框中进行选择,此时会出现一个弹出窗口,其中显示了可选择的字段“动态内容”。

    • 选择“eventType”。 弹出窗口随即关闭,你会看到“正文”已自动放置到“选择先前步骤的输出”中。 选择“条件”重新打开条件语句。

    • 保留“等于”值。

    • 键入“Microsoft.Devices.DeviceConnected”作为该行的最后一个值。

    • 选择“+ 添加”以添加另一行。

    • 这第二行与第一行类似,只不过我们会通过它来查找断开连接事件。

      使用“eventType”、“等于”和“Microsoft.Devices.DeviceDisconnected”作为行值。

      完整的 For Each 条件的屏幕截图。

  4. 在“如果为 true”对话框中,单击“添加操作”。

    Azure 中“If true”框的屏幕截图。

  5. 搜索 Cosmos DB 并选择“Azure Cosmos DB — 创建或更新文档(V3)”

    搜索 Azure Cosmos DB 的屏幕截图。

  6. 你会看到“创建或更新文档(V3)”面板。 在字段中输入以下值:

    Azure Cosmos DB 帐户名称:{添加你的帐户名称}

    数据库 ID:ToDoList

    集合 ID:Items

    文档:从动态内容参数列表中选择 Current item

    屏幕截图显示了“执行存储过程(V3)”项,其中已选择“添加新参数”。

  7. 保存逻辑应用。

复制 HTTP URL

在退出逻辑应用设计器之前,请复制逻辑应用要侦听的触发器 URL。 稍后要使用此 URL 来配置事件网格。

  1. 选择“当收到 HTTP 请求时”触发器配置框将其展开。

  2. 选择“HTTP POST URL”旁边的复制按钮复制其值。

    在何处查找要复制的 HTTP URL 的屏幕截图。

  3. 保存此 URL,以便在下一部分使用。

为 IoT 中心事件配置订阅

本部分将 IoT 中心配置为在发生事件时发布事件。

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

  2. 选择“事件”。

    “事件”按钮在 IoT 中心菜单中的位置的屏幕截图。

  3. 选择“+ 事件订阅”。

    创建新的事件订阅

  4. 填写“事件订阅详细信息”:提供一个描述性的“名称”,然后选择“事件网格架构”作为“事件架构”。

  5. 为 IoT 中心资源创建“系统主题名称”。

  6. 填写“事件类型”字段。 在下拉列表中,从菜单中仅选择“设备已连接”和“设备已断开连接”。 单击屏幕上的任何其他位置以关闭列表并保存选择。

    设置要查找的事件类型

  7. 对于“终结点详细信息”,请选择“Webhook”作为“终结点类型”,单击“选择终结点”并粘贴从逻辑应用中复制的 URL,然后确认选择。

    选择终结点 URL

  8. 窗体现在应类似于以下示例:

    用于创建事件订阅的窗体的屏幕截图。

    选择“创建”保存事件订阅。

    重要

    在运行设备之前,请等待几分钟让事件处理完成。 每次创建或更改 Azure 服务后,过早启动管道中的下一步骤可能会导致无谓的错误。 例如,如果 IoT 中心不处于活动状态,则它就不会准备好接收事件。 查看 IoT 中心“概述”页以确定 IoT 中心是否处于活动状态。 如果不处于活动状态,页面顶部会显示警告。

    指出不处于活动状态的 IoT 中心错误的屏幕截图。

运行设备并观察事件

设置事件订阅后,让我们通过连接设备进行测试。

在 IoT 中心注册设备

  1. 在 IoT 中心选择“设备”。

  2. 在窗格顶部选择“+ 添加设备”。

  3. 对于“设备 ID”,请输入 Demo-Device-1

  4. 选择“保存”。

    “添加设备”按钮位置的屏幕截图。

  5. 再次单击该设备;现在将会填入连接字符串和密钥。 复制并保存“主连接字符串”供稍后使用。

    设备的主连接字符串位置的屏幕截图。

启动 Raspberry Pi 模拟器

让我们使用 Raspberry Pi Web 模拟器来模拟设备连接。

启动 Raspberry Pi 模拟器

在 Raspberry Pi Web 模拟器上运行示例应用程序

此示例应用将触发设备已连接事件。

  1. 在代码区域中,将第 15 行中的占位符替换为在上一部分结束时保存的 Azure IoT 中心设备连接字符串。

    在 Raspberry Pi 脚本中添加主连接字符串的位置的屏幕截图。

  2. 选择“运行”以运行该应用程序。

    此时会显示类似于以下输出的信息,其中显示了传感器数据以及发送到 IoT 中心的消息。

    运行 Raspberry Pi 时输出控制台中预期显示的内容的屏幕截图。

  3. 可以查看逻辑应用“概述”页来检查是否已触发你的逻辑。 该页将显示“成功”或“失败”。 如果需要进行故障排除,可以查看此页来了解逻辑应用状态。 触发器开始运行后,预期会出现 15-30 秒的延迟。 如果需要对逻辑应用进行故障排除,请查看这篇排查错误文章。

    逻辑应用“概述”页上的状态更新的屏幕截图。

  4. 选择“停止”以停止模拟器,这会触发“设备已断开连接”事件。 与连接事件一样,此事件也会记录到逻辑应用“概述”页。

现已运行一个示例应用程序来收集设备的连接和断开连接事件,这些事件将发送到 IoT 中心。

在 Azure Cosmos DB 中观察事件

可以在 Cosmos DB 文档中查看执行的逻辑应用的结果。 刷新页面时,该文档会显示在“项”集合中。 每个连接状态事件会生成一个分配有唯一 id 的新文档。 下图显示了启动(连接)设备时创建的文档。 JSON 输出中列出了已连接事件类型。

Cosmos DB 集合中新生成的连接状态事件的屏幕截图。

使用 Azure CLI

如果不使用 Azure 门户,也可以使用 Azure CLI 来完成 IoT 中心相关的步骤。 有关详细信息,请参阅有关使用 Azure CLI 创建事件订阅创建 IoT 设备的网页。

清理资源

本教程使用的资源会在 Azure 订阅中产生费用。 学习完本教程并测试结果后,请禁用或删除不再想要保留的资源。

逻辑应用

如果不希望丢弃针对逻辑应用所执行的操作,可以禁用逻辑应用,但不要将其删除。

  1. 导航到逻辑应用。

  2. 在“概述”边栏选项卡上,选择“删除”或“禁用”。

    每个订阅可以包含一个免费 IoT 中心。 如果在本教程中创建了一个免费中心,则不需要将其删除,以免产生费用。

IoT 中心或事件网格

  1. 导航到 IoT 中心。

  2. 在“概览”边栏选项卡上,选择“删除”。

  3. 即使保留了 IoT 中心中,你也仍可能想要删除创建的事件订阅。 在 IoT 中心,选择“事件网格”。

  4. 选择要删除的事件订阅,然后选择“删除”。

Cosmos DB

若要从 Azure 门户中删除 Azure Cosmos DB 帐户,请转到你的资源,然后在顶部菜单栏中选择“删除帐户”。 参阅有关删除 Azure Cosmos DB 帐户的详细说明。

后续步骤