教學課程:在 Windows 上使用適用於 Linux 的 IoT Edge 開發 IoT Edge 模組與 Linux 容器

適用於:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

支援的版本是 IoT Edge 1.4。 如果您是舊版,請參閱更新 IoT Edge

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

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

  • 命令行介面 (CLI) 是開發慣用的工具。
  • 適用於 Visual Studio 擴充功能的 Azure IoT Edge 工具。 延伸模組處於 維護模式

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

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

  • 設定您的開發電腦。
  • 使用適用於 Visual Studio Code 的 IoT Edge 工具建立新專案。
  • 將您的專案建置為容器,並將其儲存在 Azure 容器登錄中。
  • 將您的程式代碼部署至IoT Edge裝置。

必要條件

本文假設您使用執行 Windows 的電腦作為開發電腦。 在 Windows 電腦上,您可以開發 Windows 或 Linux 模組。 本教學課程會引導您開發 Linux 容器,並在 Windows 上使用適用於 Linux 的 IoT Edge 來建置和部署模組。

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 工具擴充功能處於 維護模式。 慣用的開發工具是命令行 (CLI) Azure IoT Edge 開發工具

    提示

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

雲端資源:

如果您沒有 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 主機進行開發,以及 Windows (EFLOW) VM 上的 IoT Edge for Linux,以建置和部署模組。

本教學課程是以使用 Linux 容器執行 IoT Edge 的裝置為目標。 只要開發機器執行 Linux 容器,您就可以使用慣用的作業系統。 我們建議使用 Visual Studio 搭配 Linux 容器進行開發,因此本教學課程會使用。 您也可以使用 Visual Studio Code,雖然這兩個工具之間有支持的差異。 如需詳細資訊,請參閱 使用Visual StudioCode開發 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. 編輯 Path 變數,並新增 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. 最後一個步驟是測試與 EFLOW VM Docker 引擎的 Docker 連線。 首先,您需要 EFLOW VM IP 位址。

    Get-EflowVmAddr
    

    提示

    如果EFLOW VM部署時沒有靜態IP,則IP位址可能會在Windows主機OS重新啟動或網路變更之間變更。 請務必每次想要建立遠端 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。 選取符合IoT Edge裝置平臺 (Linux IoT Edge 模組) 和架構的專案,然後選取[ 下一步]。

    Create New Project

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

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

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

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

    Screenshot of adding how to add an application and module to Visual Studio solution

    注意

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

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

專案結構

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

模組資料夾包含模組程式代碼的檔案,該檔案會根據您選擇的語言,命名 Program.cs 為 或 main.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 運行時間版本]。

    Screenshot of how to find and select the menu item named 'Set IoT Edge Runtime version'.

  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. EFLOW VM IP 位址取代 DOCKER_HOST localhost 值。 如果您不記得 IP 位址,請使用 EFLOW PowerShell Cmdlet Get-EflowVmAddr 來取得它。 針對 exmaple,如果 EFLOW VM IP 位址為 172.20.1.100,則新值應 tcp://172.20.1.100:2375

    Screenshot of IoT Edge Tools settings

  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”] 範本的最後一行名稱符合 IoT Edge 模組專案的名稱。

    Screenshot of setting the Dockerfile template

  3. 若要建立與Linux模組的SSH連線,我們需要建立 RSA 金鑰。 開啟提升許可權的 PowerShell 工作階段,然後執行下列命令來建立新的 RSA 金鑰。 請務必將 RSA 金鑰儲存在相同的 IoT Edge 模組資料夾下,且密鑰的名稱id_rsa

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

    Screenshot of how to create an SSH key

  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。 請確定您已登入 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 屬性值取代為您推送至登錄的模組映像名稱。 例如,如果您推送標記 myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 自定義模組 IotEdgeModule1 的映像,請將 image 屬性值取代為標記值。

  3. createOptions 值新增或取代為部署範本中每個系統和自定義模組的字串化內容

    例如,IotEdgeModule1 的 映像createOptions 設定會如下所示:

    "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-device 的 my-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],然後將 [連線 ion 目標設定為 EFLOW VM 的 IP 位址]。 如果您不知道 EFLOW VM IP,您可以使用 Get-EflowVmAddr PowerShell Cmdlet。 首先,輸入IP,然後按Enter鍵。 在彈出視窗中,輸入下列設定:

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

    Screenshot of how to connect to a remote system

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

    Screenshot of how to attach an edge module process.

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

    • 如果是在 C# 中進行開發,請在 ModuleBackgroundService.cs 中的PipeMessage()函式中設定斷點。
    • 如果使用 C,請在 main.cInputQueue1Callback() 函式中設定斷點。
  5. SimulatedTemperatureSensor 的輸出應該重新導向至自定義 Linux C# 模組的 input1 應該觸發斷點。 您可以在 Visual Studio [局部變數 ] 視窗中監看變數。

    Screenshot of how to debug a single module

  6. Ctrl + F5 ,或選取停止偵錯的停止按鈕。

清除資源

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

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

刪除 Azure 資源

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

若要刪除資源:

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

  2. 選取包含IoT Edge測試資源的資源群組名稱。

  3. 檢閱資源群組中包含的資源清單。 如果您想要刪除所有資源群組,您可以選取 [ 刪除資源群組]。 如果您想要只刪除其中一些資源,您可以按下每個資源來個別刪除它們。

下一步

在本教學課程中,您會在開發計算機上設定Visual Studio,並從中部署並偵錯您的第一個IoT Edge模組。 既然您已瞭解基本概念,請嘗試將功能新增至模組,以便分析通過它的數據。