透過 Azure 入口網站和 .NET 裝置開始使用 IoT 中樞模組身分識別和模組對應項
模組身分識別與模組對應項類似於 Azure IoT 中樞裝置身分識別與裝置對應項,但提供更精細的細微性。 雖然 Azure IoT 中樞裝置身分識別與裝置對應項可讓後端應用程式設定裝置並提供裝置狀況的可見性,但模組身分識別和模組對應項可提供裝置個別元件的上述功能。 在具有多個元件的支援裝置 (例如作業系統裝置或韌體裝置) 上,模組身分識別和模組對應項允許每個元件使用獨立的設定和條件。
注意
本文中所述的功能僅適用於 IoT 中樞的標準層。 如需基本和標準/免費 IoT 中樞層的詳細資訊,請參閱選擇適合您解決方案的 IoT 中樞層 (部分機器翻譯)。
在本文中,您將了解如何:
在入口網站中建立模組身分識別。
使用 .NET 裝置 SDK 更新裝置的模組對應項。
注意
如需可用來建置裝置和後端應用程式的 SDK 工具詳細資訊,請參閱 Azure IoT SDK。
必要條件
Visual Studio。
Azure 訂用帳戶中的 IoT 中樞。 如果您還沒有中樞,可遵循建立 IoT 中樞中的步驟。
在 IoT 中樞內註冊的裝置。 如果 IoT 中樞中沒有裝置,請遵循註冊裝置中的步驟。
模組驗證
您可以使用對稱金鑰或 X.509 憑證來驗證模組身分識別。 針對 X.509 憑證驗證,模組憑證的一般名稱 (CN)「必須」具有如 CN=<deviceid>/<moduleid>
的格式。 例如:
openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"
在入口網站中建立模組身分識別
在一個裝置身分識別內,您可以建立最多 20 個模組身分識別。 若要新增身分識別,請遵循下列步驟:
從 Azure 入口網站現有的裝置,選擇 [新增模組身分識別] 建立您的第一個模組身分識別。
輸入 myFirstModule 名稱。 儲存模組身分識別。
新的模組身分識別會出現在畫面底部。 加以選取以查看模組身分識別詳細資料。
儲存連接字串 (主索引鍵)。 在下一節中,您會使用此資訊,在主控台應用程式中設定模組。
使用 .NET 裝置 SDK 更新模組對應項
接著,我們要從模擬裝置與雲端通訊。 一旦建立模組身分識別,模組對應項會隱含地建立於 IoT 中樞中。 在這一節中,您會在模擬裝置上建立 .NET 主控台應用程式,以便更新模組對應項報告的屬性。
建立 Visual Studio 專案
若要建立應用程式更新模組對應項、報告屬性,請遵循下列步驟:
在 Visual Studio 中,選取 [建立新專案],然後選擇 [主控台應用程式 (.NET Framework)],並選取 [下一步]。
在 [設定新專案] 中,輸入 UpdateModuleTwinReportedProperties 作為專案名稱。 選取下一步以繼續。
保留預設 .NET Framework,然後選取 [建立]。
安裝最新的 Azure IoT Hub .NET 裝置 SDK
模組 ID 和模組對應項功能僅適用於 IoT 中樞發行前版本的裝置 SDK。 若要加以安裝,請遵循這些步驟:
在 Visual Studio 中,依序開啟 [工具] > [NuGet 套件管理員] > [管理解決方案的 NuGet 套件]。
選取 [瀏覽],然後選取 [包括發行前版本]。 搜尋 Microsoft.Azure.Devices.Client。 選取最新版本並安裝。
您現在可以存取所有的模組功能。
建立 UpdateModuleTwinReportedProperties 主控台應用程式
重要
本文包含使用共用存取簽章 (也稱為對稱金鑰驗證) 連線裝置的步驟。 此驗證方法方便進行測試和評估,但使用 X.509 憑證來驗證裝置是更安全的方法。 若要深入了解,請參閱安全性最佳做法>連線安全性。
若要建立應用程式,請遵循下列步驟:
- 在 Program.cs 檔案開頭處新增下列
using
陳述式:
using Microsoft.Azure.Devices.Client;
using Microsoft.Azure.Devices.Shared;
using Newtonsoft.Json;
- 將下列欄位新增到 Program 類別。 以您之前儲存的模組連接字串,取代預留位置值。
private const string ModuleConnectionString = "<Your module connection string>";
private static ModuleClient Client = null;
- 將下列方法 OnDesiredPropertyChanged 新增至 Program 類別:
private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext)
{
Console.WriteLine("desired property change:");
Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
Console.WriteLine("Sending current time as reported property");
TwinCollection reportedProperties = new TwinCollection
{
["DateTimeLastDesiredPropertyChangeReceived"] = DateTime.Now
};
await Client.UpdateReportedPropertiesAsync(reportedProperties).ConfigureAwait(false);
}
- 最後,將 Main 方法取代成下列程式碼:
static void Main(string[] args)
{
Microsoft.Azure.Devices.Client.TransportType transport = Microsoft.Azure.Devices.Client.TransportType.Amqp;
try
{
Client = ModuleClient.CreateFromConnectionString(ModuleConnectionString, transport);
Client.SetConnectionStatusChangesHandler(ConnectionStatusChangeHandler);
Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).Wait();
Console.WriteLine("Retrieving twin");
var twinTask = Client.GetTwinAsync();
twinTask.Wait();
var twin = twinTask.Result;
Console.WriteLine(JsonConvert.SerializeObject(twin));
Console.WriteLine("Sending app start time as reported property");
TwinCollection reportedProperties = new TwinCollection();
reportedProperties["DateTimeLastAppLaunch"] = DateTime.Now;
Client.UpdateReportedPropertiesAsync(reportedProperties);
}
catch (AggregateException ex)
{
Console.WriteLine("Error in sample: {0}", ex);
}
Console.WriteLine("Waiting for Events. Press enter to exit...");
Console.ReadKey();
Client.CloseAsync().Wait();
}
private static void ConnectionStatusChangeHandler(ConnectionStatus status, ConnectionStatusChangeReason reason)
{
Console.WriteLine($"Status {status} changed: {reason}");
}
您可以使用 F5 來建置和執行此應用程式。
您已了解如何擷取模組對應項,並使用 AMQP 通訊協定更新報告屬性。
下一步
若要繼續開始使用 IoT 中樞並瀏覽其他 IoT 案例,請參閱︰