设备管理入门 (.NET)
本文介绍如何创建:
SimulateManagedDevice:一个模拟设备应用,它使用直接方法重新启动设备并报告上次重新启动时间。 直接方法是从云中调用的。
TriggerReboot:一个 .NET 控制台应用,它通过 IoT 中心调用模拟设备应用中的直接方法。 它显示响应和更新的报告属性。
先决条件
Visual Studio。
已注册的设备。 在 Azure 门户中注册一个。
确保已在防火墙中打开端口 8883。 本文中的设备示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)。
使用直接方法创建设备应用
本部分的操作:
创建一个 .NET 控制台应用,用于响应通过云调用的直接方法。
触发模拟设备重新启动。
通过报告的属性,设备孪生查询可标识设备及设备上次重新启动的时间。
若要创建模拟设备应用,请执行以下步骤:
打开 Visual Studio 并选择“创建新项目”,然后找到并选择“控制台应用(.NET Framework)”项目模板,然后选择“下一步”。
在“配置新项目”中,将项目命名为“SimulateManagedDevice”,然后选择“下一步”。
保留默认 .NET Framework 版本,然后选择“创建”。
在“解决方案资源管理器”中,右键单击新的“SimulateManagedDevice”项目,然后选择“管理 NuGet 程序包”。
选择“浏览”,然后搜索并选择“Microsoft.Azure.Devices.Client”。 选择“安装” 。
此步骤将下载、安装 Azure IoT 设备 SDK NuGet 包及其依赖项并添加对其的引用。
在 Program.cs 文件顶部添加以下
using
语句:using Microsoft.Azure.Devices.Client; using Microsoft.Azure.Devices.Shared;
将以下字段添加到 Program 类。 将
{device connection string}
占位符值替换为在 IoT 中心注册设备时看到的设备连接字符串:static string DeviceConnectionString = "{device connection string}"; static DeviceClient Client = null;
添加以下函数,实现设备上的直接方法:
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)); }
最后,将以下代码添加到 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); }
在解决方案资源管理器中,右键单击解决方案,然后选择“设置启动项目”。
在“通用属性”>“启动项目”中,选择“单启动项目”,然后选择“SimulateManagedDevice”项目。 选择“确定”保存更改。
选择“生成”>“生成解决方案” 。
注意
为简单起见,本文不实现任何重试策略。 在生产代码中,应按暂时性故障处理中所述实现重试策略(例如指数退避)。
获取 IoT 中心连接字符串
在本文中,你将创建一项在设备上调用直接方法的后端服务。 若要通过 IoT 中心在设备上调用直接方法,服务需要“服务连接”权限。 默认情况下,每个 IoT 中心都使用名为“服务”的共享访问策略创建,该策略会授予此权限。
若要获取 service策略的 IoT 中心连接字符串,请执行以下步骤:
在 Azure 门户中,选择“资源组”。 选择中心所在的资源组,然后从资源列表中选择中心。
在 IoT 中心的左侧窗格上,选择“共享访问策略”。
在策略列表中,选择“service”策略。
复制“主连接字符串”并保存该值。
有关 IoT 中心共享访问策略和权限的详细信息,请参阅访问控制和权限。
创建服务应用以触发重新启动
在本部分中,会创建一个 .NET 控制台应用(使用 C#)以使用直接方法在设备上启动远程重新启动。 该应用使用设备孪生查询来搜索该设备的上次重新启动时间。
打开 Visual Studio 并选择“创建新项目”。
在“创建新项目”中,找到并选择“控制台应用(.NET Framework)”项目模板,然后选择“下一步”。
在“配置新项目”中,将项目命名为“TriggerReboot”,然后选择“下一步”。
接受.NET Framework 的默认版本,然后选择“创建”以创建项目。
在“解决方案资源管理器”中,右键单击“TriggerReboot”项目,然后选择“管理 NuGet 程序包” 。
选择“浏览”,然后搜索并选择“Microsoft.Azure.Devices”。 选择“安装”以安装“Microsoft.Azure.Devices”包。
此步骤将下载、安装 Azure IoT 服务 SDK NuGet 包及其依赖项并添加对其的引用。
在 Program.cs 文件顶部添加以下
using
语句:using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Shared;
将以下字段添加到 Program 类。 将
{iot hub connection string}
占位符值替换为以前在获取 IoT 中心连接字符串中复制的 IoT 中心连接字符串。static RegistryManager registryManager; static string connString = "{iot hub connection string}"; static ServiceClient client; static string targetDevice = "myDeviceId";
将以下方法添加到 Program 类。 此代码为重新启动的设备获取设备克隆,并输出报告的属性。
public static async Task QueryTwinRebootReported() { Twin twin = await registryManager.GetTwinAsync(targetDevice); Console.WriteLine(twin.Properties.Reported.ToJson()); }
将以下方法添加到 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."); }
最后,在 Main 方法中添加以下行:
registryManager = RegistryManager.CreateFromConnectionString(connString); StartReboot().Wait(); QueryTwinRebootReported().Wait(); Console.WriteLine("Press ENTER to exit."); Console.ReadLine();
选择“生成”>“生成解决方案” 。
注意
本文仅针对设备的报告属性执行单个查询。 在生产代码中,我们建议通过轮询来检测报告属性是否更改。
运行应用
现在可以运行应用了。
若要运行 .NET 设备应用 SimulateManagedDevice,请在解决方案资源管理器中,右键单击“SimulateManagedDevice”项目,选择“调试”,然后选择“启动新实例”。 应用应开始侦听来自 IoT 中心的方法调用。
在设备已连接并等待方法调用之后,右键单击“TriggerReboot”项目,选择“调试”,然后选择“启动新实例”。
应会看到“正在重新启动!”已写入 SimulatedManagedDevice 控制台,设备的报告属性(包括上次重新启动时间)已写入 TriggerReboot 控制台。
自定义和扩展设备管理操作
IoT 解决方案可扩展已定义的设备管理模式集,或通过使用设备孪生和云到设备方法基元启用自定义模式。 设备管理操作的其他示例包括恢复出厂设置、固件更新、软件更新、电源管理、网络和连接管理以及数据加密。
设备维护时段
通常情况下,将设备配置为在某一时间执行操作,以最大程度减少中断和停机时间。 设备维护时段是一种常用模式,用于定义设备应更新其配置的时间。 后端解决方案使用设备克隆所需属性在设备上定义并激活策略,以启用维护时段。 当设备收到维护时段策略时,它可以使用设备克隆报告属性报告策略状态。 然后,后端应用可以使用设备克隆查询来证明设备和每个策略的符合性。
后续步骤
本文使用直接方法触发设备上的远程重新启动。 使用报告属性报告设备上次重新启动时间,并查询设备孪生从云中发现设备上次重新启动时间。
若要继续完成 IoT 中心和设备管理模式(如远程无线固件更新)的入门内容,请参阅如何更新固件。
若要了解如何扩展 IoT 解决方案以及在多个设备上计划方法调用,请参阅计划和广播作业。