在 Azure 虚拟机上运行 Azure IoT Edge:为 IoT-For-Beginners 水果检测器搭建云端边缘设备

发布时间:2026/9/16 11:55:49

在 Azure 虚拟机上运行 Azure IoT Edge:为 IoT-For-Beginners 水果检测器搭建云端边缘设备 在 Azure 虚拟机上运行 Azure IoT Edge为 IoT-For-Beginners 水果检测器搭建云端边缘设备【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners在 macOS 等本机无法直接承载 IoT Edge 运行时的场景下最便捷的做法是在 Azure 云中创建一台预装了 Azure IoT Edge 的 Linux 虚拟机VM把它作为边缘设备让本课训练好的水果质量检测模型以容器模块的形式运行在云中边缘节点上再由 IoT 设备通过内网或公网调用其 REST 接口完成图像分类。本文基于IoT-For-Beginners课程 4制造第 3 课的官方指南完整讲解从创建 VM、配置连接、开放端口到部署与管理镜像分类器模块的端到端流程读完你将掌握一条命令创建带 IoT Edge 的 VM、用azCLI 获取网络信息与设置自动关机、通过网络安全组开放 80 端口以及用iotedge命令验证和调试边缘模块。为什么需要一台云中的 IoT Edge 设备在 第 3 课总览 中课程把上一课的云端图片分类器迁移到了边缘计算将模型部署到位于自己网络内部或云中的边缘设备上IoT 设备把图片直接发给边缘设备而不是发往公网云服务从而获得更低的延迟、更低的调用成本和更好的隐私性。Azure IoT Edge 是承载这类边缘工作负载的服务你在 IoT Hub 中注册一台边缘设备然后从云端向它部署以容器container形式打包的模块module。IoT Edge 运行时默认自带edgeAgent与edgeHub两个系统模块用于与 IoT Hub 通信而你部署的图片分类器会作为额外模块运行并在容器内通过开放的端口对外提供服务。由于IoT Edge 运行时只运行 Linux 容器当开发者的本机是 macOS或不愿意在本机安装运行时时官方指南即本文依据的 vm-iotedge.md给出的方案就是在 Azure 云中创建一个已预装 IoT Edge 的 Linux 虚拟机作为边缘设备。这台 VM 本质上就是你租用的一台云端电脑可以按需配置、运行自己的软件并通过 SSH 远程登录管理。前置条件在 IoT Hub 中注册边缘设备在创建 VM 之前需要先在 IoT Hub 中注册一台名为fruit-quality-detector-edge的 IoT Edge 设备参见 README 的 Register an IoT Edge device 小节。与非边缘设备不同注册命令需要附加--edge-enabled标志az iot hub device-identity create --edge-enabled \ --device-id fruit-quality-detector-edge \ --hub-name hub_name随后获取该设备的连接字符串它将用于在创建 VM 时把 IoT Edge 运行时连接到你的 IoT Hubaz iot hub device-identity connection-string show --device-id fruit-quality-detector-edge \ --output table \ --hub-name hub_name把输出中的连接字符串完整复制下来下一步创建 VM 时会用到。任务一创建预装 IoT Edge 的虚拟机官方仓库提供了开箱即用的 Azure 部署模板edgeDeploy.jsonAzure 官方的 iotedge-vm-deploy 项目 1.2.0 版本它会创建一个已安装并配置好 Azure IoT Edge 运行时的 Linux VM。只需一条az deployment group create命令即可完成az deployment group create \ --resource-group fruit-quality-detector \ --template-uri https://raw.githubusercontent.com/Azure/iotedge-vm-deploy/1.2.0/edgeDeploy.json \ --parameters dnsLabelPrefixvm_name \ --parameters adminUsernameusername \ --parameters deviceConnectionStringconnection_string \ --parameters authenticationTypepassword \ --parameters adminPasswordOrKeypassword参数逐项说明参数填写要求dnsLabelPrefix虚拟机的名称必须是全局唯一的 DNS 前缀建议使用fruit-quality-detector-vm-加上你的名字或其他唯一值如fruit-quality-detector-vm-jimadminUsernameSSH 登录用户名需要相对安全不能使用admin之类的弱用户名deviceConnectionString上一步注册的fruit-quality-detector-edge边缘设备的连接字符串用双引号包裹authenticationType登录认证方式此处固定使用passwordadminPasswordOrKeySSH 登录密码或密钥同样需要符合安全强度要求不能使用password这种弱口令默认规格与成本该模板默认创建一台DS1 v2规格的虚拟机1 个 CPU、3.5 GB RAM。这种规格类别VM size决定了机器的算力强弱也直接决定了费用高低——本文写作时一台 DS1 VM 大约每小时 $0.06。这个规格足以运行水果图片分类的推理负载同时将云端成本控制在较低水平。VM 创建完成后IoT Edge 运行时会被自动安装并配置好自动以fruit-quality-detector-edge设备的身份连接到你的 IoT Hub无需任何手工干预。任务二获取 VM 的 IP 地址与 DNS 名称后续无论是 SSH 登录、部署模块后验证还是让 IoT 设备调用分类器都需要用到 VM 的 IP 地址或 DNS 名称。用下面的命令查看详情az vm list --resource-group fruit-quality-detector \ --output table \ --show-details在输出中复制PublicIps公网 IP字段或Fqdns完整 DNS 名字段的值保存备用。任务三成本控制——设置每日自动关机VM 是按小时计费的只要处于运行状态就会产生费用。官方指南建议不使用时关闭 VM项目结束后删除 VM。为了避免忘记手动关机而白白扣费可以配置每日定时自动关机az vm auto-shutdown --resource-group fruit-quality-detector \ --name vm_name \ --time shutdown_time_utc参数说明vm_name替换为你的虚拟机名称shutdown_time_utc以 4 位数字HHMM形式填写你希望关机的UTC 时间。例如希望在 UTC 午夜北京时间 08:00关机填0000美国西海岸晚上 19:30 对应 UTC 次日凌晨 02:30则填0230。这样即使你忘记手动关闭计费最多也只持续到自动关机时刻。任务四开放 80 端口——让分类器可被外部调用部署到边缘设备上的镜像分类器容器会在80 端口HTTP 默认端口上监听请求。而 Azure 虚拟机默认屏蔽所有入站端口因此必须显式开放 80 端口。端口开放是通过**网络安全组NSGNetwork Security Group**实现的分两步第一步查出 VM 所属的网络安全组名称az network nsg list --resource-group fruit-quality-detector \ --output table复制输出中Name字段的值。第二步向该 NSG 添加允许入站 TCP 80 的规则az network nsg rule create \ --resource-group fruit-quality-detector \ --name Port_80 \ --protocol tcp \ --priority 1010 \ --destination-port-range 80 \ --nsg-name nsg name其中nsg name替换为上一步查到的网络安全组名称。规则名为Port_80协议为 TCP优先级1010数值越小优先级越高目标端口范围80。规则创建完成后外部设备即可通过http://IP 地址或 DNS 名称/image访问运行在容器里的分类器 REST 接口。从仓库的部署清单 deployment.json 可以看到ImageClassifier模块的createOptions正是通过ExposedPorts: {80/tcp: {}}暴露容器内的 80 端口并用PortBindings: {80/tcp: [{HostPort: 80}]}映射到主机 80 端口——开放 NSG 端口 80 正是为了让这一端口映射能够对外可达。任务五日常管理——关机、重启与停止的区别在项目周期内不使用时关闭 VM、使用时再启动是控制成本的关键手段。官方指南明确区分了两种停止语义关闭解除分配——推荐使用az vm deallocate --resource-group fruit-quality-detector \ --name vm_namedeallocate会释放分配给 VM 的计算资源CPU/内存配额归还给 Azure此时不再计费存储等保留资源仍可能产生少量费用。启动 VMaz vm start --resource-group fruit-quality-detector \ --name vm_name需要避开的坑虽然也存在az vm stop命令但它只是停止操作系统运行计算资源仍被分配给你计费照常——相当于停机不停费。因此控制成本时请使用az vm deallocate而非az vm stop。项目彻底结束后应参考仓库根目录的 clean-up.md 清理整个资源组包括 VM、IoT Hub、容器注册表等避免持续产生费用。深度衔接把分类器容器部署到这台 VMVM 创建完成后它与课程主线中的部署到边缘设备流程完全一致你可以在 README 中找到完整的部署步骤。这里仅列出与 VM 密切相关的关键环节帮助你理解这台 VM 在整个流水线中的位置构建并推送容器镜像从 Custom Vision 导出使用Food (compact)领域训练的分类器导出为 DockerFile用 Docker 构建镜像并推送到 Azure 容器注册表docker build --platform linux/amd64 -t Container registry name.azurecr.io/classifier:v1 . docker push Container registry name.azurecr.io/classifier:v1在 x86 云 VM 上运行时平台参数为linux/amd64Raspberry Pi 等 ARM 设备则用linux/armhf。编写并下发部署清单仓库 code-deployment/deployment/deployment.json 中提供了完整的部署清单模板。其中关键配置包括registryCredentials声明容器注册表的用户名、密码与地址Container registry name.azurecr.io供边缘设备拉取镜像时鉴权systemModules.edgeAgent/edgeHub系统模块镜像edgeHub的createOptions绑定了 5671/8883/443 端口用于与 IoT Hub 通信modules.ImageClassifier业务模块镜像为Container registry name.azurecr.io/classifier:v1并暴露/映射 80 端口与上文 NSG 开放端口呼应。下发部署az iot edge set-modules --device-id fruit-quality-detector-edge \ --content deployment.json \ --hub-name hub_nameSSH 登录 VM 验证模块状态使用创建 VM 时设置的adminUsername和密码通过 IP 或 DNS 登录ssh adminUsernameIP address # 或 ssh adminUsernameDNS Name登录后依次执行iotedge list # 查看模块运行状态输出应包含 ImageClassifier、edgeAgent、edgeHub 三个 running 模块 iotedge logs ImageClassifier # 查看分类器日志确认 Running on http://0.0.0.0:80/ 等启动信息iotedge logs ImageClassifier的输出会显示 TensorFlow 模型加载成功、标签加载成功以及 Flask 服务在 80 端口监听——这是分类器就绪的标志。用 curl 冒烟测试分类器curl --location \ --request POST http://IP address or name/image \ --header Content-Type: image/png \ --data-binary file_Name返回的 JSON 中包含predictions数组例如ripe: 0.9995、unripe: 0.0004。由于这是在本地/边缘网络中运行的服务不需要提供预测密钥prediction key——安全性由内部网络安全策略保障而非依赖公网端点与 API 密钥。IoT 设备侧改用 REST 调用客户端代码不再使用 Custom Vision 云 SDK而是直接用requests库 POST 图片。仓库中的 树莓派示例 与 虚拟设备示例 展示了完整的调用方式prediction_url http://IP address or name/image headers { Content-Type : application/octet-stream } image.seek(0) response requests.post(prediction_url, headersheaders, dataimage) results response.json() for prediction in results[predictions]: print(f{prediction[tagName]}:\t{prediction[probability] * 100:.2f}%)更多接入细节见 单板计算机Raspberry Pi/虚拟 IoT 设备指南 与 Wio Terminal 指南。注意事项与使用边界计费敏感本指南中 VM 规格、每小时费用等数值为文档写作时的默认值实际价格以 Azure 官方定价为准务必善用az vm auto-shutdown与az vm deallocate。安全边界由于打开了公网 80 端口建议仅在项目实验期内开放并在完成后按 clean-up.md 清理资源避免端口长期暴露。架构定位本 VM 承担的是边缘设备角色与 Raspberry Pi 或单板电脑方案等价只是计算资源托管在云中这也正是 Azure IoT Edge 允许云端管理、边缘运行的核心价值——模型在云端训练与更新推理却在靠近数据源的边缘节点上完成。至此你已拥有一台完整可用的云上 IoT Edge 设备从 IoT Hub 注册、VM 一键创建、端口开放、成本管理到模块部署与 REST 调用验证的全链路都已在掌握之中。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/16 11:50:48

Java基础语法从入门到实战:环境配置、核心考点与学习路线

先说我观察到的现象:Java基础语法这块内容,网上教程多到数不清,但真正能坚持学完并且上手写项目的人,少得惊人。后台经常收到新手消息,有人问“Java基础语法到底要学多久才能写东西”,有人问“为什么教程看…

2026/9/16 11:50:48

超响应脉冲生成:从LTC6993-2到R7KA8D2KFLCAC的纳秒级工程实现

1. 为什么“超响应脉冲生成”不是玄学,而是可量化、可复现的工程目标你拆过LTC6993-2的Datasheet吗?第一页就写着“Monostable Pulse Generator with Adjustable Pulse Width and Retriggerable Operation”,但真正用它做出“超响应”效果的人…

2026/9/16 11:50:47

ATA6563与R7KA8D2KFLCAC协同实现硬件级CAN网络管理

1. 项目概述:为什么两个芯片能“简化”CAN网络管理?你有没有遇到过这样的场景:在一辆中型商用车的ECU开发中,光是处理CAN总线上的节点唤醒、休眠、错误恢复和状态同步,就占了底层驱动开发30%以上的工时?我做…

2026/9/16 12:46:00

51单片机红外解码与数码管显示:NEC协议时序测量实战

简介:一份面向51单片机初学者的红外解码与数码管显示综合实例,来源于51单片机教程系列第117讲。资源围绕红外接收、协议解码、动态扫描显示等核心知识点展开,适合入门者巩固定时器、中断和I/O控制技术。压缩包仅15KB,共11个文件&a…

2026/9/16 12:46:00

23款AI写作工具实测:学术论文高效写作全攻略

1. 论文写作工具测评背景与价值作为一名经历过自考论文写作全过程的过来人,我深刻理解学术写作中遇到的三大痛点:文献检索效率低、格式规范难把握、写作过程缺乏智能辅助。去年撰写教育管理专业毕业论文时,我耗时两个月测试了市面上23款AI写作…

2026/9/16 12:46:00

北方苍鹰优化算法(NGO)的Matlab实现与改进

1. 北方苍鹰优化算法(NGO)概述北方苍鹰优化算法(Northern Goshawk Optimization,简称NGO)是近年来提出的一种新型元启发式算法,灵感来源于北方苍鹰在自然界中的捕猎行为。这种猛禽以其卓越的狩猎策略闻名—…

2026/9/16 12:46:00

Java录屏录音实战:JavaCV+FFmpeg实现MP4视频与AAC音频同步编码

简介:一份JavaFX桌面录屏录音软件项目源码,面向Java桌面应用与多媒体处理的开发者。项目完整实现录屏、录音、暂停、播放、MP4保存等功能,覆盖从界面搭建到音视频流处理的常见路径。压缩包共48个文件,以PNG截图、Java源码、class编…

2026/9/16 12:40:59

AI写作助手如何解决学术论文的结构化难题

1. 论文写作困境的本质剖析本科阶段的论文写作往往陷入一种"焦虑填空"的怪圈:学生手头堆积着零散的文献片段、未成形的观点和导师的碎片化建议,却缺乏将这些元素组织成有机整体的能力。这种困境源于三个层面的结构性矛盾:首先在认知…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码