跳至主要内容

將您的植物遷移到雲端

本課程的手繪筆記概述

手繪筆記由 Nitya Narasimhan 提供。點擊圖片查看大圖。

本課程是 IoT 01 for Beginners Project 2 - Digital Agriculture series 的一部分,由 Microsoft Reactor 提供。

將您的設備連接到 Azure IoT Hub

課前測驗

課前測驗

介紹

在上一課中,您學會了如何將您的植物連接到 MQTT broker 並從本地運行的服務器代碼控制繼電器。這構成了從家中單個植物到商業農場使用的互聯網連接自動灌溉系統的核心。

IoT 設備與公共 MQTT broker 通信以演示原理,但這不是最可靠或最安全的方式。在本課中,您將了解雲端以及公共雲服務提供的 IoT 功能。您還將學習如何將您的植物從公共 MQTT broker 遷移到這些雲服務之一。

在本課中,我們將涵蓋:

什麼是雲端?

在雲端出現之前,當公司想要為其員工(例如數據庫或文件存儲)或公眾(例如網站)提供服務時,他們會建立並運行數據中心。這範圍從一個有少量計算機的房間到一個有許多計算機的建築。公司將管理所有事情,包括:

  • 購買計算機
  • 硬件維護
  • 電力和冷卻
  • 網絡
  • 安全,包括保護建築物和保護計算機上的軟件
  • 軟件安裝和更新

這可能非常昂貴,需要廣泛的技術員工,並且在需要時變更非常緩慢。例如,如果一家在線商店需要為繁忙的假期季節做準備,他們需要提前幾個月計劃購買更多硬件,配置它,安裝它並安裝運行銷售流程的軟件。假期季節結束後,銷售量下降,他們將留下已支付的計算機閒置,直到下一個繁忙季節。

✅ 您認為這會讓公司快速行動嗎?如果一家在線服裝零售商因名人穿著他們的衣服而突然流行起來,他們能夠快速增加計算能力以支持突然湧入的訂單嗎?

別人的計算機

雲端經常被戲稱為“別人的計算機”。最初的想法很簡單——與其購買計算機,不如租用別人的計算機。另一方,即雲計算提供商,將管理巨大的數據中心。他們將負責購買和安裝硬件,管理電力和冷卻,網絡,建築安全,硬件和軟件更新,所有事情。作為客戶,您將租用所需的計算機,隨著需求的增加而租用更多,然後在需求下降時減少租用的數量。這些雲數據中心遍布全球。

一個 Microsoft 雲數據中�心 一個 Microsoft 雲數據中心計劃擴展

這些數據中心的面積可以達到數平方公里。上面的圖片是幾年前在一個 Microsoft 雲數據中心拍攝的,顯示了初始規模以及計劃的擴展。為擴展清理的區域超過 5 平方公里。

💁 這些數據中心需要如此大量的電力,以至於有些數據中心擁有自己的發電站。由於其規模和雲提供商的投資水平,它們通常非常環保。它們比大量的小型數據中心更高效,主要使用可再生能源運行,雲提供商努力減少浪費,減少用水,並重新種植森林以彌補為建造數據中心而砍伐的樹木。您可以在 Azure 可持續性網站 上閱讀更多關於一個雲提供商如何致力於可持續性的內容。

✅ 做一些研究:閱讀主要的雲服務,例如 Microsoft 的 AzureGoogle 的 GCP。他們有多少數據中心,這些數據中心位於世界的哪些地方?

使用雲端可以降低公司的成本,並使他們能夠專注於他們最擅長的事情,將雲計算專業知識留給提供商。公司不再需要租用或購買數據中心空間,向不同的提供商支付連接和電力費用,或僱用專家。相反,他們可以向雲提供商支付一個月的賬單,讓所有事情都得到處理。

雲提供商可以利用規模經濟來降低成本,批量購買計算機以降低成本,投資工具以減少維護工作量,甚至設計和建造自己的硬件以改進其雲服務。

Microsoft Azure

Azure 是 Microsoft 的開發者雲,您將在這些課程中使用這個雲。下面的視頻簡要介紹了 Azure:

Azure 概述視頻

創建雲訂閱

要使用雲中的服務,您需要註冊雲提供商的訂閱。在本課中,您將註冊 Microsoft Azure 訂閱。如果您已經有 Azure 訂閱,則可以跳過此任務。此處描述的訂閱詳細信息在撰寫本文時是正確的,但可能會更改。

💁 如果您通過學校訪問這些課程,您可能已經有一個 Azure 訂閱。請與您的老師確認。

您可以註冊兩種類型的免費 Azure 訂閱:

  • Azure for Students - 這是一個為 18 歲以上學生設計的訂閱。您不需要信用卡即可註冊,並且使用您的學校電子郵件地址驗證您是學生。註冊後,您將獲得 100 美元的雲資源使用額,以及包括免費版本的 IoT 服務在內的免費服務。這持續 12 個月,並且您每年都可以續訂,只要您仍然是學生。

  • Azure 免費訂閱 - 這是為非學生設計的訂閱。您需要信用卡才能註冊訂閱,但您的卡不會被扣款,這僅用於驗證您是真人而不是機器人。您在前 30 天內獲得 200 美元的信用額度,可用於任何服務,以及 Azure 服務的免費層。一旦您的信用額度用完,除非您轉換為按需付費訂閱,否則您的卡不會被扣款。

💁 Microsoft 確實為 18 歲以下的學生提供 Azure for Students Starter 訂閱,但在撰寫本文時,這不支持任何 IoT 服務。

任務 - 註冊免費雲訂閱

如果您是 18 歲以上的學生,則可以註冊 Azure for Students 訂閱。您需要使用學校電子郵件地址進行驗證。您可以通過以下兩種方式之一進行操作:

  • education.github.com/pack 註冊 GitHub 學生開發者包。這使您可以訪問一系列工具和優惠,包括 GitHub 和 Microsoft Azure。註冊開發者包後,您可以激活 Azure for Students 優惠。

  • 直接在 azure.microsoft.com/free/students 註冊 Azure for Students 帳戶。

⚠️ 如果您的學校電子郵件地址未被識別,請在此 repo 中提出 問題,我們將查看是否可以將其添加到 Azure for Students 允許列表中。

如果您不是學生,或者您沒有有效的學校電子郵件地址,則可以註冊 Azure 免費訂閱。

雲 IoT 服務

您一直在使用的公共測試 MQTT broker 是一個很好的學習工具,但作為商業設置中的工具有一些缺點:

  • 可靠性 - 這是一個免費服務,沒有保證,隨時可能關閉
  • 安全性 - 它是公共的,因此任何人都可以監聽您的遙測數據或發送命令來控制您的硬件
  • 性能 - 它設計僅用於少量測試消息,因此無法應對大量消息的發送
  • 發現 - 無法知道連接了哪些設備

雲中的 IoT 服務解決了這些問題。它們由大型雲提供商維護,這些提供商在可靠性方面投入巨大,並隨時解決可能出現的任何問題。它們內置了安全性,以防止黑客閱讀您的數據或發送惡意命令。它們還具有高性能,能夠每天處理數百萬條消息,利用雲端根據需要進行擴展。

💁 雖然您需要支付每月費用來獲得這些優點,但大多數雲提供商提供免費版本的 IoT 服務,每天限制消息數量或可連接的設備數量。這個免費版本通常足夠開發者學習該服務。在本課中,您將使用免費版本。

IoT 設備通過設備 SDK(提供代碼以使用服務功能的庫)或直接通過通信協議(如 MQTT 或 HTTP)連接到雲服務。設備 SDK 通常是最簡單的路徑,因為它處理所有事情,例如知道要發布或訂閱的主題以及如何處理安全性。

設備使用設備 SDK 連接到服務。服務器代碼也通過 SDK 連接到服務

然後,您的設備通過此服務與應用程序的其他部分通信——類似於您通過 MQTT 發送遙測數據和接收命令。這通常使用服務 SDK 或類似的庫。消息從您的設備發送到服務,然後應用程序的其他組件可以讀取它們,並且可以將消息發送回您的設備。

沒有有效密鑰的設備無法連接到 IoT 服務

這些服務通過了解所有可以連接和發送數據的設備來實現安全性,無論是通過預先註冊設備還是通過給設備提供密鑰或證書,這些密鑰或證書可用於首次連接時自動註冊自己。未知設備無法連接,如果它們嘗試,服務將拒絕連接並忽略它們發送的消息。

✅ 做一些研究:開放的 IoT 服務允許任何設備或代碼連接的缺點是什麼?您能找到黑客利用這一點的具體例子嗎?

應用程序的其他組件可以連接到 IoT 服務,了解所有已連接或註冊的設備,並直接或批量與它們通信。

💁 IoT 服務還實現了額外的功能,雲提供商有額外的服務和應用程序可以連接到服務。例如,如果您想將所有設備發送的所有遙測消息存儲在數據庫中,通常只需在雲提供商的配置工具中點擊幾下即可將服務連接到數據庫並將數據流入。

在雲中創建 IoT 服務

現在您已經有了 Azure 訂閱,您可以註冊 IoT 服務。Microsoft 的 IoT 服務稱為 Azure IoT Hub。

Azure IoT Hub 標誌

下面的視頻簡要介紹了 Azure IoT Hub:

Azure IoT Hub 概述視頻

🎥 點擊上面的圖片觀看視頻

✅ 花點時間做一些研究,閱讀 Microsoft IoT Hub 文檔 中的 IoT Hub 概述。

Azure 中可用的雲服務可以通過基於 Web 的門戶或命令行界面(CLI)進行配置。對於此任務,您將使用 CLI。

任務 - 安裝 Azure CLI

要使用 Azure CLI,首先必須在您的 PC 或 Mac 上安裝它。

  1. 按照 Azure CLI 文檔 中的說明安裝 CLI。

  2. Azure CLI 支持許多擴展,這些擴展增加了管理各種 Azure 服務的功能。通過在命令行或終端中運行以下命令安裝 IoT 擴展:

    az extension add --name azure-iot
  3. 從命令行或終端運行以下命令,以從 Azure CLI 登錄到您的 Azure 訂閱。

    az login

    將在您的默認瀏覽器中啟動一個網頁。使用您用於註冊 Azure 訂閱的帳戶登錄。登錄後,您可以關閉瀏覽器標籤。

  4. 如果您有多個 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> 替換為您要使用的訂閱的 ID。運行此命令後,重新運行列出您的帳戶的命令。您將看到 IsDefault 列將標記為 True,表示您剛剛設置的訂閱。

任務 - 創建資源組

Azure 服務,例如 IoT Hub 實例、虛擬機、數據庫或 AI 服務,被稱為 資源。每個資源都必須位於 資源組 中,這是一個或多個資源的邏輯分組。

💁 使用資源組意味著您可以一次管理多個服務。例如,一旦您完成了本項目的所有課程,您可以刪除資源組,並且其中的所有資源將自動刪除。

  1. 全球有多個 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 列中的值。您可以在 Azure 地理位置頁面 上的地圖上找到這些區域。

  2. 運行以下命令創建一個名為 soil-moisture-sensor 的資源組。資源組名稱在您的訂閱中必須唯一。

    az group create --name soil-moisture-sensor \
    --location <location>

    <location> 替換為您在上一步中選擇的位置。

任務 - 創建 IoT Hub

現在您可以在資源組中創建 IoT Hub 資源。

  1. 使用以下命令創建您的 IoT Hub 資源:

    az iot hub create --resource-group soil-moisture-sensor \
    --sku F1 \
    --partition-count 2 \
    --name <hub_name>

    <hub_name> 替換為您的 hub 名稱。此名稱必須是全球唯一的——即任何人創建的其他 IoT Hub 都不能具有相同的名稱。此名稱用於指向 hub 的 URL,因此需要唯一。使用類似 soil-moisture-sensor- 的名稱,並在末尾添加唯一標識符,例如一些隨機單詞或您的名字。

    --sku F1 選項告訴它使用免費層。免費層支持每天 8,000 條消息以及大多數全價層的功能。

    🎓 Azure 服務的不同定價級別稱為層。每個層都有不同的成本,並提供不同的功能或數據量。

    💁 如果您想了解更多關於定價的信息,可以查看 Azure IoT Hub 定價指南

    --partition-count 2 選項定義了 IoT Hub 支持的數據流數量,更多的分區減少了多個讀寫 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 服務。當您編寫代碼以讀取發送到 hub 的消息時,這些通常稱為事件。

  • 雲到設備(C2D)消息 - 這些是從應用程序代碼發送的消息,通過 IoT Hub 發送到 IoT 設備

  • 直接方法請求 - 這些是從應用程序代碼通過 IoT Hub 發送到 IoT 設備的消息,請求設備執行某些操作,例如控制執行器。這些消息需要響應,以便您的應用程序代碼可以知道它是否成功處理。

  • 設備雙胞胎 - 這些是保持在設備和 IoT Hub 之間同步的 JSON 文檔,用於存儲設備報告的設置或其他屬性,或應由 IoT Hub 設置在設備上的屬性(稱為期望屬性)。

IoT Hub 可以存儲消息和直接方法請求一段可配置的時間(默認為一天),因此如果設備或應用程序代碼失去連接,它可以在重新連接後檢索離線期間發送的消息。設備雙胞胎永久保存在 IoT Hub 中,因此設備可以隨時重新連接並獲取最新的設備雙胞胎。

✅ 做一些研究:在 IoT Hub 文檔中閱讀更多關於這些消息類型的信息,請參閱 設備到雲通信指南雲到設備通信指南

將您的設備連接到 IoT 服務

一旦創建了 hub,您的 IoT 設備就可以連接到它。只有註冊的設備才能連接到服務,因此您需要先註冊您的設備。註冊時,您可以獲得設備可以用來連接的連接字符串。此連接字符串是設備特定的,包含有關 IoT Hub、設備和允許此設備連接的密鑰的信息。

🎓 連接字符串是一個通用術語,指包含連接詳細信息的一段文本。這些在連接到 IoT Hub、數據庫和許多其他服務時使用。它們通常由服務的標識符(例如 URL)和安全信息(例如密鑰)組成。這些傳遞給 SDK 以連接到服務。

⚠️ 連接字符串應保持安全!安全性將在未來的課程中詳細介紹。

任務 - 註冊您的 IoT 設備

可以使用 Azure CLI 註冊 IoT 設備。

  1. 運行以下命令註冊設備:

    az iot hub device-identity create --device-id soil-moisture-sensor \
    --hub-name <hub_name>

    <hub_name> 替換為您用於 IoT Hub 的名稱。

    這將創建一個 ID 為 soil-moisture-sensor 的設備。

  2. 當您的 IoT 設備使用 SDK 連接到您的 IoT Hub 時,它需要使用一個連接字符串,該字符串提供 hub 的 URL 以及密鑰。運行以下命令以獲取連接字符串:

    az iot hub device-identity connection-string show --device-id soil-moisture-sensor \
    --output table \
    --hub-name <hub_name>

    <hub_name> 替換為您用於 IoT Hub 的名稱。

  3. 存儲顯示的連接字符串,因為您稍後會需要它。

任務 - 將您的 IoT 設備連接到雲端

按照相關指南將您的 IoT 設備連接到雲端:

任務 - 監控事件

目前,您不會更新您的服務器代碼。相反,您可以使用 Azure CLI 監控來自您的 IoT 設備的事件。

  1. 確保您的 IoT 設備正在運行並發送土壤濕度遙測值

  2. 在命令提示符或終端中運行以下命令以監控發送到您的 IoT Hub 的消息:

    az iot hub monitor-events --hub-name <hub_name>

    <hub_name> 替換為您用於 IoT Hub 的名稱。

    您將在控制台輸出中看到消息,這些消息是由您的 IoT 設備發送的。

    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 的內容將與您的 IoT 設備發送的消息匹配。

    在撰寫本文時,az iot 擴展在 Apple Silicon 上尚未完全工作。如果您使用的是 Apple Silicon 設備,則需要使用其他方式監控消息,例如使用 Visual Studio Code 的 Azure IoT 工具

  3. 這些消息自動附加了一些屬性,例如發送的時間戳。這些稱為 註釋。要查看所有消息註釋,請使用以下命令:

    az iot hub monitor-events --properties anno --hub-name <hub_name>

    <hub_name> 替換為您用於 IoT Hub 的名稱。

    您將在控制台輸出中看到消息,這些消息是由您的 IoT 設備發送的。

    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 日午夜以來的秒數。

    完成後退出事件監控。

任務 - 控制您的 IoT 設備

您還可以使用 Azure CLI 調用 IoT 設備上的直接方法。

  1. 在命令提示符或終端中運行以下命令以調用 IoT 設備上的 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> 替換為您用於 IoT Hub 的名稱。

    這會發送一個直接方法請求,請求的方法由 method-name 指定。直接方法可以接受包含方法數據的有效負載,這可以在 method-payload 參數中作為 JSON 指定。

    您將看到繼電器打開,並看到來自您的 IoT 設備的相應輸出:

    Direct method received -  relay_on
  2. 重複上述步驟,但將 --method-name 設置為 relay_off。您將看到繼電器關閉,並看到來自 IoT 設備的相應輸出。


🚀 挑戰

IoT Hub 的免費層每天允許 8,000 條消息。您編寫的代碼每 10 秒發送一條遙測消息。每 10 秒一條消息每天是多少條消息?

考慮一下應該多久發送一次土壤濕度測量值?如何更改您的代碼以保持在免費層內並根據需要檢查但不過於頻繁?如果您想添加第二個設備怎麼辦?

課後測驗

課後測驗

回顧與自學

IoT Hub SDK 是開源的,適用於 Arduino 和 Python。在 GitHub 上的代碼庫中,有許多示例顯示如何使用不同的 IoT Hub 功能。

作業

了解雲服務