您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

教程:使用 Azure CLI 和 Azure 门户配置 IoT 中心消息路由

消息路由能够将遥测数据从 IoT 设备发送到内置的与事件中心兼容的终结点或自定义终结点,例如,Blob 存储、服务总线队列、服务总线主题和事件中心。 若要配置自定义消息路由,请创建路由查询来自定义与特定条件匹配的路由。 设置完成后,引入的数据将通过 IoT 中心自动路由到终结点。 如果某条消息与任何定义的路由查询不匹配,它会被路由到默认终结点。

本教程包括 2 个部分,介绍如何通过 IoT 中心设置和使用这些自定义路由查询。 将消息从 IoT 设备路由到多个终结点中的一个,包括 Blob 存储和服务总线队列。 路由到服务总线队列的消息将由逻辑应用拾取,并通过电子邮件发送。 未定义自定义消息路由的消息将发送到默认终结点,然后由 Azure 流分析拾取,可在 Power BI 中直观查看。

若要完成本教程的第 1 和第 2 部分,请执行以下任务:

第 I 部分:创建资源并设置消息路由

  • 创建资源 - IoT 中心、存储帐户、服务总线队列和模拟设备。 使用 Azure 门户、Azure 资源管理器模板、Azure CLI 或 Azure PowerShell 即可完成此操作。
  • 在 IoT 中心为存储帐户和服务总线队列配置终结点和消息路由。

第 II 部分:将消息发送到中心并查看路由的结果

  • 创建一个逻辑应用,该应用将在消息添加到服务总线队列时触发,并发送电子邮件。
  • 下载并运行应用,该应用模拟 IoT 设备将消息发送到中心,以获得不同的路由选择。
  • 为发送至默认终结点的数据创建 Power BI 可视化。
  • 查看结果...
  • ...在服务总线队列和电子邮件中。
  • ...在存储帐户中。
  • ...在 Power BI 可视化中。

先决条件

  • 对于本教程的第 1 部分:

    • 必须拥有 Azure 订阅。 如果没有 Azure 订阅,请在开始之前创建一个免费帐户
  • 对于本教程的第 2 部分:

    • 必须事先完成本教程的第 1 部分,并保留一些可用的资源。
    • 安装 Visual Studio
    • 有权访问用于分析默认终结点的流分析的 Power BI 帐户。 (免费试用 Power BI。)
    • 提供一个用于发送通知电子邮件的工作或学校帐户。
    • 确保已在防火墙中打开端口 8883。 本教程中的示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)

使用 Azure Cloud Shell

Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。 可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。 可以使用 Azure Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。

若要启动 Azure Cloud Shell,请执行以下操作:

选项 示例/链接
选择代码块右上角的“试用”。 选择“试用”不会自动将代码复制到 Cloud Shell。 Azure Cloud Shell 的“试用”示例
转到 https://shell.azure.com 或选择“启动 Cloud Shell”按钮可在浏览器中打开 Cloud Shell。 在新窗口中启动 Cloud Shell
选择 Azure 门户右上角菜单栏上的 Cloud Shell 按钮。 Azure 门户中的“Cloud Shell”按钮

若要在 Azure Cloud Shell 中运行本文中的代码,请执行以下操作:

  1. 启动 Cloud Shell。

  2. 选择代码块上的“复制”按钮以复制代码。

  3. 在 Windows 和 Linux 上选择 Ctrl+Shift+V 将代码粘贴到 Cloud Shell 会话中,或在 macOS 上选择 Cmd+Shift+V 将代码粘贴到 Cloud Shell 会话中。

  4. 选择 Enter 运行此代码。

创建基础资源

在配置消息路由之前,需创建 IoT 中心、存储帐户和服务总线队列。 可以参阅适用于本教程第 1 部分的四篇文章中的一篇来创建这些资源:Azure门户、Azure 资源管理器模板、Azure CLI 或 Azure PowerShell。

为所有资源使用相同的资源组和位置。 在本教程结束后,可以通过删除资源组一次性删除所有资源。

下面是将在以下部分中执行的步骤摘要:

  1. 创建资源组

  2. 在 S1 层级中创建 IoT 中心。 将使用者组添加到 IoT 中心。 检索数据时,Azure 流分析使用使用者组。

    备注

    必须使用付费层中的 IoT 中心来完成本教程。 免费层只允许设置一个终结点,但本教程需要多个终结点。

  3. 使用 Standard_LRS 副本创建标准 V1 存储帐户。

  4. 创建服务总线命名空间和队列。

  5. 为发送消息到中心的模拟设备创建设备标识。 保存测试阶段的密钥。 (如果创建资源管理器模板,则会在部署模板后执行此操作。)

使用 Azure CLI 创建基本资源

本教程使用 Azure CLI 创建基本资源,然后使用 Azure 门户来演示如何配置消息路由和设置虚拟设备用于测试。

复制以下脚本并将其粘贴到 Cloud Shell,然后按 Enter。 系统每次运行脚本中的一行。 此脚本将创建本教程所需的基本资源,包括存储帐户、IoT 中心、服务总线命名空间和服务总线队列。

有几个资源名称必须全局唯一,例如 IoT 中心名称和存储帐户名称。 为方便进行标识,这些资源名称的后面追加了名为 randomValue 的随机字母数字值。 randomValue 在脚本的顶部生成一次,并根据需要追加到整个脚本中的资源名称。 如果不想要使用随机后缀,可将其设置为空字符串或特定值。

提示

有关调试的提示:此脚本使用续接符号(反斜杠 \),使脚本更方便阅读。 如果在运行脚本时遇到问题,请确保 Cloud Shell 会话正在运行 bash,并且所有反斜杠后面都没有空格。

# This retrieves the subscription id of the account 
#   in which you're logged in.
# This field is used to set up the routing queries.
subscriptionID=$(az account show --query id)

# Concatenate this number onto the resources that have to be globally unique.
# You can set this to "" or to a specific value if you don't want it to be random.
# This retrieves a random value.
randomValue=$RANDOM

# Set the values for the resource names that 
#   don't have to be globally unique.
location=westus
resourceGroup=ContosoResources
iotHubConsumerGroup=ContosoConsumers
containerName=contosoresults

# Create the resource group to be used
#   for all the resources for this tutorial.
az group create --name $resourceGroup \
    --location $location

# The IoT hub name must be globally unique, 
#   so add a random value to the end.
iotHubName=ContosoTestHub$randomValue 
echo "IoT hub name = " $iotHubName

# Create the IoT hub.
az iot hub create --name $iotHubName \
    --resource-group $resourceGroup \
    --sku S1 --location $location

# Add a consumer group to the IoT hub for the 'events' endpoint.
az iot hub consumer-group create --hub-name $iotHubName \
    --name $iotHubConsumerGroup

# The storage account name must be globally unique, 
#   so add a random value to the end.
storageAccountName=contosostorage$randomValue
echo "Storage account name = " $storageAccountName

# Create the storage account to be used as a routing destination.
az storage account create --name $storageAccountName \
    --resource-group $resourceGroup \
    --location $location \
    --sku Standard_LRS

# Get the primary storage account key. 
#    You need this to create the container.
storageAccountKey=$(az storage account keys list \
    --resource-group $resourceGroup \
    --account-name $storageAccountName \
    --query "[0].value" | tr -d '"') 

# See the value of the storage account key.
echo "storage account key = " $storageAccountKey

# Create the container in the storage account. 
az storage container create --name $containerName \
    --account-name $storageAccountName \
    --account-key $storageAccountKey \
    --public-access off

# The Service Bus namespace must be globally unique, 
#   so add a random value to the end.
sbNamespace=ContosoSBNamespace$randomValue
echo "Service Bus namespace = " $sbNamespace

# Create the Service Bus namespace.
az servicebus namespace create --resource-group $resourceGroup \
    --name $sbNamespace \
    --location $location

# The Service Bus queue name must be globally unique, 
#   so add a random value to the end.
sbQueueName=ContosoSBQueue$randomValue
echo "Service Bus queue name = " $sbQueueName

# Create the Service Bus queue to be used as a routing destination.
az servicebus queue create --name $sbQueueName \
    --namespace-name $sbNamespace \
    --resource-group $resourceGroup

设置基本资源后,可以在 Azure 门户中配置消息路由。

设置消息路由

根据模拟设备附加到消息的属性将消息路由到不同资源。 未自定义路由的消息将发送到默认终结点(消息/事件)。 在下一教程中,我们会将消息发送到 IoT 中心,看其如何路由到不同的目标。

结果
级别=“storage” 写入到 Azure 存储。
级别=“critical” 写入服务总线队列。 逻辑应用从队列检索消息并使用 Office 365 通过电子邮件发送该消息。
default 使用 Power BI 显示此数据。

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

路由到存储帐户

现在为存储帐户设置路由。 你转到“消息路由”窗格,然后添加路由。 添加路由时,请为路由定义新的终结点。 设置此路由后,level 属性设置为 storage 的消息将自动写入存储帐户。

备注

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

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

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

现在,你设置了到 Azure 存储的消息路由的配置。

  1. Azure 门户中选择“资源组”,然后选择你的资源组 。 本教程使用 ContosoResources 。

  2. 在资源列表下选择“IoT 中心”。 本教程使用 ContosoTestHub 。

  3. 在显示“消息*”的中间列中,选择“消息路由” 。选择“+ 添加”以查看“添加路由”窗格 。 选择“终结点”字段旁边的“+ 添加终结点”,然后选择“存储” 。 此时会显示“添加存储终结点”窗格 。

    开始添加路由的终结点

  4. 为终结点输入名称。 本教程使用 ContosoStorageEndpoint

    命名终结点

  5. 选择“选取容器” 。 将转到存储帐户列表。 选择在准备步骤中设置的项;本教程使用 contosostorage。 它显示该存储帐户中的容器列表。 选择 在准备步骤中设置的容器。 本教程使用 contosoresults 。 然后单击屏幕底部的“选择”。 它会返回到另一个“添加存储终结点”窗格。 你将看到所选容器的 URL。

  6. 将编码设置为 AVRO 或 JSON。 在本教程中,其余字段使用默认值。 如果所选的区域不支持 JSON 编码,则此字段将会灰显。 设置文件名格式。

    备注

    可以使用“blob 文件名格式”设置 blob 名称的格式。 默认为 {iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}。 格式必须包含 {iothub}、{partition}、{YYYY}、{MM}、{DD}、{HH} 和 {mm},顺序不限。

    例如,使用默认 Blob 文件名格式时,如果中心名称为 ContosoTestHub,日期/时间为 2018 年 10 月 30 日上午 10:56,则 Blob 名称将类似于:ContosoTestHub/0/2018/10/30/10/56

    默认情况下,Blob 以 AVRO 格式写入。

  7. 在页面底部选择“创建”以创建存储终结点,并将其添加到路由。 随后将返回到“添加路由”窗格。

  8. 完成余下的路由查询信息。 此查询指定将消息发送到刚刚添加为终结点的存储容器的条件。 填充屏幕上的字段。

  9. 填写剩余字段。

    • 名称:输入路由的名称。 本教程使用 ContosoStorageRoute。 接下来,为存储指定终结点。 本教程使用 ContosoStorageEndpoint。

    • 指定“数据源”:从下拉列表选择“设备遥测消息” 。

    • 选择“启用路由”:确保此字段设置为“enabled”。

    • 路由查询:输入 level="storage" 作为查询字符串。

    保存路由查询信息

  10. 选择“保存”。 完成后,返回到“消息路由”窗格,可在其中看到存储的新路由查询。 关闭“消息路由”窗格,这会返回到“资源组”窗格。

路由到服务总线队列

现在为服务总线队列设置路由。 你转到“消息路由”窗格,然后添加路由。 添加路由时,将服务总线队列定义为路由的终结点。 设置此路由后,level 属性设置为 critical 的消息将写入服务总线队列,这会触发某个逻辑应用,然后发送包含相关信息的电子邮件。

  1. 在“资源组”页上选择你的 IoT 中心,然后选择“消息路由” 。

  2. 在“消息路由”窗格中,选择“+添加” 。

  3. 在“添加路由”窗格中,选择“+ 终结点”字段旁边的“+ 添加” 。 选择“服务总线队列” 。 随即看到“添加服务总线终结点”窗格 。

    添加第一个服务总线终结点

  4. 填写剩余字段:

    终结点名称:为终结点输入名称。 本教程使用 ContosoSBQEndpoint。

    服务总线命名空间:使用下拉列表选择在准备步骤中设置的服务总线命名空间。 本教程使用 ContosoSBNamespace 。

    服务总线队列:使用下拉列表选择服务总线队列。 本教程使用 contososbqueue 。

  5. 选择“创建”以添加第一个服务总线队列终结点。 随即返回到“添加路由”窗格 。

    添加第二个服务总线终结点

  6. 现在完成余下的路由查询信息。 此查询指定将消息发送到刚刚添加为终结点的服务总线队列的条件。 填充屏幕上的字段。

    名称:输入路由的名称。 本教程使用 ContosoSBQueueRoute

    终结点:选择刚刚设置的终结点。

    数据源:从下拉列表选择“设备遥测消息” 。

    启用路由:将此字段设置为“enable”。

    路由查询:输入 level="critical" 作为路由查询。

    为服务总线队列创建路由查询

  7. 选择“保存”。 返回到“路由”窗格时,可看到这两个新的路由。

    刚刚设置的路由

  8. 可选择“自定义终结点”选项卡来查看设置的自定义终结点。

    刚刚设置的自定义终结点

  9. 关闭“消息路由”窗格,返回到“资源组”窗格。

创建模拟设备

接下来,创建设备标识并保存其密钥供之后使用。 此设备标识由模拟应用程序用来发送消息到 IoT 中心。 此功能在 PowerShell 中不可用,在使用 Azure 资源管理器模板时也不可用。 以下步骤介绍如何使用 Azure 门户创建模拟设备。

  1. 打开 Azure 门户并登录到 Azure 帐户。

  2. 选择“资源组”,然后选择你的资源组。 本教程使用 ContosoResources 。

  3. 在资源列表中,选择 IoT 中心。 本教程使用 ContosoTestHub 。 从中心窗格选择“IoT 设备”。

  4. 在“IoT 设备”窗格中选择“+ 添加设备” 。 在添加设备窗格中,填写设备 ID。 本教程使用 Contoso-Test-Device。 将密钥留空,勾选“自动生成密钥”。 确保已启用“将设备连接到 IoT 中心”。 选择“保存” 。

    “添加设备”屏幕

  5. 创建设备后,即可选择它来查看生成的密钥。 选择主密钥上的“复制”图标,将其保存在某个位置(如记事本)供本教程的测试阶段使用。

    设备详细信息(包括密钥)

后续步骤

设置资源并配置消息路由后,请继续学习下一篇教程,了解如何将消息发送到 IoT 中心,并查看其如何路由到不同的目标。