使用 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 CLI。
如果需要,请安装 Azure CLI 来运行 CLI 参考命令。
本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
通过使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
在 IoT 中心注册新设备。
提示
本教程中使用的许多 CLI 命令使用相同参数。 为方便起见,我们会让你定义可根据需要进行调用的局部变量。 请务必在相同会话中运行所有命令,否则必须重新定义变量。
为 IoT 中心和设备定义变量。
IOTHUB_NAME:将此占位符替换为 IoT 中心的名称。
DEVICE_NAME:将此占位符替换为本教程中要用于设备的任何名称。
hubName=IOTHUB_NAME deviceName=DEVICE_NAME
在 CLI shell 中运行 az iot hub device-identity create 命令。 此命令创建设备标识。
az iot hub device-identity create --device-id $deviceName --hub-name $hubName
在设备标识输出中,复制不带两旁引号的 primaryKey 值并保存。 你将使用此值配置生成模拟设备遥测消息的示例代码。
现在你已获得设备 ID 和密钥,可使用示例代码开始将设备遥测消息发送到 IoT 中心。
提示
如果按照本教程的 Azure CLI 步骤进行操作,请在单独会话中运行示例代码。 这样便可以允许示例代码继续运行,同时执行其余 CLI 步骤。
如果尚未完成相应操作以作为先决条件的一部分,请立即从 GitHub 下载或克隆适用于 C# 的 Azure IoT SDK 存储库。
从下载或克隆 SDK 的文件夹中,导航到
azure-iot-sdk-csharp\iothub\device\samples\how to guides\HubRoutingSample
文件夹。安装 Azure IoT C# SDK 以及
HubRoutingSample.csproj
文件中指定的所需依赖项:dotnet restore
在所选编辑器中,打开
Parameters.cs
文件。 此文件显示该示例支持的参数。 运行示例时,本文中将仅使用PrimaryConnectionString
参数。 查看此文件中的代码。 无需任何更改。使用以下命令生成并运行示例代码:
将
<myDevicePrimaryConnectionString>
替换为 IoT 中心设备中的主连接字符串。dotnet run --PrimaryConnectionString <myDevicePrimaryConnectionString>
随着消息发送到 IoT 中心,你应开始看到消息打印到输出。 在本教程中让该程序保持运行状态。
配置 IoT 资源管理器以连接到 IoT 中心,并在消息到达内置终结点时读取消息。
首先,检索 IoT 中心的连接字符串。
运行 az iot hub connection-string show 命令:
az iot hub connection-string show --hub-name $hubName
复制不带两旁引号的连接字符串。
现在,使用该连接字符串为 IoT 中心配置 IoT 资源管理器。
在开发计算机上打开 IoT 资源管理器。
选择“添加连接”。
将中心的连接字符串粘贴到文本框中。
选择“保存”。
连接到 IoT 中心后,你应看到设备列表。 选择为本教程创建的设备 ID。
选择“遥测”。
在设备仍在运行的情况下选择“启动”。 如果你的设备未运行,则不会看到遥测数据。
你应看到来自设备的消息(最新消息显示在顶部)。
观看传入消息片刻,以验证是否看到三种不同类型的消息:normal、storage 和 critical。 可以在看到相应信息后停止设备。
这些消息全都到达 IoT 中心的默认内置终结点。 在后续部分中,我们将创建自定义终结点,并基于消息属性将其中一些消息路由到存储。 这些消息将停止在 IoT 资源管理器中出现,因为消息仅在与 IoT 中心的任何其他路由不匹配时才会转到内置终结点。
你将基于模拟设备附加到消息的属性将消息路由到不同资源。 未自定义路由的消息会发送到默认终结点(消息/事件)。
本教程的示例应用会向发送到 IoT 中心的每个消息分配 level 属性。 每个消息都随机分配有 normal、storage 或 critical 级别。
第一步是设置终结点,以便将数据路由到其中。 第二步是设置使用该终结点的消息路由。 设置路由后,可以在门户中查看终结点和消息路由。
创建一个 Azure 存储帐户并在该帐户中创建一个容器,该容器将保存路由到它的设备消息。
为存储帐户和容器定义变量。
GROUP_NAME:将此占位符替换为包含 IoT 中心的资源组的名称。
STORAGE_NAME:将此占位符替换为存储帐户的名称。 存储帐户名称必须为小写,且全局唯一。
CONTAINER_NAME:将此占位符替换为容器的名称。
resourceGroup=GROUP_NAME storageName=STORAGE_NAME containerName=CONTAINER_NAME
使用 az storage account create 命令创建标准通用 v2 存储帐户。
az storage account create --name $storageName --resource-group $resourceGroup
使用 az storage container create 将容器添加到存储帐户。
az storage container create --auth-mode login --account-name $storageName --name $containerName
现在为存储帐户设置路由。 在此部分中,定义指向所创建的存储帐户的新终结点。 然后,创建一个筛选 level 属性设置为 storage 的消息的路由,并将这些消息路由到存储终结点。
备注
可将数据以 Apache Avro 格式(默认)或 JSON 格式写入 Blob 存储。
编码格式只能在配置 Blob 存储终结点时设置。 不能更改已设置的终结点的格式。 使用 JSON 编码时,必须在消息系统属性中将 contentType 设置为 JSON,将 contentEncoding 设置为 UTF-8。
若要更详细地了解如何使用 Blob 存储终结点,请参阅有关如何路由到存储的指南。
配置终结点和路由命令所需的变量。
ENDPOINT_NAME:提供表示存储容器的终结点的名称。
ROUTE_NAME:提供为存储终结点筛选消息的路由的名称
endpointName=ENDPOINT_NAME routeName=ROUTE_NAME
使用 az iot hub message-endpoint create 命令创建一个指向上一部分中创建的存储容器的自定义终结点。
az iot hub message-endpoint create storage-container \ --connection-string $(az storage account show-connection-string --name $storageName --query connectionString -o tsv) \ --endpoint-name $endpointName \ --hub-name $hubName \ --container $containerName \ --resource-group $resourceGroup \ --encoding json
使用 az iot hub message-route create 命令创建一个路由,用于将满足
level=storage
条件的任何消息传递到存储容器终结点。az iot hub message-route create \ --route-name $routeName \ --hub-name $hubName \ --resource-group $resourceGroup \ --source-type devicemessages \ --endpoint-name $endpointName \ --enabled true \ --condition 'level="storage"'
在 IoT 中心中创建路由并启用后,它会立即开始将满足其查询条件的消息路由到存储终结点。
在开发计算机上返回到 IoT 资源管理器会话。 回想一下,IoT 资源管理器可监视 IoT 中心的内置终结点。 这意味着,现在应只看到未由我们创建的自定义路由进行路由的消息。
通过运行代码再次启动示例。 观看传入消息片刻,应只看到已 level
设置为 normal
或 critical
的消息。
验证消息是否到达存储容器。
在 Azure 门户中导航到存储帐户。
从菜单的“数据存储”部分选择“容器”。
选择为本教程创建的容器。
应有一个具有 IoT 中心名称的文件夹。 向下钻取文件结构,直至到达 .json 文件。
选择 JSON 文件,然后选择“下载”以下载 JSON 文件。 确认该文件包含来自你的设备的消息,并且这些消息的
level
属性已设置为storage
。停止运行示例。
如果要移除用于本教程的所有 Azure 资源,请删除资源组。 此操作会一并删除组中包含的所有资源。 如果不想删除整个资源组,请使用 Azure 门户找到并删除各个资源。
如果打算继续学习下一教程,请保留你在此处创建的资源。
使用 az resource list 命令查看资源组中的所有资源。
az resource list --resource-group $resourceGroup --output table
查看资源组中的所有资源,以确定要清理的资源。
如果要删除所有资源,请使用 az group delete 命令。
az group delete --name $resourceGroup
如果要删除某些资源,请使用 az resource delete 命令。 例如:
az resource delete --resource-group $resourceGroup --name $storageName
本教程介绍了如何为 Azure 资源创建自定义终结点,然后创建路由以将设备消息发送到该终结点。 继续学习下一个教程,了解如何使用可用于简化下游处理的额外数据来扩充消息