使用 Azure IoT 中心来计划和跟踪更新数百万台设备的作业。 使用作业可以:
更新所需属性
更新标记
调用直接方法
任务封装其中一个操作,并跟踪由设备孪生查询定义的一组设备的执行情况。 例如,后端应用可以使用作业在 10,000 台设备上调用用来重新启动设备的直接方法。 使用设备孪生查询语句指定设备集,并计划任务在未来的时间运行。 作业跟踪每个设备接收和执行重新启动直接方法的进度。
若要详细了解每项功能,请参阅:
设备孪生和属性:设备孪生入门 和 了解和使用 IoT 中枢中的设备孪生
注释
本文中所述的功能仅在 IoT 中心的标准层中可用。 有关基本层和标准/免费 IoT 中心层的详细信息,请参阅 为解决方案选择正确的 IoT 中心层和大小。
本文介绍如何创建两个 .NET (C#) 控制台应用:
一个设备应用 SimulateDeviceMethods,它实现了一个名为 LockDoor 的直接方法,该方法可由后端应用调用。
一个后端应用 ScheduleJob,用于创建两个作业。 一个作业调用 lockDoor 直接方法,另一个作业将所需的属性更新发送到多个设备。
注释
有关可用于生成设备和后端应用的 SDK 工具的详细信息,请参阅 Azure IoT SDK 。
先决条件
Visual Studio。
已注册的设备。 在 Azure 门户中注册一个。
确保已在防火墙中打开端口 8883。 本文中的设备示例使用通过端口 8883 进行通信的 MQTT 协议。 某些企业和教育网络环境中可能会阻止此端口。 有关解决此问题的详细信息和方法,请参阅“连接到 IoT 中心”(MQTT)。
创建模拟设备应用
在本部分中,你将创建一个 .NET 控制台应用,用于响应解决方案后端调用的直接方法。
在 Visual Studio 中,选择 “创建新项目”,然后选择 “控制台应用”(.NET Framework) 项目模板。 选择“下一步”继续操作。
在 “配置新项目”中,将项目命名为 SimulateDeviceMethods, 然后选择“ 下一步”。
接受 .NET Framework 的默认版本,然后选择“ 创建 ”以创建项目。
在解决方案资源管理器中,右键单击 SimulateDeviceMethods 项目,然后选择“ 管理 NuGet 包”。
在 NuGet 包管理器中,选择 “浏览 ”并搜索并选择 “Microsoft.Azure.Devices.Client”。 选择“安装”。
此步骤下载、安装并添加对 Azure IoT 设备 SDK NuGet 包及其依赖项的引用。
在
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 中心共享访问策略和权限的详细信息,请参阅 访问控制和权限。
安排任务以调用直接方法并发送设备双孪生更新
在本部分中,你将创建一个 .NET 控制台应用(使用 C#),该应用使用作业调用 LockDoor 直接方法并将所需的属性更新发送到多个设备。
在 Visual Studio 中,选择“ 文件>新建>项目”。 在 “创建新项目”中,选择 “控制台应用”(.NET Framework),然后选择“ 下一步”。
在 “配置新项目”中,将项目 命名为 ScheduleJob ,然后选择“ 创建”。
接受 .NET Framework 的默认版本,然后选择“ 创建 ”以创建项目。
在解决方案资源管理器中,右键单击 ScheduleJob 项目,然后选择“ 管理 NuGet 包”。
在 NuGet 包管理器中,选择“ 浏览”,搜索并选择 “Microsoft.Azure.Devices”,然后选择“ 安装”。
此步骤下载、安装并添加对 Azure IoT 服务 SDK NuGet 包及其依赖项的引用。
在
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 中心和设备管理模式(例如远程无线固件更新),请阅读 教程:如何执行固件更新。