适用于: IoT Edge 1.1
重要
IoT Edge 1.1 终止支持日期为 2022 年 12 月 13 日。 请查看 Microsoft 产品生命周期,了解此产品、服务、技术或 API 的受支持情况。 有关更新到最新版本的 IoT Edge 的详细信息,请参阅 更新 IoT Edge。
在本文中,我们再次使用开发 VM 作为模拟设备。 但是,设备不直接将数据发送到 IoT 中心,而是将数据发送到配置为透明网关的 IoT Edge 设备。
在模拟设备发送数据时,我们监视 IoT Edge 设备的操作。 设备运行完成后,我们将查看存储帐户中的数据,以验证一切按预期工作。
此步骤通常由云或设备开发人员执行。
本教程此部分,您将学习如何:
- 生成并运行下游设备。
- 验证生成的数据是否存储在 Azure Blob 存储中。
- 验证机器学习模型是否对设备数据进行分类。
先决条件
本文是有关在 IoT Edge 上使用 Azure 机器学习的教程的系列教程的一部分。 本系列中的每个文章都基于上一篇文章中的工作。 如果已直接访问本文,请先查看本系列的 第一篇文章。
检查设备线束
重复使用 DeviceHarness 项目 来模拟下游设备。 连接到透明网关需要另外准备两项:
- 注册证书以使下游 IoT 设备信任 IoT Edge 运行时使用的证书颁发机构。 在本例中,下游设备是开发 VM。
- 将边缘网关的完全限定域名(FQDN)添加到设备的连接字符串中。
查看代码,了解这两项的实现方式。
在开发计算机上打开 Visual Studio Code。
使用 文件>打开文件夹... 来打开 C:\source\IoTEdgeAndMlSample\DeviceHarness。
查看 Program.cs 中的 InstallCertificate() 方法。
请注意,如果代码找到证书路径,它将调用 CertificateManager.InstallCACert 方法,以在计算机上安装证书。
现在查看 TurbofanDevice 类上的 GetIotHubDevice 方法。
当用户使用“-g”选项指定网关的 FQDN 时,该值作为附加到设备连接字符串的
gatewayFqdn
变量传递给此方法。connectionString = $"{connectionString};GatewayHostName={gatewayFqdn.ToLower()}";
生成并运行下游设备
如果 DeviceHarness 项目仍在 Visual Studio Code 中打开,请生成项目。 在 终端 菜单中,选择 运行生成任务,然后选择 生成。
查找边缘网关的完全限定域名(FQDN),请在 Azure 门户中导航到您的 IoT Edge 设备(Linux VM),然后从概述页面复制 DNS 名称的值。
如果 IoT 设备尚未运行,请启动 IoT 设备(Linux VM)。
打开 Visual Studio Code 终端。 在 终端 菜单中,选择 “新建终端” 并运行以下命令,将
<edge_device_fqdn>
替换为从 IoT Edge 设备(Linux VM)复制的 DNS 名称:dotnet run -- --gateway-host-name "<edge_device_fqdn>" --certificate C:\edgecertificates\certs\azure-iot-test-only.root.ca.cert.pem --max-devices 1
应用程序尝试将证书安装到开发计算机上。 当这种情况发生时,请接受安全警告。
当系统提示输入 IoT 中心连接字符串时,单击 Azure IoT 中心设备面板中的省略号(...),然后选择 复制 IoT 中心连接字符串。 将值粘贴到终端中。
你将看到如下所示的输出:
Found existing device: Client_001 Using device connection string: HostName=<your hub>.azure-devices.net;DeviceId=Client_001;SharedAccessKey=xxxxxxx; GatewayHostName=iotedge-xxxxxx.<region>.cloudapp.azure.com Device: 1 Message count: 50 Device: 1 Message count: 100 Device: 1 Message count: 150 Device: 1 Message count: 200 Device: 1 Message count: 250
请注意,将“GatewayHostName”添加到设备连接字符串,这会导致设备通过 IoT Edge 透明网关通过 IoT 中心进行通信。
检查输出
IoT Edge 设备输出
通过查看 IoT Edge 设备,可以轻松观察 avroFileWriter 模块的输出。
通过 SSH 连接到 IoT Edge 虚拟机。
查找写入磁盘的文件。
find /data/avrofiles -type f
命令的输出将如以下示例所示:
/data/avrofiles/2019/4/18/22/10.avro
根据运行时间,您可能会有一个以上的文件。
请注意时间戳。 avroFileWriter 模块在上次修改时间超过 10 分钟后将文件上传到云(请参阅 avroFileWriter 模块中 uploader.py 中的MODIFIED_FILE_TIMEOUT)。
10 分钟过后,模块应上传文件。 如果上传成功,它会从磁盘中删除文件。
Azure 存储
我们可以通过查看预期数据路由的存储帐户来观察下游设备发送数据的结果。
在开发计算机上打开 Visual Studio Code。
在浏览窗口中的“AZURE 存储”面板中,导航树以查找存储帐户。
展开 Blob 容器 节点。
根据我们在本教程上一部分中完成的工作,我们预计 ruldata 容器应包含带有 RUL 的消息。 展开 ruldata 节点。
你将看到一个或多个名为:
<IoT Hub Name>/<partition>/<year>/<month>/<day>/<hour>/<minute>
的 blob 文件。右键单击其中一个文件,然后选择 下载 Blob 以将文件保存到开发计算机。
接下来展开 uploadturbofanfiles 节点。 在上一篇文章中,我们将此位置设置为 avroFileWriter 模块上传的文件的目标。
右键单击文件并选择 下载 Blob 将其保存到开发计算机。
读取 Avro 文件内容
我们包含了一个简单的命令行实用工具,用于读取 Avro 文件并返回文件中消息的 JSON 字符串。 在本部分中,我们将安装并运行它。
在 Visual Studio Code 中打开终端(终端>新终端)。
安装 hubavroreader:
pip install c:\source\IoTEdgeAndMlSample\HubAvroReader
使用 hubavroreader 读取从 ruldata下载的 Avro 文件。
hubavroreader <avro file with ath> | more
请注意,消息正文按预期显示设备 ID 和预测的剩余使用寿命。
{ "Body": { "ConnectionDeviceId": "Client_001", "CorrelationId": "3d0bc256-b996-455c-8930-99d89d351987", "CycleTime": 1.0, "PredictedRul": 170.1723693909444 }, "EnqueuedTimeUtc": "<time>", "Properties": { "ConnectionDeviceId": "Client_001", "CorrelationId": "3d0bc256-b996-455c-8930-99d89d351987", "CreationTimeUtc": "01/01/0001 00:00:00", "EnqueuedTimeUtc": "01/01/0001 00:00:00" }, "SystemProperties": { "connectionAuthMethod": "{\"scope\":\"module\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}", "connectionDeviceGenerationId": "636857841798304970", "connectionDeviceId": "aaTurbofanEdgeDevice", "connectionModuleId": "turbofanRouter", "contentEncoding": "utf-8", "contentType": "application/json", "correlationId": "3d0bc256-b996-455c-8930-99d89d351987", "enqueuedTime": "<time>", "iotHubName": "mledgeiotwalkthroughhub" } }
运行相同的命令,传递从 uploadturbofanfiles下载的 Avro 文件。
如预期所示,这些消息包含原始消息中的所有传感器数据和作设置。 此数据可用于改进边缘设备上的 RUL 模型。
{ "Body": { "CycleTime": 1.0, "OperationalSetting1": -0.0005000000237487257, "OperationalSetting2": 0.00039999998989515007, "OperationalSetting3": 100.0, "PredictedRul": 170.17236328125, "Sensor1": 518.6699829101562, "Sensor10": 1.2999999523162842, "Sensor11": 47.29999923706055, "Sensor12": 522.3099975585938, "Sensor13": 2388.010009765625, "Sensor14": 8145.31982421875, "Sensor15": 8.424599647521973, "Sensor16": 0.029999999329447746, "Sensor17": 391.0, "Sensor18": 2388.0, "Sensor19": 100.0, "Sensor2": 642.3599853515625, "Sensor20": 39.11000061035156, "Sensor21": 23.353700637817383, "Sensor3": 1583.22998046875, "Sensor4": 1396.8399658203125, "Sensor5": 14.619999885559082, "Sensor6": 21.610000610351562, "Sensor7": 553.969970703125, "Sensor8": 2387.9599609375, "Sensor9": 9062.169921875 }, "ConnectionDeviceId": "Client_001", "CorrelationId": "70df0c98-0958-4c8f-a422-77c2a599594f", "CreationTimeUtc": "0001-01-01T00:00:00+00:00", "EnqueuedTimeUtc": "<time>" }
清理资源
如果您计划浏览此端到端教程使用的资源,请在完成教程后再清理您创建的资源。 否则,请使用以下步骤将其删除:
删除创建的资源组,以保存开发 VM、IoT Edge VM、IoT 中心、存储帐户、机器学习工作区服务(并创建的资源:容器注册表、Application Insights、密钥保管库、存储帐户)。
如果在本地克隆存储库,请关闭引用本地存储库的任何 PowerShell 或 VS Code 窗口,然后删除存储库目录。
如果在本地创建了证书,请删除文件夹 c:\edgeCertificates。
后续步骤
本文使用开发虚拟机来模拟一个下游设备,该设备向我们的 IoT Edge 设备发送传感器和操作数据。 通过检查边缘设备的实时作以及查看上传到存储帐户的文件,验证设备上的模块是否已路由、分类、持久化和上传数据。
若要继续了解 IoT Edge 功能,请尝试下一教程: