你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
教程:使用 IoT 中心消息路由将设备数据发送到Azure 存储
本文内容
先决条件
注册设备并将消息发送到 IoT 中心
配置 IoT 资源管理器以查看消息
设置消息路由
查看路由消息
清理资源
后续步骤
显示另外 3 个
使用 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 资源管理器。
在 IoT 中心注册新设备。
重要
本文包括使用共享访问签名(也称为对称密钥身份验证)连接设备的步骤。 此身份验证方法便于测试和评估,但使用 X.509 证书对设备进行身份验证是一种更安全的方法。 有关详细信息,请参阅安全最佳做法和连接安全 。
登录 Azure 门户 ,导航到 IoT 中心。
从菜单的“设备管理”部分选择“设备”。
选择“添加设备”。
提供设备 ID,然后选择“保存”。
新设备现在应处于设备列表中。 如果不在该列表中,请刷新页面。 选择设备 ID 以打开设备详细信息页面。
复制其中一个设备密钥并保存。 你将使用此值配置生成模拟设备遥测消息的示例代码。
提示
本教程中使用的许多 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 中心的连接字符串。
在 Azure 门户中导航到 IoT 中心。
从菜单的“安全设置”部分选择“共享访问策略”。
选择“iothubowner”策略。
复制“主连接字符串”。
现在,使用该连接字符串为 IoT 中心配置 IoT 资源管理器。
在开发计算机上打开 IoT 资源管理器。
选择“添加连接”。
将中心的连接字符串粘贴到文本框中。
选择“保存”。
连接到 IoT 中心后,你应看到设备列表。 选择为本教程创建的设备 ID。
选择“遥测”。
在设备仍在运行的情况下选择“启动”。 如果你的设备未运行,则不会看到遥测数据。
你应看到来自设备的消息(最新消息显示在顶部)。
观看传入消息片刻,以验证是否看到三种不同类型的消息:normal、storage 和 critical。 可以在看到相应信息后停止设备。
这些消息全都到达 IoT 中心的默认内置终结点。 在后续部分中,我们将创建自定义终结点,并基于消息属性将其中一些消息路由到存储。 这些消息将停止在 IoT 资源管理器中出现,因为消息仅在与 IoT 中心的任何其他路由不匹配时才会转到内置终结点。
你将基于模拟设备附加到消息的属性将消息路由到不同资源。 未自定义路由的消息会发送到默认终结点(消息/事件)。
本教程的示例应用会向发送到 IoT 中心的每个消息分配 level 属性。 每个消息都随机分配有 normal、storage 或 critical 级别。
第一步是设置终结点,以便将数据路由到其中。 第二步是设置使用该终结点的消息路由。 设置路由后,可以在门户中查看终结点和消息路由。
创建一个 Azure 存储帐户并在该帐户中创建一个容器,该容器将保存路由到它的设备消息。
在 Azure 门户中,搜索“存储帐户”。
选择“创建”。
为存储帐户提供以下值:
展开表
参数
值
订阅
选择包含 IoT 中心的相同订阅。
资源组
选择包含 IoT 中心的相同资源组。
存储帐户名称
为存储帐户提供全局唯一的名称。
性能
接受默认“标准”值。
可以通过选择“查看 + 创建”来接受所有其他默认值。
验证完成后,选择“创建”。
部署完成后,选择“转到资源”。
在存储帐户菜单中,从“数据存储”部分选择“容器”。
选择“+ 容器”来新建容器。
为容器提供名称,然后选择“创建”。
为存储帐户和容器定义变量。
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 存储终结点,请参阅有关如何路由到存储的指南 。
重要
本文介绍使用共享访问签名连接到服务的步骤。 虽然可使用此身份验证方法进行测试和评估,但使用 Microsoft Entra ID 或托管标识对设备进行身份验证是一种更安全的方法。 有关详细信息,请参阅安全最佳做法和云安全 。
在 Azure 门户 中,转到 IoT 中心。
在资源菜单中的“中心设置”下,选择“消息路由”,然后选择“添加”。
在“终结点”选项卡上,通过提供以下信息创建存储终结点:
展开表
参数
值
终结点类型
选择“存储” 。
端点名称
提供此终结点的独一无二的名称。
Azure 存储容器
选择“选取容器”。 按照提示选择在上一部分创建的存储帐户和容器。
编码
选择“JSON”。 如果此字段灰显,则存储帐户区域不支持 JSON。 在这种情况下,继续使用默认“AVRO”。
接受其余参数的默认值,然后选择“创建 + 下一步”。
在“路由”选项卡上,提供以下信息以创建指向所创建的存储终结点的路由:
展开表
参数
值
名称
为路由创建名称。
数据源
验证是否从下拉列表中选择了“设备遥测消息”。
启用路由
验证此字段是否已选中。
路由查询
输入 level="storage"
作为查询字符串。
选择“创建 + 跳过扩充”。
配置终结点和路由命令所需的变量。
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 门户找到并删除各个资源。
如果打算继续学习下一教程,请保留你在此处创建的资源。
在 Azure 门户中,导航到包含本教程的 IoT 中心和存储帐户的资源组。
查看资源组中的所有资源,以确定要清理的资源。
如果要删除所有资源,请选择“删除资源组”。
如果只想删除某些资源,请使用每个资源名称旁的复选框选择要删除的资源。 然后选择“删除”。
使用 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 资源创建自定义终结点,然后创建路由以将设备消息发送到该终结点。 继续学习下一个教程,了解如何使用可用于简化下游处理的额外数据来扩充消息