次の方法で共有

计划和分发作业(.NET)

使用 Azure IoT 中心来计划和跟踪更新数百万台设备的作业。 使用作业可以:

  • 更新所需属性

  • 更新标记

  • 调用直接方法

任务封装其中一个操作,并跟踪由设备孪生查询定义的一组设备的执行情况。 例如,后端应用可以使用作业在 10,000 台设备上调用用来重新启动设备的直接方法。 使用设备孪生查询语句指定设备集,并计划任务在未来的时间运行。 作业跟踪每个设备接收和执行重新启动直接方法的进度。

若要详细了解每项功能,请参阅:

注释

本文中所述的功能仅在 IoT 中心的标准层中可用。 有关基本层和标准/免费 IoT 中心层的详细信息,请参阅 为解决方案选择正确的 IoT 中心层和大小

本文介绍如何创建两个 .NET (C#) 控制台应用:

  • 一个设备应用 SimulateDeviceMethods,它实现了一个名为 LockDoor 的直接方法,该方法可由后端应用调用。

  • 一个后端应用 ScheduleJob,用于创建两个作业。 一个作业调用 lockDoor 直接方法,另一个作业将所需的属性更新发送到多个设备。

注释

有关可用于生成设备和后端应用的 SDK 工具的详细信息,请参阅 Azure IoT SDK

先决条件

  • Visual Studio。

  • IoT 中心。 使用 CLIAzure 门户创建一个。

  • 已注册的设备。 在 Azure 门户中注册一个。

  • 确保已在防火墙中打开端口 8883。 本文中的设备示例使用通过端口 8883 进行通信的 MQTT 协议。 某些企业和教育网络环境中可能会阻止此端口。 有关解决此问题的详细信息和方法,请参阅“连接到 IoT 中心”(MQTT)。

创建模拟设备应用

在本部分中,你将创建一个 .NET 控制台应用,用于响应解决方案后端调用的直接方法。

  1. 在 Visual Studio 中,选择 “创建新项目”,然后选择 “控制台应用”(.NET Framework) 项目模板。 选择“下一步”继续操作。

  2. “配置新项目”中,将项目命名为 SimulateDeviceMethods, 然后选择“ 下一步”。

    Visual Studio 中“配置新项目”弹出窗口的屏幕截图。

  3. 接受 .NET Framework 的默认版本,然后选择“ 创建 ”以创建项目。

  4. 在解决方案资源管理器中,右键单击 SimulateDeviceMethods 项目,然后选择“ 管理 NuGet 包”。

  5. NuGet 包管理器中,选择 “浏览 ”并搜索并选择 “Microsoft.Azure.Devices.Client”。 选择“安装”。

    Visual Studio 中 NuGet 包管理器的屏幕截图。

    此步骤下载、安装并添加对 Azure IoT 设备 SDK NuGet 包及其依赖项的引用。

  6. using文件的顶部添加以下语句:

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. 将以下字段添加到 Program 类。 将占位符值替换为上一部分所述的设备连接字符串:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. 添加以下代码以在设备上实现直接方法:

    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));
    }
    
  9. 添加以下方法以在设备上实现设备孪生侦听器:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. 最后,将以下代码添加到 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);
    }
    
  11. 保存工作并生成解决方案。

注释

为简单起见,本文不实现重试策略。 在生产代码中,应实现重试策略(如连接重试),如 暂时性故障处理中的建议。

获取 IoT 中心连接字符串

在本文中,你将创建一个后端服务,该服务计划作业以在设备上调用直接方法,计划作业以更新设备孪生,并监视每个作业的进度。 若要执行这些作,服务需要 注册表读取注册表写入 权限。 默认情况下,每个 IoT 中心都是使用名为 registryReadWrite 的共享访问策略创建的,该策略授予这些权限。

若要获取 registryReadWrite 策略的 IoT 中心连接字符串,请执行以下步骤:

  1. Azure 门户中,选择 资源组。 选择中心所在的资源组,然后从资源列表中选择中心。

  2. 在中心的左侧窗格中,选择 “共享访问策略”。

  3. 从策略列表中,选择 registryReadWrite 策略。

  4. 复制“主连接字符串”并保存该值

    显示如何检索连接字符串的屏幕截图

有关 IoT 中心共享访问策略和权限的详细信息,请参阅 访问控制和权限

安排任务以调用直接方法并发送设备双孪生更新

在本部分中,你将创建一个 .NET 控制台应用(使用 C#),该应用使用作业调用 LockDoor 直接方法并将所需的属性更新发送到多个设备。

  1. 在 Visual Studio 中,选择“ 文件>新建>项目”。 在 “创建新项目”中,选择 “控制台应用”(.NET Framework),然后选择“ 下一步”。

  2. “配置新项目”中,将项目 命名为 ScheduleJob ,然后选择“ 创建”。

    命名并配置 ScheduleJob 项目

    Visual Studio 中“配置新项目”弹出窗口的屏幕截图,可在其中添加名称。

  3. 接受 .NET Framework 的默认版本,然后选择“ 创建 ”以创建项目。

  4. 在解决方案资源管理器中,右键单击 ScheduleJob 项目,然后选择“ 管理 NuGet 包”。

  5. NuGet 包管理器中,选择“ 浏览”,搜索并选择 “Microsoft.Azure.Devices”,然后选择“ 安装”。

    此步骤下载、安装并添加对 Azure IoT 服务 SDK NuGet 包及其依赖项的引用。

  6. using文件的顶部添加以下语句:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. 如果默认语句中尚不存在,请添加以下 using 语句。

    using System.Threading;
    using System.Threading.Tasks;
    
  8. 将以下字段添加到 Program 类。 将占位符替换为之前在 “获取 IoT 中心连接字符串 ”和设备名称中复制的 IoT 中心连接字符串。

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. 将以下方法添加到 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));
    }
    
  10. 将以下方法添加到 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");
    }
    
  11. 将另一种方法添加到 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 中心查询语言

  12. 最后,将以下行添加到 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();
    
  13. 保存工作并生成解决方案。

运行应用

现在可以运行应用了。

  1. 在 Visual Studio 解决方案资源管理器中,右键单击解决方案,然后选择 “设置启动项目”。

  2. 选择 “通用属性>启动项目”,然后选择 “多个启动项目”。

  3. 确保 SimulateDeviceMethods 位于列表顶部,接着 ScheduleJob。 将两个动作都设置为开始,然后选择确定

  4. 通过单击“ 开始 ”或转到 “调试 ”菜单运行项目,然后单击“ 开始调试”。

    可以看到来自设备和后端应用的输出。

    运行应用以计划作业

后续步骤

在本文中,你计划作业运行直接方法并更新设备孪生的属性。

若要继续开始使用 IoT 中心和设备管理模式(例如远程无线固件更新),请阅读 教程:如何执行固件更新