Share via


排程及廣播作業 (.NET)

使用 Azure IoT 中樞排程和追蹤會更新數百萬部裝置的作業。 使用作業以:

  • 更新所需屬性

  • 更新標籤

  • 叫用直接方法

作業會包裝上述其中一個動作,然後針對由裝置對應項查詢所定義的一組裝置,追蹤執行進度。 例如,後端應用程式可以使用作業,以在 10,000 部裝置上叫用重新開機裝置的直接方法。 您以裝置對應項查詢指定一組裝置,並排程在未來的時間執行作業。 作業會在每部裝置接收和執行重新開機直接方法時追蹤進度。

若要一一了解這些功能,請參閱:

注意

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

本文說明如何建立兩個 .NET (C#) 主控台應用程式:

  • 裝置應用程式 SimulateDeviceMethods,其實作 lockDoor 直接方法,後端應用程式可呼叫此方法。

  • 後端應用程式 ScheduleJob,可建立兩個作業。 一個作業會呼叫 lockDoor 直接方法,而另一個作業會將所需的屬性更新傳送至多個裝置。

注意

如需可用來建置裝置和後端應用程式的 SDK 工具詳細資訊,請參閱 Azure IoT SDK

必要條件

  • Visual Studio。

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

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

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

建立模擬裝置應用程式

在本節中,您會建立 .NET 主控台應用程式,回應解決方案後端所呼叫的直接方法。

  1. 在 Visual Studio 中,選取 [建立新專案],然後選擇 [主控台應用程式 (.NET Framework)] 專案範本。 選取 [下一步] 以繼續操作。

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

    Visual Studio 中 [設定您的新專案] 快顯視窗的螢幕擷取畫面。

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

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

  5. 在 [NuGet 套件管理員] 中,選取 [瀏覽],然後搜尋並選擇 [Microsoft.Azure.Devices.Client]。 選取 [安裝]。

    Visual Studio 中 NuGet 套件管理員的螢幕擷取畫面。

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

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

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. 將下列欄位新增到 Program 類別。 將預留位置的值取代為您在上一節中所記下的裝置連接字串:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. 新增下列程式碼以在裝置上實作直接方法:

    static Task<MethodResponse> LockDoor(MethodRequest methodRequest, object userContext)
    {
        Console.WriteLine();
        Console.WriteLine("Locking Door!");
        Console.WriteLine("\nReturning response for method {0}", methodRequest.Name);
    
        string result = "'Door was locked.'";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. 新增下列方法以在裝置上實作裝置對應項接聽程式:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. 最後,在 Main 方法中新增下列程式碼以開啟 IoT 中樞的連線,並啟動方法接聽程式︰

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        Client.SetMethodHandlerAsync("LockDoor", LockDoor, null);
        Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null);
    
        Console.WriteLine("Waiting for direct method call and device twin update\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        Client.SetMethodHandlerAsync("LockDoor", null, null);
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  11. 儲存您的工作,並建置您的解決方案。

注意

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

取得 IoT 中樞連接字串

在本文中,您會建立後端服務,其會排程在裝置上叫用直接方法的作業、排程更新裝置對應項的作業,以及監視每項作業的進度。 若要執行這些作業,則服務需要有登錄讀取登錄寫入權限。 根據預設,每個 IoT 中樞都是使用授與這些權限且名為 registryReadWrite 的共用存取原則所建立。

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

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

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

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

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

    顯示如何擷取連接字串的螢幕擷取畫面

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

排程呼叫直接方法及傳送裝置對應項更新的作業

在本節中,您要建立 .NET 主控台應用程式 (使用 C#),使用作業呼叫 LockDoor 直接方法,並將所需的屬性更新傳送至多部裝置。

  1. 在 Visual Studio 中,選取 [檔案]> [新增]> [專案]。 在 [建立新專案] 中,選擇 [主控台應用程式 (.NET Framework)],然後選取 [下一步]。

  2. 在 [設定新專案] 中,將專案命名為 ScheduleJob,然後選取 [建立]。

    命名及設定 ScheduleJob 專案

    Visual Studio 中 [設定您的新專案] 快顯視窗的螢幕擷取畫面,您可以在其中新增名稱。

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

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

  5. 在 [NuGet 套件管理員] 中,選取 [瀏覽],搜尋並選擇 [Microsoft.Azure.Devices],然後選取 [安裝]。

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

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

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. 新增下列 using 陳述式 (如果預設陳述式中尚不存在)。

    using System.Threading;
    using System.Threading.Tasks;
    
  8. 將下列欄位新增到 Program 類別。 將這些預留位置取代為先前在 取得 IoT 中樞連接字串內複製的 IoT 中樞連接字串,以及裝置名稱。

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. 將下列方法加入至 Program 類別:

    public static async Task MonitorJob(string jobId)
    {
        JobResponse result;
        do
        {
            result = await jobClient.GetJobAsync(jobId);
            Console.WriteLine("Job Status : " + result.Status.ToString());
            Thread.Sleep(2000);
        } while ((result.Status != JobStatus.Completed) && 
          (result.Status != JobStatus.Failed));
    }
    
  10. 將下列方法加入至 Program 類別:

    public static async Task StartMethodJob(string jobId)
    {
        CloudToDeviceMethod directMethod = 
          new CloudToDeviceMethod("LockDoor", TimeSpan.FromSeconds(5), 
          TimeSpan.FromSeconds(5));
    
        JobResponse result = await jobClient.ScheduleDeviceMethodAsync(jobId,
            $"DeviceId IN ['{deviceId}']",
            directMethod,
            DateTime.UtcNow,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Method Job");
    }
    
  11. 將另一個方法新增至 Program 類別:

    public static async Task StartTwinUpdateJob(string jobId)
    {
        Twin twin = new Twin(deviceId);
        twin.Tags = new TwinCollection();
        twin.Tags["Building"] = "43";
        twin.Tags["Floor"] = "3";
        twin.ETag = "*";
    
        twin.Properties.Desired["LocationUpdate"] = DateTime.UtcNow;
    
        JobResponse createJobResponse = jobClient.ScheduleTwinUpdateAsync(
            jobId,
            $"DeviceId IN ['{deviceId}']", 
            twin, 
            DateTime.UtcNow, 
            (long)TimeSpan.FromMinutes(2).TotalSeconds).Result;
    
        Console.WriteLine("Started Twin Update Job");
    }
    

    注意

    如需有關查詢語法的詳細資訊,請參閱 IoT 中樞查詢語言

  12. 最後,將下列幾行新增至 Main 方法:

    Console.WriteLine("Press ENTER to start running jobs.");
    Console.ReadLine();
    
    jobClient = JobClient.CreateFromConnectionString(connString);
    
    string methodJobId = Guid.NewGuid().ToString();
    
    StartMethodJob(methodJobId);
    MonitorJob(methodJobId).Wait();
    Console.WriteLine("Press ENTER to run the next job.");
    Console.ReadLine();
    
    string twinUpdateJobId = Guid.NewGuid().ToString();
    
    StartTwinUpdateJob(twinUpdateJobId);
    MonitorJob(twinUpdateJobId).Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  13. 儲存您的工作,並建置您的解決方案。

執行應用程式

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

  1. 在 Visual Studio 的 [方案總管] 中,以滑鼠右鍵按一下方案,然後選取 [設定啟始專案]。

  2. 選取 [通用屬性]>[啟始專案],然後選取 [多個啟始專案]。

  3. 請確定 SimulateDeviceMethods 位於清單頂端,後面接著 ScheduleJob。 將其兩個動作設定為 [啟動],然後選取 [確定]。

  4. 執行專案,方法是按一下 [開始] 或移至 [偵錯] 功能表,然後按一下 [開始偵錯]。

    您會看到來自裝置及後端應用程式的輸出。

    執行應用程式以排程作業

後續步驟

在本文中,您已排程工作來執行直接方法,並更新裝置對應項的屬性。

若要繼續探索 IoT 中樞和裝置管理模式,請更新使用 Raspberry Pi 3 B+ 參考映像的 Azure IoT 中樞裝置更新教學課程中的映像。