将你的植物迁移到云端 本课概览的速写笔记 速写笔记由 Nitya Narasimhan 创作。点击图片查看大图。 这节课是作为 物联网初学者项目 2 - 数字农业系列 的一部分在微软 Reactor 开展的。 [](https://youtu.be/bNxjopXkhvk) 课前测验 课前测验 引言 在上一课中,你学会了如何将你的植物连接到一个MQTT代理,并通过运行在本地服务器上的代码控制继电器。这是互联网连接的自动浇水系统的核心部分,从家庭中的单个植物到商业农场都适用。 物联网设备通过公共MQTT代理进行通信,以展示这些原理,但这并不是最可靠或安全的方式。在这节课中,你将学习有关云的知识,以及公共云服务提供的物联网功能。你还将学习如何将你的植物从公共MQTT代理迁移到这些云服务之一。

速写笔记由 Nitya Narasimhan 创作。点击图片查看大图。
这节课是作为 物联网初学者项目 2 - 数字农业系列 的一部分在微软 Reactor 开展的。
在上一课中,你学会了如何将你的植物连接到一个MQTT代理,并通过运行在本地服务器上的代码控制继电器。这是互联网连接的自动浇水系统的核心部分,从家庭中的单个植物到商业农场都适用。
物联网设备通过公共MQTT代理进行通信,以展示这些原理,但这并不是最可靠或安全的方式。在这节课中,你将学习有关云的知识,以及公共云服务提供的物联网功能。你还将学习如何将你的植物从公共MQTT代理迁移到这些云服务之一。
在这节课中,我们将涵盖以下内容:
在云出现之前,当公司想要为员工(如数据库或文件存储)或公众(如网站)提供服务时,他们需要自己建立和运营数据中心。这可以是一个有少量计算机的小房间,也可以是一个有许多计算机的大楼。公司需要管理所有事情,包括:
这可能非常昂贵,需要各种专业技能的员工,并且在需要改变时会非常缓慢。例如,如果一家在线商店需要为繁忙的假期季节做准备,他们需要提前几个月购买更多硬件、配置、安装并安装运行销售过程的软件。假期结束后,销售量下降,他们会发现已经购买的计算机闲置,直到下一个繁忙的季节。
✅ 你认为这会让公司行动迅速吗?如果一家在线服装零售商突然因为名人穿着他们的衣服而变得流行,他们能否快速增加计算能力来支持突然涌入的订单?
云通常被戏称为“别人的电脑”。最初的想法很简单——与其购买自己的计算机,不如租用别人的计算机。某人,即云计算提供商,将管理大型数据中心。他们负责购买和安装硬件,管理电力和冷却,网络,建筑安全,硬件和软件更新等一切事务。作为客户,你可以租用你需要的计算机,在需求激增时租用更多,如果需求下降,则减少租用的数量。这些云数据中心遍布世界各地。


这些数据中心的面积可达几平方公里。上述图片是在几年前拍摄的微软云数据中心的照片,显示了初始规模以及计划的扩建。扩建区域超过5平方公里。
这些数据中心需要如此大的电力,以至于有些甚至有自己的发电站。由于其规模和云提供商的投资水平,它们通常是环保的。它们比大量小型数据中心更高效,主要使用可再生能源,并且云提供商努力减少浪费、减少用水量,并重新种植森林以弥补建造数据中心所砍伐的树木。你可以阅读更多关于一个云提供商如何致力于可持续发展的信息,访问 Azure 可持续发展页面。
✅ 做一些研究:阅读像 Microsoft 的 Azure 或 Google 的 GCP 这样的主要云服务。它们有多少数据中心,分布在全球哪些地方?
使用云可以帮助公司降低成本,并专注于他们最擅长的事情,将云计算专业知识留给提供商。公司不再需要租赁或购买数据中心空间,支付不同供应商的连接和电力费用,或者雇佣专家。相反,他们只需每月向云提供商支付一笔费用,让一切事务得到处理。
云提供商可以利用规模经济降低成本,批量购买计算机以降低成本,投资工具以减少维护工作量,甚至设计和建造自己的硬件以改进其云产品。
Azure 是来自微软的开发者云,这也是你在这些课程中将要使用的云。下面的视频对Azure进行了简短的概述:
要使用云中的服务,你需要向云提供商注册一个订阅。对于这节课,你需要注册一个微软Azure订阅。如果你已经有Azure订阅,可以跳过此任务。这里描述的订阅详情在撰写时是正确的,但可能会发生变化。
如果你是通过学校访问这些课程,你可能已经有可用的Azure订阅。请咨询你的老师。
你可以注册两种不同的免费Azure订阅:
Azure for Students - 这种订阅专为18岁以上的学生设计。无需信用卡即可注册,你使用学校的电子邮件地址验证你的学生身份。注册后,你会获得100美元用于云资源,以及包括免费版本的物联网服务在内的免费服务。这种服务有效期为12个月,每年都可以续期,只要你仍然是学生。
Azure免费订阅 - 这种订阅适用于任何非学生用户。你需要一张信用卡来注册订阅,但你的卡不会被收费,这只是用来验证你是一个真实的人,而不是机器人。你可以在前30天内使用200美元的信用额度在任何服务上消费,以及免费层的Azure服务。一旦信用额度用完,除非你转为按需付费订阅,否则不会收费。
微软确实为18岁以下的学生提供了Azure for Students Starter订阅,但在撰写本文时,该订阅不支持任何物联网服务。
如果你年满18岁并且是学生,那么你可以注册Azure for Students订阅。你需要使用学校电子邮件地址进行验证。你可以通过以下两种方式之一完成此操作:
在 education.github.com/pack 上注册GitHub学生开发者包。这为你提供了多种工具和优惠,包括GitHub和Microsoft Azure。一旦你注册了开发者包,你就可以激活Azure for Students优惠。
直接在 azure.microsoft.com/free/students 上注册Azure for Students账户。
⚠️ 如果你的学校电子邮件地址未被识别,请在 此仓库 中提出问题,我们将看看是否可以将其添加到Azure for Students允许列表中。
如果你不是学生,或者没有有效的学校电子邮件地址,那么你可以注册Azure Free订阅。
你一直在使用的公共测试MQTT代理在学习时是一个很好的工具,但在商业环境中使用它存在一些缺点:
云中的物联网服务解决了这些问题。它们由大型云提供商维护,这些提供商在可靠性方面投入巨资,并在出现问题时随时准备解决。它们内置了安全性,防止黑客读取你的数据或发送恶意命令。它们还具有高性能,能够每天处理数百万条消息,利用云的优势进行扩展。
尽管你需要为此付出每月的费用,但大多数云提供商都会提供免费版本的物联网服务,每天或连接的设备数量有限制。这个免费版本通常足以让开发人员学习服务。在这节课中,你将使用免费版本。
物联网设备可以通过设备SDK(提供与服务功能交互的代码库),或直接通过MQTT或HTTP等通信协议连接到云服务。设备SDK通常是最快捷的途径,因为它为你处理了一切,比如知道要发布或订阅的主题,以及如何处理安全性。

然后,你的设备通过这个服务与其他应用程序组件进行通信——类似于你通过MQTT发送遥测数据并接收命令的方式。这通常使用服务SDK或类似的库。消息从设备发送到服务,其他应用程序组件可以读取这些消息,然后可以将消息发送回设备。

这些服务通过了解所有可以连接和发送数据的设备来实现安全性,无论是通过预先注册设备,还是通过给设备密钥或证书以便它们第一次连接时可以自行注册。未知设备无法连接,如果尝试连接,服务将拒绝连接并忽略发送的消息。
✅ 做一些研究:拥有一个开放的物联网服务(任何设备或代码都可以连接)有什么缺点?你能找到黑客利用这一点的具体例子吗?
应用程序的其他组件可以连接到物联网服务并了解所有已连接或注册的设备,并可以直接批量或单独地与它们通信。
物联网服务还实现了额外的功能,云提供商还有其他可以连接到服务的应用和服务。例如,如果你想将所有设备发送的所有遥测消息存储在一个数据库中,通常只需在云提供商的配置工具中点击几次即可将服务连接到数据库并将数据流传输进来。
现在你已经有了Azure订阅,你可以注册一个物联网服务。微软的物联网服务称为Azure IoT Hub。

下面的视频对Azure IoT Hub进行了简短的概述:
点击上面的图像观看视频
✅ 花点时间做一些研究,阅读 Microsoft IoT Hub 文档 中的IoT Hub概述。
Azure中可用的服务可以通过基于Web的门户或命令行界面(CLI)进行配置。对于这个任务,你将使用CLI。
要使用Azure CLI,首先必须将其安装在你的PC或Mac上。
按照 Azure CLI 文档 中的说明安装CLI。
Azure CLI 支持许多扩展,这些扩展增加了管理各种Azure服务的能力。通过运行以下命令从命令行或终端安装IoT扩展:
az extension add --name azure-iot
从命令行或终端运行以下命令,通过Azure CLI登录到你的Azure订阅。
az login
会在默认浏览器中打开一个网页。使用你注册Azure订阅时使用的帐户登录。登录后,你可以关闭浏览器标签。
如果你有多个Azure订阅,比如学校提供的一个,以及你自己的Azure for Students订阅,你需要选择要使用的订阅。运行以下命令列出你有权访问的所有订阅:
az account list --output table
在输出中,你会看到每个订阅的名称及其 SubscriptionId。
➜ ~ az account list --output table Name CloudName SubscriptionId State IsDefault ---------------------- ----------- ------------------------------------ ------- ----------- School-subscription AzureCloud cb30cde9-814a-42f0-a111-754cb788e4e1 Enabled True Azure for Students AzureCloud fa51c31b-162c-4599-add6-781def2e1fbf Enabled False
要选择你要使用的订阅,请使用以下命令:
az account set --subscription <SubscriptionId>
替换 <SubscriptionId> with the Id of the subscription you want to use. After running this command, re-run the command to list your accounts. You will see the IsDefault column will be marked as True 为你刚刚设置的订阅。
Azure服务,如IoT Hub实例、虚拟机、数据库或AI服务,被称为 资源。每个资源都必须存在于一个 资源组 中,这是一个逻辑分组,包含一个或多个资源。
使用资源组意味着你可以一次管理多个服务。例如,一旦完成了这个项目的所有课程,你可以删除资源组,其中的所有资源将自动被删除。
Azure在全球各地有多处数据中心,分为区域。当你创建Azure资源或资源组时,必须指定创建的位置。运行以下命令获取位置列表:
az account list-locations --output table
你会看到一个位置列表。这个列表会很长。
在撰写本文时,你可以部署到65个位置。
➜ ~ az account list-locations --output table DisplayName Name RegionalDisplayName ------------------------ ------------------- ------------------------------------- East US eastus (US) East US East US 2 eastus2 (US) East US 2 South Central US southcentralus (US) South Central US ...
记下 Name column of the region closest to you. You can find the regions on a map on the Azure geographies page.
Run the following command to create a resource group called soil-moisture-sensor 中的值。资源组名称在你的订阅中必须是唯一的。
az group create --name soil-moisture-sensor \ --location <location>
替换 <location> 为你在上一步中选择的位置。
你现在可以在资源组中创建一个IoT Hub资源。
使用以下命令创建你的IoT Hub资源:
az iot hub create --resource-group soil-moisture-sensor \ --sku F1 \ --partition-count 2 \ --name <hub_name>
替换 <hub_name> with a name for your hub. This name needs to be globally unique - that is no other IoT Hub created by anyone can have the same name. This name is used in a URL that points to the hub, so needs to be unique. Use something like soil-moisture-sensor- and add a unique identifier on the end, like some random words or your name.
The --sku F1 option tells it to use a free tier. The free tier supports 8,000 messages a day along with most of the features of the full-price tiers.
Different pricing levels of Azure services are referred to as tiers. Each tier has a different cost and provides different features or data volumes.
If you want to learn more about pricing, you can check out the Azure IoT Hub pricing guide.
The --partition-count 2 选项定义了IoT Hub支持的数据流数量,更多的分区减少了当多个事物从IoT Hub读取和写入时的数据阻塞。分区超出了这些课程的范围,但创建免费层IoT Hub时需要设置此值。
每个订阅只能有一个免费层IoT Hub。
IoT Hub将被创建。这可能需要一两分钟才能完成。
在上一课中,你使用了MQTT并在不同的主题上发送消息,不同的主题有不同的用途。而不是通过不同的主题发送消息,IoT Hub有几种定义好的方式供设备与Hub通信,或供Hub与设备通信。
在底层,IoT Hub与你的设备之间的通信可以使用MQTT、HTTPS或AMQP。
设备到云(D2C)消息 - 这些是从设备发送到IoT Hub的消息,例如遥测数据。然后,你的应用程序代码可以从IoT Hub读取这些消息。
在底层,IoT Hub使用一个名为 Event Hubs 的Azure服务。当你编写代码来读取发送到枢纽的消息时,这些通常被称为事件。
云到设备(C2D)消息 - 这些是从应用程序代码通过IoT Hub发送到IoT设备的消息。
直接方法请求 - 这些是从应用程序代码通过IoT Hub发送到IoT设备的消息,要求设备执行某些操作,如控制执行器。这些消息需要响应,以便你的应用程序代码可以判断是否成功处理。
设备双胞胎 - 这些是保持在设备和IoT Hub之间同步的JSON文档,用于存储设备报告的设置或其他属性,或应由IoT Hub设置在设备上的(称为期望)。
IoT Hub可以将消息和直接方法请求存储一段时间(默认为一天),因此即使设备或应用程序代码失去连接,它也可以在重新连接后检索离线期间发送的消息。设备双胞胎永久保存在IoT Hub中,因此任何时候设备都可以重新连接并获取最新的设备双胞胎。
在创建中心后,您的物联网设备就可以连接到它。只有注册的设备才能连接到服务,因此您需要先注册您的设备。注册后,您可以获取一个连接字符串,该字符串可用于设备连接。此连接字符串是针对特定设备的,并包含有关物联网中心、设备以及允许该设备连接的秘密密钥的信息。
连接字符串是一段包含连接详细信息的文本。这些用于连接到物联网中心、数据库和其他许多服务。它们通常由服务标识符(如URL)和服务安全信息(如秘密密钥)组成。这些信息会被传递给SDK以连接到服务。
⚠️ 请确保将连接字符串保密!安全性将在以后的课程中详细介绍。
您可以使用Azure CLI将物联网设备注册到您的物联网中心。
运行以下命令以注册设备:
az iot hub device-identity create --device-id soil-moisture-sensor \ --hub-name <hub_name>
将<hub_name> with the name you used for your IoT Hub.
This will create a device with an ID of soil-moisture-sensor中的内容替换为您的物联网中心名称。
当您的物联网设备通过SDK连接到您的物联网中心时,它需要使用一个包含中心URL和秘密密钥的连接字符串。运行以下命令以获取连接字符串:
az iot hub device-identity connection-string show --device-id soil-moisture-sensor \ --output table \ --hub-name <hub_name>
将<hub_name>替换为您为物联网中心使用的名称。
将显示的连接字符串保存下来,因为您稍后会需要它。
按照相关指南连接您的物联网设备到云端:
目前,您不会更新服务器代码。相反,您可以使用Azure CLI监控来自物联网设备的消息。
确保您的物联网设备正在运行并发送土壤湿度遥测值。
在命令提示符或终端中运行以下命令以监控发送到物联网中心的消息:
az iot hub monitor-events --hub-name <hub_name>
将<hub_name>替换为您为物联网中心使用的名称。
您将看到消息出现在控制台输出中,当它们由您的物联网设备发送时。
Starting event monitor, use ctrl-c to stop... { "event": { "origin": "soil-moisture-sensor", "module": "", "interface": "", "component": "", "payload": "{\"soil_moisture\": 376}" } }, { "event": { "origin": "soil-moisture-sensor", "module": "", "interface": "", "component": "", "payload": "{\"soil_moisture\": 381}" } }
payload will match the message sent by your IoT device.
At the time of writing, the
az iot扩展在Apple Silicon上尚未完全工作。如果您使用的是Apple Silicon设备,则需要以不同的方式监控消息,例如使用Azure IoT Tools for Visual Studio Code。
这些消息自动附加了一些属性,例如它们被发送的时间戳。这些被称为“注释”。要查看所有消息注释,请使用以下命令:
az iot hub monitor-events --properties anno --hub-name <hub_name>
将<hub_name>替换为您为物联网中心使用的名称。
您将看到消息出现在控制台输出中,当它们由您的物联网设备发送时。
Starting event monitor, use ctrl-c to stop... { "event": { "origin": "soil-moisture-sensor", "module": "", "interface": "", "component": "", "properties": {}, "annotations": { "iothub-connection-device-id": "soil-moisture-sensor", "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}", "iothub-connection-auth-generation-id": "637553997165220462", "iothub-enqueuedtime": 1619976150288, "iothub-message-source": "Telemetry", "x-opt-sequence-number": 1379, "x-opt-offset": "550576", "x-opt-enqueued-time": 1619976150277 }, "payload": "{\"soil_moisture\": 381}" } }
注释中的时间值是以UNIX时间表示的,即自1970年1月1日午夜以来的秒数。
完成监控后退出。
您还可以使用Azure CLI调用直接方法来控制您的物联网设备。
在命令提示符或终端中运行以下命令以调用名为relay_on的方法:
az iot hub invoke-device-method --device-id soil-moisture-sensor \ --method-name relay_on \ --method-payload '{}' \ --hub-name <hub_name>
将<hub_name> with the name you used for your IoT Hub.
This sends a direct method request for the method specified by method-name. Direct methods can take a payload containing data for the method, and this can be specified in the method-payload参数替换为JSON格式的内容。
您将看到继电器开启,并且物联网设备的相应输出:
Direct method received - relay_on
重复上述步骤,但将--method-name to relay_off。您将看到继电器关闭,并且物联网设备的相应输出。
物联网中心的免费层级每天允许发送8,000条消息。您编写的代码每10秒发送一条遥测消息。每10秒发送一条消息一天会发送多少条消息?
考虑土壤湿度测量应多久发送一次?如何更改您的代码以保持在免费层级内并按需检查,但又不过于频繁?如果想添加第二个设备该怎么办?
物联网中心SDK对Arduino和Python都是开源的。在GitHub上的代码仓库中有许多示例展示了如何使用不同的物联网中心功能。
声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。