教程:使用 IoT 中心消息路由将设备数据发送到Azure 存储

使用 Azure IoT 中心的消息路由可将遥测数据从 IoT 设备发送到 Azure 服务,例如 Blob 存储、服务总线队列、服务总线主题和事件中心。 每个 IoT 中心都有一个与事件中心兼容的默认内置终结点(消息/事件)。 还可以通过定义路由查询来创建自定义终结点并将消息路由到其他 Azure 服务。 到达 IoT 中心的每个消息都会路由到其路由查询与消息匹配的所有终结点。 如果某条消息与任何定义的路由查询不匹配,它会被路由到默认终结点。

将在本教程中执行以下任务:

  • 创建 IoT 中心并向其中发送设备消息。
  • 创建存储帐户。
  • 为存储帐户创建自定义终结点,并从 IoT 中心将消息路由到该终结点。
  • 在存储帐户 Blob 中查看设备消息。

先决条件

  • Azure 订阅。 如果没有 Azure 订阅,可在开始前创建一个试用帐户

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

  • 本教程使用适用于 C# 的 Azure IoT SDK 中的示例代码。

    • 将 SDK 存储库下载或克隆到开发计算机。
    • 在开发计算机上具有 .NET Core 3.0.0 或更高版本。 通过运行 dotnet --version 来检查版本并在需要时下载 .NET
  • 确保已在防火墙中打开端口 8883。 本教程中的示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)

  • (可选)安装 Azure IoT 资源管理器。 此工具可帮助你在消息到达 IoT 中心时观察这些消息。 本文使用 Azure IoT 资源管理器。

Azure 门户没有其他先决条件。

注册设备并将消息发送到 IoT 中心

在 IoT 中心注册新设备。

  1. 登录 Azure 门户,导航到 IoT 中心。

  2. 从菜单的“设备管理”部分选择“设备”。

  3. 选择“添加设备”。

    Screenshot that shows adding a new device in the Azure portal.

  4. 提供设备 ID,然后选择“保存”。

  5. 新设备现在应处于设备列表中。 如果不在该列表中,请刷新页面。 选择设备 ID 以打开设备详细信息页面。

  6. 复制其中一个设备密钥并保存。 你将使用此值配置生成模拟设备遥测消息的示例代码。

    Screenshot that shows copying the primary key from the device details page.

现在你已获得设备 ID 和密钥,可使用示例代码开始将设备遥测消息发送到 IoT 中心。

提示

如果按照本教程的 Azure CLI 步骤进行操作,请在单独会话中运行示例代码。 这样便可以允许示例代码继续运行,同时执行其余 CLI 步骤。

  1. 如果尚未完成相应操作以作为先决条件的一部分,请立即从 GitHub 下载或克隆适用于 C# 的 Azure IoT SDK 存储库

  2. 从下载或克隆 SDK 的文件夹中,导航到 azure-iot-sdk-csharp\iothub\device\samples\how to guides\HubRoutingSample 文件夹。

  3. 安装 Azure IoT C# SDK 以及 HubRoutingSample.csproj 文件中指定的所需依赖项:

    dotnet restore
    
  4. 在所选编辑器中,打开 Parameters.cs 文件。 此文件显示该示例支持的参数。 运行示例时,本文中将仅使用 PrimaryConnectionString 参数。 查看此文件中的代码。 无需任何更改。

  5. 使用以下命令生成并运行示例代码:

    <myDevicePrimaryConnectionString> 替换为 IoT 中心设备中的主连接字符串。

    dotnet run --PrimaryConnectionString <myDevicePrimaryConnectionString>
    
  6. 随着消息发送到 IoT 中心,你应开始看到消息打印到输出。 在本教程中让该程序保持运行状态。

配置 IoT 资源管理器以查看消息

配置 IoT 资源管理器以连接到 IoT 中心,并在消息到达内置终结点时读取消息。

首先,检索 IoT 中心的连接字符串。

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

  2. 从菜单的“安全设置”部分选择“共享访问策略”。

  3. 选择“iothubowner”策略。

    Open the iothubowner shared access policy.

  4. 复制“主连接字符串”。

    Copy the iothubowner primary connection string.

现在,使用该连接字符串为 IoT 中心配置 IoT 资源管理器。

  1. 在开发计算机上打开 IoT 资源管理器。

  2. 选择“添加连接”。

    Screenshot that shows adding an IoT hub connection in IoT Explorer.

  3. 将中心的连接字符串粘贴到文本框中。

  4. 选择“保存”。

  5. 连接到 IoT 中心后,你应看到设备列表。 选择为本教程创建的设备 ID。

  6. 选择“遥测”。

  7. 在设备仍在运行的情况下选择“启动”。 如果你的设备未运行,则不会看到遥测数据。

    Start monitoring device telemetry in IoT Explorer.

  8. 你应看到来自设备的消息(最新消息显示在顶部)。

    View messages arriving at IoT hub on the built-in endpoint.

    观看传入消息片刻,以验证是否看到三种不同类型的消息:normal、storage 和 critical。 可以在看到相应信息后停止设备。

这些消息全都到达 IoT 中心的默认内置终结点。 在后续部分中,我们将创建自定义终结点,并基于消息属性将其中一些消息路由到存储。 这些消息将停止在 IoT 资源管理器中出现,因为消息仅在与 IoT 中心的任何其他路由不匹配时才会转到内置终结点。

设置消息路由

你将基于模拟设备附加到消息的属性将消息路由到不同资源。 未自定义路由的消息会发送到默认终结点(消息/事件)。

本教程的示例应用会向发送到 IoT 中心的每个消息分配 level 属性。 每个消息都随机分配有 normal、storage 或 critical 级别。

第一步是设置终结点,以便将数据路由到其中。 第二步是设置使用该终结点的消息路由。 设置路由后,可以在门户中查看终结点和消息路由。

创建存储帐户

创建一个 Azure 存储帐户并在该帐户中创建一个容器,该容器将保存路由到它的设备消息。

  1. 在 Azure 门户中,搜索“存储帐户”。

  2. 选择“创建”。

  3. 为存储帐户提供以下值:

    参数
    订阅 选择包含 IoT 中心的相同订阅。
    资源组 选择包含 IoT 中心的相同资源组。
    存储帐户名称 为存储帐户提供全局唯一的名称。
    性能 接受默认“标准”值。

    Screenshot that shows creating a storage account.

  4. 可以通过选择“查看 + 创建”来接受所有其他默认值。

  5. 验证完成后,选择“创建”。

  6. 部署完成后,选择“转到资源”。

  7. 在存储帐户菜单中,从“数据存储”部分选择“容器”。

  8. 选择“+ 容器”来新建容器。

    Screenshot that shows creating a storage container

  9. 为容器提供名称,然后选择“创建”。

路由到存储帐户

现在为存储帐户设置路由。 在此部分中,定义指向所创建的存储帐户的新终结点。 然后,创建一个筛选 level 属性设置为 storage 的消息的路由,并将这些消息路由到存储终结点。

注意

可将数据以 Apache Avro 格式(默认)或 JSON 格式写入 Blob 存储。

编码格式只能在配置 Blob 存储终结点时设置。 不能更改已设置的终结点的格式。 使用 JSON 编码时,必须在消息系统属性中将 contentType 设置为 JSON,将 contentEncoding 设置为 UTF-8。

若要更详细地了解如何使用 Blob 存储终结点,请参阅有关如何路由到存储的指南

  1. Azure 门户中,转到 IoT 中心。

  2. 在资源菜单中的“中心设置”下,选择“消息路由”,然后选择“添加”。

    Screenshot that shows location of the Add button, to add a new route in your IoT hub.

  3. 在“终结点”选项卡上,通过提供以下信息创建存储终结点:

    参数
    终结点类型 选择“存储”
    端点名称 提供此终结点的独一无二的名称。
    Azure 存储容器 选择“选取容器”。 按照提示选择在上一部分创建的存储帐户和容器。
    编码 选择“JSON”。 如果此字段灰显,则存储帐户区域不支持 JSON。 在这种情况下,继续使用默认“AVRO”。

    Screenshot that shows the Add a storage endpoint pane with the correct options selected.

  4. 接受其余参数的默认值,然后选择“创建 + 下一步”。

  5. 在“路由”选项卡上,提供以下信息以创建指向所创建的存储终结点的路由:

    参数
    名称 为路由创建名称。
    数据源 验证是否从下拉列表中选择了“设备遥测消息”。
    启用路由 验证此字段是否已选中。
    路由查询 输入 level="storage" 作为查询字符串。

    Screenshot that shows adding a route with a routing query.

  6. 选择“创建 + 跳过扩充”。

查看路由消息

在 IoT 中心中创建路由并启用后,它会立即开始将满足其查询条件的消息路由到存储终结点。

使用 IoT 资源管理器监视内置终结点

在开发计算机上返回到 IoT 资源管理器会话。 回想一下,IoT 资源管理器可监视 IoT 中心的内置终结点。 这意味着,现在应只看到未由我们创建的自定义路由进行路由的消息。

通过运行代码再次启动示例。 观看传入消息片刻,应只看到已 level 设置为 normalcritical 的消息。

在存储容器中查看消息

验证消息是否到达存储容器。

  1. Azure 门户中导航到存储帐户。

  2. 从菜单的“数据存储”部分选择“容器”。

  3. 选择为本教程创建的容器。

  4. 应有一个具有 IoT 中心名称的文件夹。 向下钻取文件结构,直至到达 .json 文件。

    Screenshot that shows finding routed messages in storage.

  5. 选择 JSON 文件,然后选择“下载”以下载 JSON 文件。 确认该文件包含来自你的设备的消息,并且这些消息的 level 属性已设置为 storage

  6. 停止运行示例。

清理资源

如果要移除用于本教程的所有 Azure 资源,请删除资源组。 此操作会一并删除组中包含的所有资源。 如果不想删除整个资源组,请使用 Azure 门户找到并删除各个资源。

如果打算继续学习下一教程,请保留你在此处创建的资源。

  1. 在 Azure 门户中,导航到包含本教程的 IoT 中心和存储帐户的资源组。
  2. 查看资源组中的所有资源,以确定要清理的资源。
    • 如果要删除所有资源,请选择“删除资源组”。
    • 如果只想删除某些资源,请使用每个资源名称旁的复选框选择要删除的资源。 然后选择“删除”。

后续步骤

本教程介绍了如何为 Azure 资源创建自定义终结点,然后创建路由以将设备消息发送到该终结点。 继续学习下一个教程,了解如何使用可用于简化下游处理的额外数据来扩充消息