本文介绍如何创建:
SimulateManagedDevice:具有直接方法的模拟设备应用,用于重新启动设备并报告上次重新启动时间。 从云调用直接方法。
TriggerReboot:一个 .NET 控制台应用,它通过 IoT 中心调用模拟设备应用中的直接方法。 它显示响应和更新的报告属性。
先决条件
Visual Studio。
已注册的设备。 在 Azure 门户中注册一个。
确保已在防火墙中打开端口 8883。 本文中的设备示例使用通过端口 8883 进行通信的 MQTT 协议。 某些企业和教育网络环境中可能会阻止此端口。 有关解决此问题的详细信息和方法,请参阅“连接到 IoT 中心”(MQTT)。
使用直接方法创建设备应用
本部分的操作:
创建一个 .NET 控制台应用,用于响应云调用的直接方法。
触发模拟设备重启。
使用报告的属性来启用设备孪生查询,以识别设备和其上次重启的时间。
若要创建模拟设备应用,请执行以下步骤:
打开 Visual Studio 并选择 “创建新项目”,然后找到并选择 控制台应用(.NET Framework) 项目模板,然后选择“ 下一步”。
在 “配置新项目”中,将项目命名为 SimulateManagedDevice,然后选择“ 下一步”。
保留默认的 .NET Framework 版本,然后选择“ 创建”。
在解决方案资源管理器中,右键单击新的 SimulateManagedDevice 项目,然后选择“ 管理 NuGet 包”。
选择 “浏览”,然后搜索并选择 Microsoft.Azure.Devices.Client。 选择“安装”。
此步骤下载、安装并添加对 Azure IoT 设备 SDK NuGet 包及其依赖项的引用。
在
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); }在解决方案资源管理器中,右键单击解决方案,然后选择 “设置启动项目”。
对于 Common Properties>Startup Project,请选择 单个启动项目,然后选择 SimulateManagedDevice 项目。 选择“确定”,保存所做更改。
选择“生成”>“生成解决方案”。
注释
为简单起见,本文不实施任何重试策略。 在生产代码中,应实施重试策略(如指数退避),如 暂时性故障处理中建议的那样。
获取 IoT 中心连接字符串
在本文中,你将创建一个在设备上调用直接方法的后端服务。 若要通过 IoT 中心在设备上调用直接方法,服务需要 服务连接 权限。 默认情况下,每个 IoT 中心都使用名为“服务”的共享访问策略创建,该策略会授予此权限。
若要获取 service策略的 IoT 中心连接字符串,请执行以下步骤:
在 Azure 门户中,选择 资源组。 选择中心所在的资源组,然后从资源列表中选择中心。
在 IoT 中心的左侧窗格中,选择 “共享访问策略”。
在策略列表中,选择“service”策略。
复制“主连接字符串”并保存该值。
有关 IoT 中心共享访问策略和权限的详细信息,请参阅 访问控制和权限。
创建服务应用以触发重新启动
在本部分中,你将使用 C# 创建一个 .NET 控制台应用,该应用使用直接方法在设备上启动远程重新启动。 应用使用设备孪生查询来发现该设备的最后一次重新启动时间。
打开 Visual Studio,然后选择创建新项目。
在 “创建新项目”中,找到并选择 控制台应用(.NET Framework) 项目模板,然后选择“ 下一步”。
在 “配置新项目”中,将项目命名为 TriggerReboot,然后选择“ 下一步”。
接受 .NET Framework 的默认版本,然后选择“ 创建 ”以创建项目。
在 解决方案资源管理器中,右键单击 TriggerReboot 项目,然后选择“ 管理 NuGet 包”。
选择 “浏览”,然后搜索并选择 “Microsoft.Azure.Devices”。 选择 “安装 ”以安装 Microsoft.Azure.Devices 包。
此步骤下载、安装并添加对 Azure IoT 服务 SDK NuGet 包及其依赖项的引用。
在
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 解决方案和计划方法调用,请参阅 计划和广播作业。