适用于: IoT Edge 1.5
重要
IoT Edge 1.5 LTS 是 受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果使用的是早期版本,请参阅 更新 IoT Edge。
使用 Azure Functions 部署直接在 Azure IoT Edge 设备上运行业务逻辑的代码。 本教程介绍如何创建和部署一个 Azure 函数,用于筛选模拟 IoT Edge 设备上的传感器数据。 使用在快速入门中创建的模拟 IoT Edge 设备。 本教程介绍如何执行下列操作:
- 使用 Visual Studio Code 创建 Azure Functions
- 使用 Visual Studio Code 和 Docker 创建 Docker 映像并将其发布到容器注册表
- 将模块从容器注册表部署到 IoT Edge 设备
- 查看筛选的数据
本教程中创建的 Azure 函数会筛选设备生成的温度数据。 当温度高于指定阈值时,该函数仅向上游发送消息到 Azure IoT 中心。
如果没有 Azure 帐户,请在开始前创建一个免费帐户。
先决条件
在开始本教程之前,请按照本教程为 Linux 容器开发设置开发环境: 使用 Visual Studio Code 开发 Azure IoT Edge 模块。 完成后,您将具备以下先决条件:
- Azure 中的免费版或标准版 IoT Hub
- 运行 Azure IoT Edge(支持 Linux 容器)的 AMD64 设备。 使用快速入门设置 Linux 设备或 Windows 设备。
- 容器注册表,如 Azure 容器注册表
- 装有 Azure IoT Edge 和 Azure IoT 中心扩展的 Visual Studio Code。 适用于 Visual Studio Code 扩展的 Azure IoT Edge 工具处于维护模式。
- 在开发计算机上下载并安装 Docker 兼容的容器管理系统 。 将其设置为运行 Linux 容器。
若要使用 Azure Functions 开发 IoT Edge 模块,请在开发计算机上安装以下附加先决条件:
创建函数项目
Azure IoT Edge for Visual Studio Code 提供管理功能和代码模板。 在本部分中,你将使用 Visual Studio Code 通过 Azure 函数创建 IoT Edge 解决方案。
创建新项目
按照以下步骤创建可自定义的 C# 函数解决方案模板。
在开发计算机上打开 Visual Studio Code。
选择“视图”“命令面板”,打开 Visual Studio Code 命令面板。
在命令面板中,添加并运行 Azure IoT Edge:新的 IoT Edge 解决方案命令。 按照命令面板中的提示创建解决方案:
- 选择文件夹:在适用于 Visual Studio Code 的开发计算机上选择创建解决方案文件的位置。
- 提供解决方案名称:为解决方案添加描述性名称(如 FunctionSolution)或接受默认值。|
- 选择模块模板:选择 Azure Functions - C#。
- 提供模块名称 |将模块 命名为 CSharpFunction。
- 为模块提供 Docker 映像存储库。 映像存储库包含容器注册表的名称和容器映像的名称。 容器映像是在上一步预先填充的。 将 localhost:5000 替换为 Azure 容器注册表中的“登录服务器”值。 可以从 Azure 门户中容器注册表的“概述”页检索登录服务器。 最终的字符串看起来类似于 <注册表名称>.azurecr.io/csharpfunction。
添加注册表凭据
解决方案中的环境文件存储容器注册表的凭据,并将其与 IoT Edge 运行时共享。 运行时需要这些凭据将专用映像拉取到 IoT Edge 设备中。
Visual Studio Code 中的 IoT Edge 扩展将尝试从 Azure 中拉取容器注册表凭据并将其填充到环境文件中。 检查凭据是否已在文件中。 如果没有,请立即添加:
- 在 Visual Studio Code 资源管理器中,打开
.env
文件。 - 使用从 Azure 容器注册表复制的用户名和密码值更新字段。 若要再次找到它们,请转到 Azure 中的容器注册表,并查看“设置访问密钥”>页。
- 保存此文件。
注意
本教程使用 Azure 容器注册表的管理员登录凭据,这对于开发和测试方案非常方便。 对于生产,请使用最低特权身份验证选项,如服务主体。 有关详细信息,请参阅 管理对容器注册表的访问权限。
将目标体系结构设置为 AMD64
IoT Edge 上的 Azure Functions 模块仅在基于 Linux AMD64 的容器上受支持。 Visual Studio Code 的默认目标体系结构是 Linux AMD64,但我们在此处显式将其设置为 Linux AMD64。
打开命令面板并搜索 Azure IoT Edge:设置 Edge 解决方案的默认目标平台。
在命令面板中,从选项列表中选择 AMD64 目标体系结构。
使用自定义代码更新模块
添加一些代码,以便 CSharpFunction 模块在边缘处理消息,然后将其转发到 IoT 中心。
在 Visual Studio Code 资源管理器中,打开 模块>CSharpFunction>CSharpFunction.cs。
将 CSharpFunction.cs 文件的内容替换为以下代码。 此代码接收有关环境温度和计算机温度的遥测数据,仅当计算机温度高于定义的阈值时,才会将消息转发到 IoT 中心。
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.Azure.Devices.Client; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.EdgeHub; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace Functions.Samples { public static class CSharpFunction { [FunctionName("CSharpFunction")] public static async Task FilterMessageAndSendMessage( [EdgeHubTrigger("input1")] Message messageReceived, [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output, ILogger logger) { const int temperatureThreshold = 20; byte[] messageBytes = messageReceived.GetBytes(); var messageString = System.Text.Encoding.UTF8.GetString(messageBytes); if (!string.IsNullOrEmpty(messageString)) { logger.LogInformation("Info: Received one non-empty message"); // Get the body of the message and deserialize it. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { // Send the message to the output as the temperature value is greater than the threshold. using (var filteredMessage = new Message(messageBytes)) { // Copy the properties of the original message into the new Message object. foreach (KeyValuePair<string, string> prop in messageReceived.Properties) {filteredMessage.Properties.Add(prop.Key, prop.Value);} // Add a new property to the message to indicate it is an alert. filteredMessage.Properties.Add("MessageType", "Alert"); // Send the message. await output.AddAsync(filteredMessage); logger.LogInformation("Info: Received and transferred a message with temperature above the threshold"); } } } } } //Define the expected schema for the body of incoming messages. class MessageBody { public Machine machine {get; set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} } }
保存文件。
生成并推送 IoT Edge 解决方案
在上一部分中,你创建了一个 IoT Edge 解决方案,并更改了 CSharpFunction ,以筛选出报告的计算机温度低于可接受的阈值的消息。 现在,将解决方案构建为容器镜像,并将其推送到容器注册表。
打开 Visual Studio Code 集成终端。 选择“ 查看>终端”。
在终端中登录到 Docker。 使用 Azure 容器注册表中的用户名、密码和登录服务器。 从 Azure 门户中注册表的 “访问密钥 ”部分获取这些值。
docker login -u <ACR username> -p <ACR password> <ACR login server>
可以收到建议使用
--password-stdin
的安全警告。 这条最佳做法是针对生产方案建议的,这超出了本教程的范畴。 有关详细信息,请参阅 docker 登录 参考。在 Visual Studio Code 资源管理器中,右键单击 deployment.template.json 文件,然后选择“ 生成”和“推送 IoT Edge 解决方案”。
“生成并推送”命令会启动三项操作。 首先,它会在名为 config 的解决方案中创建一个新文件夹,其中包含完整的部署清单,该清单是从部署模板和其他解决方案文件生成的。 其次,它运行
docker build
,使用适当的 Dockerfile 为您的目标架构构建容器镜像。 然后,它会运行docker push
,以将映像存储库推送到容器注册表。此过程可能需要几分钟时间,但下次运行命令时速度更快。
查看容器映像
将容器映像推送到容器注册表时,Visual Studio Code 会显示成功消息。 若要确认操作,请查看注册表中的图像。
- 在 Azure 门户中,转到 Azure 容器注册表。
- 选择 “服务>存储库”。
- 列表中会显示 csharpfunction 存储库。 选择此存储库可查看更多详细信息。
- 在 “标记” 部分中,可以看到 0.0.1-amd64 标记。 此标记显示生成的映像的版本和平台。 这些值在 CSharpFunction 文件夹中的module.json 文件中设置。
部署并运行解决方案
使用 Azure 门户将函数模块部署到 IoT Edge 设备,就像在快速入门中一样。 还可以从 Visual Studio Code 部署和监视模块。 以下部分使用先决条件中列出的适用于 Visual Studio Code 扩展的 Azure IoT Edge 和 IoT 中心。 如果尚未安装扩展,请立即安装扩展。
在 Visual Studio Code 资源管理器的 “Azure IoT 中心 ”部分下,展开 “设备” 以查看 IoT 设备列表。
右键单击 IoT Edge 设备的名称,然后选择“为单个设备创建部署”。
转到具有 CSharpFunction 的解决方案文件夹。 打开 config 文件夹,选择 deployment.amd64.json 文件,然后选择“选择 Edge 部署清单”。
在设备下,展开“模块”可查看已部署的正在运行的模块的列表。 选择“刷新”按钮。 可以看到新的 CSharpFunction 与 SimulatedTemperatureSensor 模块、 $edgeAgent和 $edgeHub一起运行。
新模块可能需要一些时间才能显示。 IoT Edge 设备从 IoT 中心检索其新部署信息,启动新容器,然后将状态报告回 IoT 中心。
查看生成的数据
要查看从设备发送到 IoT 中心的所有消息,请在命令面板中运行 Azure IoT Hub: 开始监视内置事件终结点。 若要停止监视消息,请在命令面板中运行 Azure IoT 中心:停止监视内置事件终结点 。
若要筛选视图并查看来自特定设备的消息,请右键单击 Visual Studio Code 资源管理器的 Azure IoT 中心>设备 部分中的设备,然后选择“ 开始监视内置事件终结点”。
清理资源
如果打算继续阅读下一篇建议的文章,请保留创建的资源和配置并重复使用它们。 还可以继续使用相同的 IoT Edge 设备作为测试设备。
否则,请删除本文中创建的本地配置和 Azure 资源以避免费用。
删除 Azure 资源
删除 Azure 资源和资源组的操作不可逆。 请确保不要意外删除错误的资源组或资源。 如果在具有要保留的资源的现有资源组中创建 IoT 中心,请仅删除 IoT 中心资源本身,而不是资源组。
若要删除资源,请执行以下操作:
登录到 Azure 门户,然后选择 “资源组”。
选择包含 IoT Edge 测试资源的资源组的名称。
查看资源组包含的资源列表。 若要删除这一切,可以选择“删除资源组”。 如果只需删除部分,可以选择每个资源以单独删除。
后续步骤
在本教程中,你已创建一个 Azure 函数模块,其中包含用于筛选 IoT Edge 设备生成的原始数据的代码。
继续阅读后续教程,了解如何使用 Azure IoT Edge 通过其他方式将数据转化为边缘业务见解。