排程及廣播作業 (.NET)
使用 Azure IoT 中樞排程和追蹤會更新數百萬部裝置的作業。 使用作業以:
更新所需屬性
更新標籤
叫用直接方法
作業會包裝上述其中一個動作,然後針對由裝置對應項查詢所定義的一組裝置,追蹤執行進度。 例如,後端應用程式可以使用作業,以在 10,000 部裝置上叫用重新開機裝置的直接方法。 您以裝置對應項查詢指定一組裝置,並排程在未來的時間執行作業。 作業會在每部裝置接收和執行重新開機直接方法時追蹤進度。
若要一一了解這些功能,請參閱:
裝置對應項和屬性:開始使用裝置對應項和了解並使用 IoT 中樞中的裝置對應項屬性
直接方法:IoT 中樞開發人員指南 - 直接方法 (部分機器翻譯)
注意
本文中所述的功能僅適用於 IoT 中樞的標準層。 如需基本和標準/免費 IoT 中樞層的詳細資訊,請參閱選擇適合您解決方案的 IoT 中樞層 (部分機器翻譯)。
本文說明如何建立兩個 .NET (C#) 主控台應用程式:
裝置應用程式 SimulateDeviceMethods,其實作 lockDoor 直接方法,後端應用程式可呼叫此方法。
後端應用程式 ScheduleJob,可建立兩個作業。 一個作業會呼叫 lockDoor 直接方法,而另一個作業會將所需的屬性更新傳送至多個裝置。
注意
如需可用來建置裝置和後端應用程式的 SDK 工具詳細資訊,請參閱 Azure IoT SDK。
必要條件
Visual Studio。
Azure 訂用帳戶中的 IoT 中樞。 如果您還沒有中樞,可遵循建立 IoT 中樞中的步驟。
在 IoT 中樞內註冊的裝置。 如果 IoT 中樞中沒有裝置,請遵循註冊裝置中的步驟。
請確定您的防火牆已開啟連接埠 8883。 本文中的裝置範例會使用 MQTT 通訊協定,其會透過連接埠 8883 進行通訊。 某些公司和教育網路環境可能會封鎖此連接埠。 如需此問題的詳細資訊和解決方法,請參閱連線至 IoT 中樞 (MQTT)。
建立模擬裝置應用程式
在本節中,您會建立 .NET 主控台應用程式,回應解決方案後端所呼叫的直接方法。
重要
本文包含使用共用存取簽章 (也稱為對稱金鑰驗證) 連線裝置的步驟。 此驗證方法方便進行測試和評估,但使用 X.509 憑證來驗證裝置是更安全的方法。 若要深入了解,請參閱安全性最佳做法>連線安全性。
在 Visual Studio 中,選取 [建立新專案],然後選擇 [主控台應用程式 (.NET Framework)] 專案範本。 選取下一步以繼續。
在 [設定新專案] 中,將專案命名為 SimulateDeviceMethods,然後選取 [下一步]。
接受預設版本的 .NET Framework,然後選取 [建立] 以建立專案。
在 [方案總管] 中,以滑鼠右鍵按一下 [SimulateDeviceMethods] 專案,然後選取 [管理 NuGet 套件]。
在 [NuGet 套件管理員] 中,選取 [瀏覽],然後搜尋並選擇 [Microsoft.Azure.Devices.Client]。 選取 [安裝]。
此步驟會下載和安裝 Azure IoT 裝置 SDK NuGet 套件及其相依性,並新增其參考。
在 Program.cs 檔案開頭處新增下列
using
陳述式:using Microsoft.Azure.Devices.Client; using Microsoft.Azure.Devices.Shared; using Newtonsoft.Json; using System.Threading.Tasks; using System.Text;
將下列欄位新增到 Program 類別。 將預留位置的值取代為您在上一節中所記下的裝置連接字串:
static string DeviceConnectionString = "<yourDeviceConnectionString>"; static DeviceClient Client = null;
新增下列程式碼以在裝置上實作直接方法:
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)); }
新增下列方法以在裝置上實作裝置對應項接聽程式:
private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext) { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); }
最後,在 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); }
儲存您的工作,並建置您的解決方案。
注意
為了簡單起見,本文章不會實作重試原則。 在生產程式碼中,您應該如 暫時性錯誤處理中所建議來實作重試原則 (例如連線重試)。
取得 IoT 中樞連接字串
在本文中,您會建立後端服務,其會排程在裝置上叫用直接方法的作業、排程更新裝置對應項的作業,以及監視每項作業的進度。 若要執行這些作業,則服務需要有登錄讀取和登錄寫入權限。 根據預設,每個 IoT 中樞都是使用授與這些權限且名為 registryReadWrite 的共用存取原則所建立。
若要取得 registryReadWrite 原則的 IoT 中樞連接字串,請遵循下列步驟:
在 Azure 入口網站中,選取 [資源群組]。 選取中樞所在的資源群組,然後從資源清單選取中樞。
在中樞的左側窗格中,選取 [共用存取原則]。
從原則清單中,選取 registryReadWrite 原則。
複製 [主要連接字串] 並儲存該值。
如需 IoT 中樞共用存取原則和權限的詳細資訊,請參閱存取控制及權限。
重要
本文包含使用共用存取簽章連線至服務的步驟。 此驗證方法方便進行測試和評估,但使用 Microsoft Entra ID 或受控識別向服務進行驗證是更安全的方法。 若要深入了解,請參閱安全性最佳做法 > 雲端安全性。
排程呼叫直接方法及傳送裝置對應項更新的作業
在本節中,您要建立 .NET 主控台應用程式 (使用 C#),使用作業呼叫 LockDoor 直接方法,並將所需的屬性更新傳送至多部裝置。
在 Visual Studio 中,選取 [檔案]>[新增]>[專案]。 在 [建立新專案] 中,選擇 [主控台應用程式 (.NET Framework)],然後選取 [下一步]。
在 [設定新專案] 中,將專案命名為 ScheduleJob,然後選取 [建立]。
接受預設版本的 .NET Framework,然後選取 [建立] 以建立專案。
在 [方案總管] 中,以滑鼠右鍵按一下 [ScheduleJob] 專案,然後選取 [管理 NuGet 套件]。
在 [NuGet 套件管理員] 中,選取 [瀏覽],搜尋並選擇 [Microsoft.Azure.Devices],然後選取 [安裝]。
此步驟會下載及安裝 Azure IoT 服務 SDK NuGet 套件與其相依性,並加入對它的參考。
在 Program.cs 檔案開頭處新增下列
using
陳述式:using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Shared;
新增下列
using
陳述式 (如果預設陳述式中尚不存在)。using System.Threading; using System.Threading.Tasks;
將下列欄位新增到 Program 類別。 將這些預留位置取代為先前在 取得 IoT 中樞連接字串內複製的 IoT 中樞連接字串,以及裝置名稱。
static JobClient jobClient; static string connString = "<yourIotHubConnectionString>"; static string deviceId = "<yourDeviceId>";
將下列方法加入至 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)); }
將下列方法加入至 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"); }
將另一個方法新增至 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 中樞查詢語言。
最後,將下列幾行新增至 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();
儲存您的工作,並建置您的解決方案。
執行應用程式
您現在可以開始執行應用程式。
在 Visual Studio 的 [方案總管] 中,以滑鼠右鍵按一下方案,然後選取 [設定啟始專案]。
選取 [通用屬性]>[啟始專案],然後選取 [多個啟始專案]。
請確定
SimulateDeviceMethods
位於清單頂端,後面接著ScheduleJob
。 將其兩個動作設定為 [啟動],然後選取 [確定]。執行專案,方法是按一下 [開始] 或移至 [偵錯] 功能表,然後按一下 [開始偵錯]。
您會看到來自裝置及後端應用程式的輸出。
下一步
在本文中,您已排程工作來執行直接方法,並更新裝置對應項的屬性。
若要繼續探索 IoT 中樞和裝置管理模式,請更新使用 Raspberry Pi 3 B+ 參考映像的 Azure IoT 中樞裝置更新教學課程中的映像。