Share via


開始使用裝置管理 (.NET)

後端應用程式可使用 Azure IoT 中樞基元 (例如裝置對應項直接方法),從遠端啟動並監視裝置上的裝置管理動作。 本文會示範後端應用程式和裝置應用程式如何共同運作,以使用 IoT 中樞初始化和監視遠端裝置重新啟動。

注意

本文中所述的功能僅適用於 IoT 中樞的標準層。 如需有關基本和標準/免費 Azure IoT 中樞階層的詳細資訊,請參閱為您的解決方案選擇適合的 Azure IoT 中樞階層

使用直接方法從雲端中的後端應用程式起始裝置管理動作 (例如重新啟動、恢復出廠預設值,以及韌體更新)。 該裝置將負責:

  • 處理從 IoT 中樞傳送的方法要求。

  • 在裝置上起始對應的裝置專有動作。

  • 透過針對 IoT 中樞的報告屬性提供狀態更新。

您可以在雲端中使用後端 App 來執行裝置對應項查詢,以報告裝置管理動作的進度。

本文說明如何建立:

  • SimulateManagedDevice:為模擬裝置應用程式,使用直接方法重新啟動裝置,並報告上次重新啟動時間。 直接方法是從雲端叫用。

  • TriggerReboot:為 .NET 應用程式,可透過您的 IoT 中樞在模擬裝置應用程式中呼叫直接方法。 會顯示回應和更新的回報屬性。

必要條件

  • Visual Studio。

  • IoT 中樞。 使用 CLIAzure 入口網站建立一個。

  • 已註冊的裝置。 在 Azure 入口網站中註冊一個。

  • 請確定您的防火牆已開啟連接埠 8883。 本文中的裝置範例會使用 MQTT 通訊協定,其會透過連接埠 8883 進行通訊。 某些公司和教育網路環境可能會封鎖此連接埠。 如需此問題的詳細資訊和解決方法,請參閱連線至 IoT 中樞 (MQTT)

使用直接方法建立裝置應用程式

在本節中,您會:

  • 建立 .NET 主控台應用程式,以回應雲端所呼叫的直接方法。

  • 觸發模擬裝置重新啟動。

  • 使用回報的屬性來啟用裝置對應項查詢,以識別裝置及其上次重新啟動時間。

若要建立模擬裝置應用程式,請遵循下列步驟:

  1. 開啟 Visual Studio 並選取 [建立新專案] 中,然後尋找並選取 [主控台應用程式 (.NET Framework)] 專案範本,接著選取 [下一步]

  2. 在 [設定新專案] 中,將專案命名為 SimulateManagedDevice,然後選取 [下一步]

    Screenshot that shows how to name a new Visual Studio project.

  3. 保留預設 .NET Framework 版本,然後選取 [建立]

  4. 在 [方案總管] 中,以滑鼠右鍵按一下新的 [SimulateManagedDevice] 專案,然後選取 [管理 NuGet 套件]

  5. 選取 [瀏覽],然後搜尋並選取 [Microsoft.Azure.Devices.Client]。 選取安裝

    Screenshot that shows how to install the Microsoft.Azure.Devices.Client package.

    此步驟會下載和安裝 Azure IoT 裝置 SDK NuGet 套件及其相依性,並新增其參考。

  6. Program.cs 檔案開頭處新增下列 using 陳述式:

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    
  7. 將下列欄位新增到 Program 類別。 將 {device connection string} 預留位置值取代為您在 IoT 中樞註冊新裝置時看到的裝置連接字串:

    static string DeviceConnectionString = "{device connection string}";
    static DeviceClient Client = null;
    
  8. 新增下列項目以在裝置上實作直接方法:

    static Task<MethodResponse> onReboot(MethodRequest methodRequest, object userContext)
    {
        // In a production device, you would trigger a reboot 
        //   scheduled to start after this method returns.
        // For this sample, we simulate the reboot by writing to the console
        //   and updating the reported properties.
        try
        {
            Console.WriteLine("Rebooting!");
    
            // Update device twin with reboot time. 
            TwinCollection reportedProperties, reboot, lastReboot;
            lastReboot = new TwinCollection();
            reboot = new TwinCollection();
            reportedProperties = new TwinCollection();
            lastReboot["lastReboot"] = DateTime.Now;
            reboot["reboot"] = lastReboot;
            reportedProperties["iothubDM"] = reboot;
            Client.UpdateReportedPropertiesAsync(reportedProperties).Wait();
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
        }
    
        string result = @"{""result"":""Reboot started.""}";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. 最後,在 Main 方法中新增下列程式碼以開啟 IoT 中樞的連線,並啟動方法接聽程式︰

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        // setup callback for "reboot" method
        Client.SetMethodHandlerAsync("reboot", onReboot, null).Wait();
        Console.WriteLine("Waiting for reboot method\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        // as a good practice, remove the "reboot" handler
        Client.SetMethodHandlerAsync("reboot", null, null).Wait();
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  10. 在 [方案總管] 中,以滑鼠右鍵按一下方案,然後選取 [設定啟始專案]

  11. 針對 [通用屬性]>[啟始專案],選取 [單一啟始專案],然後選取 [SimulateManagedDevice] 專案。 選取 [確定] 以儲存您的變更。

  12. 選取 [組建]> [組建方案]

注意

為了簡單起見,本文章不會實作任何重試原則。 在生產程式碼中,您應該如 暫時性錯誤處理中所建議來實作重試原則 (例如指數輪詢)。

取得 IoT 中樞連接字串

在本文中,您會建立後端服務,在裝置上叫用直接方法。 若要透過 IoT 中樞在裝置上叫用直接方法,則服務需要有服務連線權限。 根據預設,每個 IoT 中樞都是透過授與此權限且名為服務的共用存取原則所建立。

若要取得服務原則的 IoT 中樞連接字串,請遵循下列步驟:

  1. Azure 入口網站中,選取 [資源群組]。 選取中樞所在的資源群組,然後從資源清單選取中樞。

  2. 在 IoT 中樞的左側窗格中,選取 [共用存取原則]

  3. 從原則清單中,選取服務原則。

  4. 複製 [主要連接字串] 並儲存該值。

Screenshot that shows how to retrieve the connection string from your IoT Hub in the Azure portal.

如需 IoT 中樞共用存取原則和權限的詳細資訊,請參閱存取控制及權限

建立服務應用程式以觸發重新開機

在本節中,您會建立 .NET 主控台應用程式 (使用 C#),此應用程式會使用直接方法起始遠端重新開機。 應用程式使用裝置對應項查詢來探索該裝置的上次重新開機時間。

  1. 開啟 Visual Studio,然後選取 [建立新專案]

  2. 在 [建立新專案] 中,尋找並選取 [主控台應用程式 (.NET Framework)] 專案範本,然後選取 [下一步]

  3. 在 [設定新專案] 中,將專案命名為 TriggerReboot,然後選取 [下一步]

    Screenshot that shows how to configure a new Visual Studio project.

  4. 接受預設版本的 .NET Framework,然後選取 [建立] 以建立專案。

  5. 在 [方案總管] 中,以滑鼠右鍵按一下 [TriggerReboot] 專案,然後選取 [管理 NuGet 套件]

  6. 選取 [瀏覽],然後搜尋並選取 [Microsoft.Azure.Devices]。 選取 [安裝] 以安裝 Microsoft.Azure.Devices 套件。

    Screenshot that shows how to install the Microsoft.Azure.Devices package.

    此步驟會下載及安裝 Azure IoT 服務 SDK NuGet 套件與其相依性,並加入對它的參考。

  7. Program.cs 檔案開頭處新增下列 using 陳述式:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  8. 將下列欄位新增到 Program 類別。 將 {iot hub connection string} 預留位置值取代為先前在 取得 IoT 中樞連接字串內複製的 IoT 中樞連接字串。

    static RegistryManager registryManager;
    static string connString = "{iot hub connection string}";
    static ServiceClient client;
    static string targetDevice = "myDeviceId";
    
  9. 將下列方法新增至 Program 類別。 此程式碼會取得用於重新啟動裝置的裝置對應項,並輸出報告屬性。

    public static async Task QueryTwinRebootReported()
    {
        Twin twin = await registryManager.GetTwinAsync(targetDevice);
        Console.WriteLine(twin.Properties.Reported.ToJson());
    }
    
  10. 將下列方法新增至 Program 類別。 此程式碼會使用直接方法在裝置上起始重新啟動。

    public static async Task StartReboot()
    {
        client = ServiceClient.CreateFromConnectionString(connString);
        CloudToDeviceMethod method = new CloudToDeviceMethod("reboot");
        method.ResponseTimeout = TimeSpan.FromSeconds(30);
    
        CloudToDeviceMethodResult result = await 
          client.InvokeDeviceMethodAsync(targetDevice, method);
    
        Console.WriteLine("Invoked firmware update on device.");
    }
    
  11. 最後,將下列幾行新增至 Main 方法:

    registryManager = RegistryManager.CreateFromConnectionString(connString);
    StartReboot().Wait();
    QueryTwinRebootReported().Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  12. 選取 [組建]> [組建方案]

注意

本文只針對裝置的回報屬性執行單一查詢。 在生產環境程式碼中,建議您進行輪詢以偵測回報屬性中的變更。

執行應用程式

您現在可開始執行應用程式。

  1. 若要執行 .NET 裝置應用程式 SimulateManagedDevice,請在 [方案總管] 中,以滑鼠右鍵按一下 [SimulateManagedDevice] 專案,選取 [偵錯],然後選取 [開始新執行個體]。 應用程式應該會開始接聽來自 IoT 中樞的方法呼叫。

  2. 連線到裝置並等候方法引動過程之後,請以滑鼠右鍵按一下 TriggerReboot 專案,選取 [偵錯],然後選取 [開始新執行個體]

    您應該會看到「正在重新啟動!」顯示在 SimulatedManagedDevice 主控台中,以及看到回報的裝置屬性顯示在 TriggerReboot 主控台中,其中包括上次重新啟動時間。

    Service and device app run

自訂及延伸裝置管理動作

您的 IoT 解決方案可以透過使用裝置對應項和雲端到裝置方法基元,擴充一組已定義的裝置管理模式或啟用自訂模式。 其他裝置管理動作範例還包括恢復出廠預設值、韌體更新、軟體更新、電源管理、網路和連線管理,以及資料加密。

裝置維護期間

一般而言,您會設定讓裝置在產生最短中斷和停機時間的時機執行動作。 裝置維護期間是用來定義裝置組態更新時機的常用模式。 您的後端解決方案可以使用所需的裝置對應項 (twin) 屬性,在您的裝置上定義可啟用維護期間的原則並啟用該原則。 當裝置收到維護期間原則時,它可以使用回報的裝置對應項 (twin) 屬性來回報原則的狀態。 接著,後端 App 便可使用裝置對應項 (twin) 查詢來證明是否符合裝置及每個原則的規定。

下一步

在本文中,您使用了直接方法在裝置上觸發遠端重新啟動。 您已使用報告屬性來從裝置回報上次重新開機時間,以及查詢裝置對應項來從雲端探索裝置的上次重新開機時間。

若要繼續開始使用 IoT 中樞和裝置管理模式,例如端對端映像型更新,請參閱 Azure IoT 中樞裝置更新文章,使用 Raspberry Pi 3 B+ 參考映像

若要了解如何擴充 IoT 解決方案,以及在多部裝置上排程方法呼叫,請參閱排程及廣播作業