适用于: IoT Edge 1.5
 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 试用版订阅,请在开始前创建 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.cn/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 login azure --cloud-name AzureChinaCloud 参考。
- 在 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 通过其他方式将数据转化为边缘业务见解。