共用方式為


教學課程:使用 IoT Edge for Linux on Windows 開發利用 Linux 容器的 IoT Edge 模組

適用於:IoT Edge 1.4 核取記號 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 為支援的版本 (部分機器翻譯)。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge

本教學課程會逐步引導您使用 IoT Edge for Linux on Windows 和 Visual Studio 2022 開發、偵錯及部署您自己的程式碼至 IoT Edge 裝置。 透過將 C# 模組部署到 Linux 裝置,您將了解 IoT Edge 解決方案最常見的開發人員案例。 您將部署和偵錯在 Windows 上 Linux 容器中執行的自訂 Azure IoT Edge 模組 (EFLOW)。 即使您打算使用不同的語言或部署 Azure 服務,本教學課程對於了解開發工具和概念還是很有用。

本文包含適用於兩個 IoT Edge 開發工具的步驟:

  • 命令行介面 (CLI) 是開發慣用的工具。
  • Azure IoT Edge tools for Visual Studio 延伸模組。 此延伸模組目前處於維修模式

請使用本文開頭的工具選取器按鈕選取工具版本。

在本教學課程中,您會了解如何:

  • 設定開發機器。
  • 使用 IoT Edge Tools for Visual Studio Code 來建立新專案。
  • 將專案建置為容器,並儲存在 Azure Container Registry。
  • 將程式碼部署至 IoT Edge 裝置。

必要條件

本文假設您使用執行 Windows 的電腦做為開發電腦。 在 Windows 電腦上,您可以開發 Windows 或 Linux 模組。 本教學課程會逐步引導您開發 Linux 容器、使用 IoT Edge for Linux on Windows,以建置和部署模組。

Visual Studio 2022 備妥之後,您也需要下列工具和元件:

  • 從 Visual Studio Marketplace 下載並安裝 Azure IoT Edge Tools。 您可以使用 Azure IoT Edge Tools 延伸模組來建立和建置 IoT Edge 解決方案。 慣用的開發工具是命令列 (CLI) Azure IoT Edge 開發工具。 此延伸模組包含用來建立 Visual Studio 專案的 Azure IoT Edge 專案範本。 目前,不論您使用的開發工具為何,都需要安裝延伸模組。

    重要

    適用於 VS 2022 的 Azure IoT Edge Tools 延伸模組目前處於維修模式。 慣用的開發工具是命令列 (CLI) Azure IoT Edge 開發工具

    提示

    如果您使用 Visual Studio 2019,請從 Visual Studio 市集下載並安裝適用於 VS 2019 的 Azure IoT Edge Tools

雲端資源:

  • 在 Azure 中擁有免費或標準層的 IoT 中樞

如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶

重要概念

本教學課程會逐步引導您開發 IoT Edge 模組。 「IoT Edge 模組」(有時簡稱為「模組」) 是含有可執行程式碼的容器。 您可以在 IoT Edge 裝置中部署一或多個模組。 模組會執行特定工作,例如從感應器擷取資料、清除及分析資料,或對 IoT 中樞傳送訊息。 如需詳細資訊,請參閱了解 Azure IoT Edge 模組

在開發 IoT Edge 模組時,請務必了解開發機器和作為模組最終部署位置的目標 IoT Edge 裝置之間有何差異。 為了保存模組程式碼所建置的容器必須符合「目標裝置」的作業系統 (OS)。 例如,最常見的情況是有人在 Windows 電腦上開發模組,卻又打算以執行 IoT Edge 的 Linux 裝置作為適用對象。 在此情況下,容器的作業系統會是 Linux。 當您進行本教學課程時,請牢記「開發機器 OS」和「容器 OS」之間的差異。 在本教學課程中,您將使用 Windows 主機進行開發,以及使用 IoT Edge for Linux on Windows (EFLOW) VM 建置和部署模組。

本教學課程以使用 Linux 容器執行 IoT Edge 的裝置為適用對象。 您可以使用慣用的作業系統,只要您的開發機器執行 Linux 容器即可。 建議您使用 Visual Studio 與 Linux 容器進行開發,本教學課程也是這麼做的。 您也可以使用 Visual Studio Code,但這兩種工具的支援有所差異。 如需深入了解,請參閱使用 Visual Studio Code 開發 Azure IoT Edge 模組

設定 docker-cli 和 Docker 引擎遠端連線

IoT Edge 模組會封裝為容器,因此開發機器上必須有容器引擎才能建置和管理容器。 EFLOW 虛擬機器已經包含 Docker 引擎的執行個體,因此本教學課程說明如何從 Windows 開發人員機器遠端連線到 EFLOW VM Docker 執行個體。 使用此方式,我們會移除適用於 Windows 的 Docker Desktop 上的相依性。

第一個步驟是在 Windows 開發機器上設定 docker-cli,以便能夠連線到遠端 Docker 引擎。

  1. docker-cli Chocolatey 下載 docker-cli 的先行編譯 docker.exe 版本。 您也可以從 docker/cli GitHub 下載官方 cli 專案,並遵循存放庫指示進行編譯。
  2. docker.exe 擷取至開發機器中的目錄。 例如,C:\Docker\bin
  3. 開啟 [關於您的電腦] ->[系統資訊] ->[進階系統設定]
  4. 選取 [進階] ->[環境變數] -> 在 [使用者變數] 底下檢查 [路徑]
  5. 編輯路徑變數,並新增 docker.exe 的位置
  6. 開啟提升權限的 PowerShell 工作階段
  7. 使用命令檢查 Docker CLI 是否可供存取
    docker --version
    

如果一切都成功設定,則上一個命令應該輸出 docker 版本,例如 Docker 20.10.12 版,建置 e91ed57

第二個步驟是設定 EFLOW 虛擬機器 Docker 引擎以接受外部連線,並新增適當的防火牆規則。

警告

將 Docker 引擎公開至外部連線可能會增加安全性風險。 此設定應僅用於開發目的。 完成開發之後,請務必將設定還原為預設設定。

  1. 開啟提升權限的 PowerShell 工作階段,並執行下列命令

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    以下是範例輸出。

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. 最後一個步驟是測試 Docker 與 EFLOW VM Docker 引擎的連線。 首先,您需要 EFLOW VM IP 位址。

    Get-EflowVmAddr
    

    提示

    如果 EFLOW VM 部署時沒有靜態 IP,則在 Windows 主機 OS 重新啟動或網路變更之間,IP 位址可能會變更。 在每次您想要建立遠端 Docker 引擎連線時,請務必使用正確的 EFLOW VM IP 位址。

    以下是範例輸出。

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. 使用取得的 IP 位址,連線到 EFLOW VM Docker 引擎,然後執行 Hello-World 範例容器。 將 <EFLOW-VM-IP> 取代為上一個步驟中取得的 EFLOW VM IP 位址。

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    您應該會看到正在下載容器,之後將會執行並輸出下列內容。

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

建立 Azure IoT Edge 專案

Visual Studio 中的 IoT Edge 專案範本可建立一個解決方案,可以部署到 IoT Edge 裝置。 首先要建立 Azure IoT Edge 解決方案,然後在該解決方案中產生第一個模組。 每個 IoT Edge 解決方案都可以包含多個模組。

重要

Visual Studio 所建立的 IoT Edge 專案結構與 Visual Studio Code 中的 IoT Edge 專案結構不同。

目前,Azure IoT Edge 開發工具 CLI 不支援建立 Visual Studio 專案類型。 您必須使用 Visual Studio IoT Edge 延伸模組來建立 Visual Studio 專案。

  1. 在 Visual Studio 中,建立新專案。

  2. 在 [建立新專案] 分頁,搜尋 Azure IoT Edge。 選取符合平台 (Linux IoT Edge 模組) 和適用 IoT Edge 裝置之架構的專案,然後選取 [下一步]

  3. 在 [設定新專案] 分頁,輸入您專案的名稱並指定位置,然後選取 [建立]

  4. 在 [新增模組] 視窗中,選取您想要開發模組的類型。 您也可以選取 [現有的模組],將現有的 IoT Edge 模組新增至您的部署。 指定您的模組名稱和模組映像存放庫。

  5. 在 [存放庫 URL] 中,提供模組映像存放庫的名稱。 Visual Studio 會自動以 localhost:5000/<您的模組名稱>填入模組名稱。 請使用您自己的登錄資訊加以取代。 如果您使用本機 Docker 登錄來進行測試,請使用 localhost。 如果您使用 Azure Container Registry,則請使用登錄設定中的登入伺服器。 登入伺服器看起來像 *<登錄名稱>*.azurecr.io。 僅取代字串的 localhost:5000 部分即可,因此最後的結果看起來像 *<登錄名稱>.azurecr.io/<您的模組名稱>

  6. 選取 [新增] 將模組新增至專案。

    螢幕擷取畫面:如何將應用程式和模組新增至 Visual Studio 解決方案

    注意

    如果您有現有的 IoT Edge 專案,可以開啟 module.json 檔案來變更存放庫 URL。 存放庫 URL 位於 JSON 檔案的 repository 屬性中。

現在,您的 Visual Studio 解決方案中有 IoT Edge 專案和 IoT Edge 模組。

專案結構

在您的解決方案中,有兩個專案層級資料夾,包括主要專案資料夾和單一模組資料夾。 例如,您可能有名為 AzureIotEdgeApp1 的主要專案資料夾,以及名為 IotEdgeModule1 的模組資料夾。 主要專案資料夾包含您的部署資訊清單。

模組資料夾包含模組程式碼的檔案,名稱為 Program.csmain.c,取決於您所選擇的語言。 此資料夾也包含名為 module.json 的檔案,其中描述模組的中繼資料。 各種 Docker 檔案提供建置模組做為 Windows 或 Linux 容器所需的資訊。

專案的部署資訊清單

您要編輯的部署資訊清單稱為 deployment.debug.template.json。 此檔案是 IoT Edge 部署資訊清單的範本,可定義在裝置上執行的所有模組,以及其彼此通訊的方式。 如需部署資訊清單的詳細資訊,請參閱了解如何部署模組及建立路由

如果您開啟此部署範本,會看到包含了兩個執行階段模組:edgeAgentedgeHub,以及您在此 Visual Studio 專案中建立的自訂模組。 另外也包含名為 SimulatedTemperatureSensor 的第四個模組。 此預設模組會產生模擬資料,可供您用來測試模組,或視需要進行刪除。 若要查看模擬溫度感應器的運作方式,請檢視 SimulatedTemperatureSensor.csproj 原始程式碼

設定 IoT Edge 執行階段版本

目前,最新的穩定執行階段版本是 1.4 版。 您應該將 IoT Edge 執行階段版本更新為最新的穩定版本,或您想要針對裝置設定目標的版本。

  1. 在方案總管中,以滑鼠右鍵按一下主要專案的名稱,然後選取 [設定 IoT Edge 執行階段版本]

    螢幕擷取畫面:如何尋找及選取名為 [設定 IoT Edge 執行階段版本] 的功能表項目。

  2. 使用下拉式功能表來選擇 IoT Edge 裝置正在執行的執行階段版本,然後選取 [確定] 以儲存變更。 如果未進行任何變更,請選取 [取消] 以結束。

    目前,延伸模組不包含最新執行階段版本的選取項目。 如果您想要設定高於 1.2 的執行階段版本,請開啟 deployment.debug.template.json 部署資訊清單檔。 變更系統執行時間模組映像 edgeAgentedgeHub 的執行時間版本。 例如,如果您想要使用 IoT Edge 執行時間 1.4 版,請在部署資訊清單檔中變更下列幾行:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. 如果您已變更版本,請以滑鼠右鍵按一下專案的名稱,然後選取 [為 IoT Edge 產生部署],以重新產生部署資訊清單。 這會根據您的部署範本產生部署資訊清單,並會出現在 Visual Studio 專案的 config 資料夾中。

  1. 開啟 deployment.debug.template.json 部署資訊清單檔。 部署資訊清單是一份 JSON 文件,其中描述要在目標 IoT Edge 裝置上設定的模組。

  2. 變更系統執行時間模組映像 edgeAgentedgeHub 的執行時間版本。 例如,如果您想要使用 IoT Edge 執行時間 1.4 版,請在部署資訊清單檔中變更下列幾行:

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        //...
    

設定 Visual Studio 2022 遠端 Docker 引擎執行個體

使用 Azure IoT Edge 工具延伸模組,並設定其使用在 EFLOW 虛擬機器內執行的遠端 Docker 引擎。

  1. 選取 [工具] ->[Azure IoT Edge 工具] ->[IoT Edge 工具設定...]

  2. DOCKER_HOST localhost 值取代為 EFLOW VM IP 位址。 如果您不記得 IP 位址,請使用 EFLOW PowerShell Cmdlet Get-EflowVmAddr 來取得。 例如,如果 EFLOW VM IP 位址是 172.20.1.100,則新值應為 tcp://172.20.1.100:2375

    螢幕擷取畫面:IoT Edge 工具的設定

  3. 選取確定

開發您的模組

當您新增模組時,其會隨附已準備好可建置及部署至裝置的預設程式碼,讓您不需要觸碰任何程式碼,即可開始進行測試。 模組程式碼位於模組資料夾內名為 Program.cs (適用於 C#) 或 main.c (適用於 C) 的檔案中。

系統會建置預設解決方案,以便將 SimulatedTemperatureSensor 模組中的模擬資料路由傳送至您的模組,該模組會接受輸入,然後將其傳送至 IoT 中樞。

當您準備要使用自己的程式碼自訂模組範本時,請使用 Azure IoT 中樞 SDK 以建置其他模組,用於滿足 IoT 解決方案的主要需求,例如安全性、裝置管理和可靠性。

建置並發送單一模組

一般而言,您為想要先針對每個模組進行測試和偵錯,然後在使用多個模組的整個解決方案中執行。 因為解決方案將會使用在 EFLOW VM 內執行的 Docker 引擎進行建置或偵錯,因此第一個步驟是建置和發佈模組,以啟用遠端偵錯。

  1. 在 [方案總管] 中,選取並反白顯示模組專案資料夾 (例如 myIotEdgeModule)。 將自訂模組設定為啟始專案。 從功能表中選取 [專案]>[設定為啟始專案]

  2. 若要偵錯 C# Linux 模組,我們需要更新 Dockerfile.amd64.debug 檔案,以啟用 SSH 服務。 更新 Dockerfile.amd64.debug 檔案,以使用下列範本: 使用遠端偵錯支援 Azure IoT Edge AMD64 C# 模組 Dockerfile

    注意

    選擇 [偵錯] 時,Visual Studio 將使用 Dockerfile.(amd64|windows-amd64).debug 來建置 Docker 映像。 這包含建置它時容器映像中的 .NET Core 命令列偵錯工具 VSDBG。 對於生產就緒 IoT Edge 模組,建議您使用 [發行] 設定,此設定會使用無 VSDBG 的 Dockerfile.(amd64|windows-amd64)

    警告

    請確定範本的最後一行 ENTRYPOINT [“dotnet”、“IotEdgeModule1.dll”] DLL 名稱符合 IoT Edge 模組專案的名稱。

    螢幕擷取畫面:設定 Dockerfile 範本

  3. 若要建立與 Linux 模組的 SSH 連線,我們需要建立 RSA 金鑰。 開啟提升權限的 PowerShell 工作階段,並執行下列命令以建立新的 RSA 金鑰。 請確認將 RSA 金鑰儲存在相同的 IoT Edge 模組資料夾下,且金鑰的名稱為 id_rsa

    ssh-keygen -t RSA -b 4096 -m PEM
    

    螢幕擷取畫面:如何建立 SSH 金鑰

  4. 如果您使用私人登錄,例如 Azure Container Registry (ACR),請使用下列 Docker 命令來登入。 您可在 Azure 入口網站中,從您登錄的 [存取金鑰] 頁面取得使用者名稱和密碼。 如果您使用的是本機登錄,您可以執行本機登錄

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案資料夾,然後選取 [建置及推送 IoT Edge 模組],以建置及推送每個模組的 Docker 映像。

  2. 如果您使用私人登錄,例如 Azure Container Registry,您需要將檔案登入資訊新增到在檔案 deployment.template.json 中找到的執行階段設定。 將您的實際 ACR 系統管理員使用者名稱、密碼和登錄名稱填入預留位置。

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    注意

    本文會針對 Azure Container Registry 使用系統管理員登入認證,可便於開發和測試案例使用。 當您準備好進行生產案例時,建議使用最低權限驗證選項,例如服務主體。 如需詳細資訊,請參閱管理您容器登錄的存取權

  3. 必須公開連接埠 22 以存取模組 SSH 服務。 本教學課程使用 10022 做為主機連接埠,但您可以指定不同的連接埠,以作為 SSH 連接埠來連線到 Linux C# 模組。 您必須將 SSH 連接埠資訊新增至檔案 deployment.debug.template.json 中找到的此 Linux 模組設定的 「createOptions」。

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. 在 [方案總管] 中,以滑鼠右鍵按一下專案資料夾,然後選取 [產生 IoT Edge 部署] 以建置新的 IoT Edge 部署 json。

  5. 依序按一下 [檢視]>[Cloud Explorer] 以開啟 Cloud Explorer。 請確定您已登入 Visual Studio 2019。

  6. Cloud Explorer 中,展開您的訂用帳戶,尋找您的 Azure IoT 中樞與您要部署的 Azure IoT Edge 裝置。

  7. 以滑鼠右鍵按下 IoT Edge 裝置,然後選擇 [建立部署] 。 瀏覽至為您的平台設定的偵錯部署指令清單,位於 Visual Studio 解決方案中的 config 資料夾,例如 deployment.amd64.json

組建模組 Docker 映像

開發模組之後,您可以建置模組映像以儲存在容器登錄中,以部署至 IoT Edge 裝置。

使用模組的 Dockerfile 來組建模組 Docker 映像。

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

例如,假設您的命令殼層位於專案目錄中,而模組名稱為 IotEdgeModule1。 若要組建本機登錄或 Azure 容器登錄的映像,請使用下列命令:

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

發送模組 Docker 映像

將您的模組映像發送至本機登錄或容器登錄。

docker push <ImageName>

例如:

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

將模組部署到 IoT Edge 裝置。

在 Visual Studio 中,開啟主要專案中的 deployment.debug.template.json 部署資訊清單檔。 部署資訊清單是一份 JSON 文件,其中描述要在目標 IoT Edge 裝置上設定的模組。 在部署之前,您必須更新 Azure Container Registry 認證、模組映像,以及適當的 createOptions 值。 如需關於 createOption 值的詳細資訊,請參閱如何設定 IoT Edge 模組的容器建立選項

  1. 如果您使用 Azure Container Registry 來儲存模組映像,則必須在 edgeAgent 設定中將認證新增至 deployment.debug.template.json。 例如,

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. image 屬性值取代為您推送至登錄的模組映像名稱。 例如,如果您針對自訂模組 IotEdgeModule1 推送標記 myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 的映像,請將 image 屬性值取代為標記值。

  3. 針對部署範本中的每個系統和自訂模組新增 createOptions 值或將此值取代為字串化內容。

    例如,IotEdgeModule1 的 imagecreateOptions 設定會如下所示:

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

使用 IoT Edge Azure CLI set-modules 命令,將模組部署至 Azure IoT 中樞。 例如,若要將 deployment.debug.amd64.json 檔案中定義的模組,部署至 IoT 中樞 IoT Edge 裝置 my-devicemy-iot-hub,請使用下列命令:

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

提示

您可以在 [Azure IoT 中樞安全性設定]>> [共用存取原則] 底下的 [Azure 入口網站] 中找到 IoT 中樞連接字串。

  1. Cloud Explorer中,以滑鼠右鍵按一下邊緣裝置並重新整理,以查看新模組與 $edgeAgent$edgeHub 模組一起執行。

對解決方案進行偵錯

  1. 在已提高權限的 PowerShell 工作階段執行下列命令

    1. 根據 Linux C# 模組所使用的名稱取得 moduleId。 請確認將 <iot-edge-module-name> 預留位置取代為您的模組名稱。

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. 檢查 $moduleId 是否正確 - 如果變數是空的,請確認您使用正確的模組名稱

    3. 在 Linux 容器內啟動 SSH 服務

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. 在 EFLOW VM 上開啟模組 SSH 連接埠 (本教學課程使用連接埠 10022)

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    警告

    基於安全性考慮,每次 EFLOW VM 重新啟動時,IP 資料表規則將會刪除並返回原始設定。 此外,必須手動再次啟動模組 SSH 服務。

  2. 成功啟動 SSH 服務之後,請選取 [偵錯] ->[附加至流程]、將 [連線類型] 設定為 SSH,並將 [連線目標] 設為 EFLOW VM 的 IP 位址。 如果您不知道 EFLOW VM IP,可以使用 Get-EflowVmAddr PowerShell Cmdlet。 首先,輸入 IP,然後按下 [Enter]。 在快顯視窗中,輸入下列設定:

    欄位
    主機名稱 使用 EFLOW VM IP
    通訊埠 10022 (或您在部署設定中使用的)
    使用者名稱
    驗證類型 私密金鑰
    私密金鑰檔案 在上一個步驟中建立之 id_rsa 的完整路徑
    複雜密碼 用於上一個步驟中建立之金鑰的複雜密碼

    螢幕擷取畫面:如何連線到遠端系統

  3. 使用 SSH 成功連線到模組之後,您可以選擇流程並選取 [附加]。 針對 C# 模組,您必須選擇流程 dotnet,並附加至受控 (CoreCLR)。 第一次執行時,可能需要 10-20 秒的時間。

    螢幕擷取畫面:如何附加邊緣模組程序。

  4. 設定中斷點來檢查模組。

    • 如果是在 C# 中進行開發,請在 ModuleBackgroundService.csPipeMessage() 函式中設定中斷點。
    • 若是使用 C,請在 main.cInputQueue1Callback() 函式中設定中斷點。
  5. SimulatedTemperatureSensor 的輸出應該重新導向至自訂 Linux C# 模組的 input1。 中斷點應該已觸發。 您可以在 Visual Studio [區域變數] 視窗中觀察變數。

    螢幕擷取畫面:如何偵錯單一模組

  6. 按下 Ctrl + F5 或選取 [停止] 按鈕以停止偵錯。

清除資源

如果您打算繼續閱讀下一篇建議的文章,則可以保留您所建立的資源和組態,並加以重複使用。 您可以也繼續使用相同的 IoT Edge 裝置作為測試裝置。

否則,可以刪除您在本文中使用的本機設定和 Azure 資源,以避免產生費用。

刪除 Azure 資源

刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有的資源群組內建立了 IoT 中樞,而該群組包含您想要保留的資源,則您只需刪除 IoT 中樞資源本身,而不要刪除資源群組。

若要刪除資源:

  1. 登入 Azure 入口網站,然後選取 [資源群組]

  2. 選取您的 IoT Edge 測試資源所屬的資源群組名稱。

  3. 檢閱您的資源群組中包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只要刪除某些部分,您可以按一下各個資源將其個別刪除。

下一步

在本教學課程中,您已在開發機器上設定 Visual Studio,並從中部署和偵錯第一個 IoT Edge 模組。 您已知道基本概念,接下來請嘗試對模組新增功能,使其可以分析其中通過的資料。