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

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

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

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

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

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

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

    Screenshot of the setup we'll create for this article. This setup shows how all services and devices are connected.

先决条件

  • 有效的 Azure Cosmos DB for NoSQL 帐户。

  • 数据库中的集合。

  • Azure 中的 IoT 中心。 如果尚未创建 Iot 中心,请参阅 IoT 中心入门中的演练。

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

  • Azure 订阅下的一个 IoT 中心。 请使用 Azure 门户创建一个。

创建逻辑应用

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

创建逻辑应用资源

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

    Screenshot of how to find and select a logic app in the Azure portal.

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

    • 你的订阅

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

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

    • 你的 IoT 中心所在的区域

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

    • “消耗”计划类型

      注意

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

    Screenshot of how to create a logic app in the Azure portal.

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

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

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

选择触发器

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

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

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

    Screenshot of how to find select HTTP request trigger.

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

    Screenshot of how to use a sample payload to generate a schema.

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

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

    [{
     "id": "fbfd8ee1-cf78-74c6-dbcf-e1c58638ccbd",
     "topic":
       "/SUBSCRIPTIONS/DEMO5CDD-8DAB-4CF4-9B2F-C22E8A755472/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"
    }]
    

    Screenshot of the sample JSON payload pasted into the text box in Azure.

创建条件

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

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

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

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

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

    • 保留“等于”值。

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

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

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

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

      Screenshot of the full For Each condition.

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

    Screenshot of the 'If true' box in Azure.

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

    Screenshot of the search for Azure Cosmos DB.

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

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

    数据库 ID:ToDoList

    集合 ID:Items

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

    Screenshot shows an Execute stored procedure (V3) item with 'Add new parameter' selected.

  7. 保存逻辑应用。

复制 HTTP URL

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

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

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

    Screenshot of where to find the HTTP URL to copy.

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

为 IoT 中心事件配置订阅

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

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

  2. 选择“事件”。

    Screenshot of where the Events button is located in the IoT Hub menu.

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

    Create new event subscription

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

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

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

    Set event types to look for

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

    Select endpoint url

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

    Screenshot of the form to create an event subscription.

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

    重要

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

    Screenshot of an IoT Hub error that says it's not in an active state.

运行设备并观察事件

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

在 IoT 中心注册设备

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

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

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

  4. 选择“保存”。

    Screenshot of location of the Add Device button.

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

    Screenshot of location of the Primary Connection String for your device.

启动 Raspberry Pi 模拟器

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

启动 Raspberry Pi 模拟器

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

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

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

    Screenshot of where to add your primary connection string in the Raspberry Pi script.

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

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

    Screenshot of what to expect in your output console when you run the Raspberry Pi.

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

    Screenshot of the status updates on your logic app Overview page.

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

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

在 Azure Cosmos DB 中观察事件

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

Screenshot of the newly generated connection state event in a Cosmos DB collection.

使用 Azure CLI

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

清理资源

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

逻辑应用

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

  1. 导航到逻辑应用。

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

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

IoT 中心或事件网格

  1. 导航到 IoT 中心。

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

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

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

Cosmos DB

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

后续步骤