计划和广播作业 (.NET/Node.js)

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

  • 更新所需属性
  • 更新标记
  • 调用直接方法

作业包装上述操作之一,并跟踪针对一组设备(由设备孪生查询定义)的执行情况。 例如,后端应用可以使用作业在 10,000 台设备上调用直接方法来重启设备。 使用设备孪生查询指定设备集,并将作业计划为在以后运行。 每个设备接收和执行 reboot 直接方法时,该作业会跟踪进度。

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

Note

本文中所述的功能仅可在 IoT 中心的标准层中使用。 有关基本和标准 IoT 中心层的详细信息,请参阅如何选择合适的 IoT 中心层

本教程演示如何:

  • 创建一个设备应用,用于实现名为 lockDoor、可由后端应用调用的直接方法。 该设备应用还从后端应用接收所需的属性更改。
  • 创建一个后端应用,该应用创建一个作业以在多台设备上调用 lockDoor 直接方法。 另一个作业将所需的属性更新发送到多台设备。

本教程结束时,用户会有一个 Node.js 控制台设备应用,以及一个 .NET (C#) 控制台后端应用:

simDevice.js:用于连接到 IoT 中心,实现 lockDoor 直接方法,并处理所需的属性更改。

ScheduleJob:使用作业来调用 lockDoor 直接方法,并在多台设备上更新设备孪生所需的属性。

要完成本教程,需要以下各项:

  • Visual Studio 2015 或 Visual Studio 2017。
  • Node.js 版本 4.0.x 或更高版本。 准备开发环境一文介绍了如何在 Windows 或 Linux 上安装本教程所用的 Node.js。
  • 有效的 Azure 帐户。 如果没有帐户,可以创建一个试用帐户,只需几分钟即可完成。

创建 IoT 中心

创建模拟设备应用要连接到的 IoT 中心。 以下步骤说明如何使用 Azure 门户来完成此任务。

  1. 登录到 Azure 门户

  2. 选择“创建资源” > “物联网” > “IoT 中心”。

    Azure 门户跳转栏

  3. 在“IoT 中心”窗格中,输入 IoT 中心的以下信息:

    • 订阅:选择需要将其用于创建此 IoT 中心的订阅。

    • 资源组:创建用于托管 IoT 中心的资源组,或使用现有的资源组。 有关详细信息,请参阅使用资源组管理 Azure 资源

    • 区域:选择最近的位置。

    • 名称:创建 IoT 中心的名称。 如果输入的名称可用,会显示一个绿色复选标记。

    Important

    IoT 中心将公开为 DNS 终结点,因此,命名时请务必避免包含任何敏感信息。

    IoT 中心基本信息窗口

  4. 选择“下一步: 大小和规模”,以便继续创建 IoT 中心。

  5. 选择“定价和缩放层”。 就本文来说,请选择“F1 - 免费”层(前提是此层在订阅上仍然可用)。 有关详细信息,请参阅定价和缩放层

    IoT 中心大小和规模窗口

  6. 选择“查看 + 创建”。

  7. 查看 IoT 中心信息,然后单击“创建”。 创建 IoT 中心可能需要数分钟的时间。 可在“通知”窗格中监视进度。

  8. 新的 IoT 中心就绪以后,请在 Azure 门户中单击其磁贴,打开其属性窗口。 创建 IoT 中心以后,即可找到将设备和应用程序连接到 IoT 中心时需要使用的重要信息。 单击“共享访问策略”。

  9. 在“共享访问策略”中,选择 iothubowner 策略。 复制 IoT 中心连接字符串 ---主密钥供以后使用。 有关详细信息,请参阅“IoT 中心开发人员指南”中的访问控制

    共享访问策略

创建设备标识

本部分使用名为 iothub-explorer 的 Node.js 工具为本教程创建设备标识。 设备 ID 区分大小写。

  1. 在命令行环境中运行以下命令:

    npm install -g iothub-explorer@latest

  2. 然后,运行以下命令登录到中心。 将 {iot hub connection string} 替换为前面复制的 IoT 中心连接字符串:

    iothub-explorer login "{iot hub connection string}"

  3. 最后,以下使用命令创建名为 myDeviceId 的新设备标识:

    iothub-explorer create myDeviceId --connection-string

    Important

    收集的日志中可能会显示设备 ID 用于客户支持和故障排除,因此,在为日志命名时,请务必避免包含任何敏感信息。

记下结果中的设备连接字符串。 设备应用使用此设备连接字符串以设备身份连接到 IoT 中心。

若要以编程方式创建设备标识,请参阅 IoT 中心入门

计划用于调用直接方法和发送设备孪生更新的作业

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

  1. 在 Visual Studio 中,使用“控制台应用程序”项目模板将 Visual C# Windows 经典桌面项目添加到当前解决方案。 ScheduleJob

    新的 Visual C# Windows 经典桌面项目

  2. 在“解决方案资源管理器”中,右键单击“ScheduleJob”项目,并单击“管理 NuGet 包...”。

  3. 在“NuGet 包管理器”窗口中,选择“浏览”,搜索 microsoft.azure.devices,选择“安装”以安装 Microsoft.Azure.Devices 包,并接受使用条款。 此步骤将下载、安装 Azure IoT 服务 SDK NuGet 包及其依赖项并添加对它的引用。

    “NuGet 包管理器”窗口

  4. Program.cs 文件顶部添加以下 using 语句:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  5. 如果默认语句中不存在下面的 using 语句,请添加该语句。

    using System.Threading;
    using System.Threading.Tasks;
    
  6. 将以下字段添加到 Program 类。 将占位符替换为上一部分中为中心创建的 IoT 中心连接字符串。

    static string connString = "{iot hub connection string}";
    static ServiceClient client;
    static JobClient jobClient;
    
  7. 将以下方法添加到 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));
    }
    
  8. 将以下方法添加到 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='myDeviceId'",
            directMethod,
            DateTime.Now,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Method Job");
    }
    
  9. 将以下方法添加到 Program 类:

    public static async Task StartTwinUpdateJob(string jobId)
    {
        var twin = new Twin();
        twin.Properties.Desired["Building"] = "43";
        twin.Properties.Desired["Floor"] = "3";
        twin.ETag = "*";
    
        JobResponse result = await jobClient.ScheduleTwinUpdateAsync(jobId,
            "deviceId='myDeviceId'",
            twin,
            DateTime.Now,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Twin Update Job");
    }
    
  10. 最后,在 Main 方法中添加以下行:

    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();
    
  11. 在“解决方案资源管理器”中,打开“设置启动项目...”,并确保 ScheduleJob 项目的“操作”为“启动”。 生成解决方案。

创建模拟设备应用程序

在本部分中,创建响应云调用的直接方法的 Node.js 控制台应用,这会触发模拟的设备重新启动并使用报告属性启用设备孪生查询,以标识设备和及其上次重新启动的时间。

  1. 新建名为 simDevice的空文件夹。 在 simDevice 文件夹的命令提示符处,使用以下命令创建 package.json 文件。 接受所有默认值:

    npm init
    
  2. simDevice 文件夹的命令提示符处,运行下述命令以安装 azure-iot-deviceazure-iot-device-mqtt 包:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. simDevice.js 文件夹中,利用文本编辑器创建新的 simDevice 文件。

  4. simDevice.js 文件的开头添加以下“require”语句:

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. 添加 connectionString 变量,并使用它创建一个客户端实例。 请确保使用适合的值替换占位符。

    var connectionString = 'HostName={youriothostname};DeviceId={yourdeviceid};SharedAccessKey={yourdevicekey}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. 添加以下函数以处理 lockDoor 方法。

    var onLockDoor = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, function(err) {
            if (!err) {
                console.error('An error occured when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        console.log('Locking Door!');
    };
    
  7. 添加以下代码以注册 lockDoor 方法的处理程序。

    client.open(function(err) {
        if (err) {
            console.error('Could not connect to IotHub client.');
        }  else {
            console.log('Client connected to IoT Hub.  Waiting for lockDoor direct method.');
            client.onDeviceMethod('lockDoor', onLockDoor);
        }
    });
    
  8. 保存并关闭 simDevice.js 文件。

Note

为简单起见,本教程不实现任何重试策略。 在生产代码中,应该按 MSDN 文章 Transient Fault Handling(暂时性故障处理)中所述实施重试策略(例如指数性的回退)。

运行应用

现在,已准备就绪,可以运行应用。

  1. 在 simDevice 文件夹的命令提示符处,运行以下命令以开始侦听重启直接方法。

    node simDevice.js
    
  2. 通过右键单击“ScheduleJob”项目,并依次选择“调试”和“启动新实例”,运行 C# 控制台应用 ScheduleJob

  3. 会出现设备和后端应用的输出。

    运行应用以计划作业

后续步骤

在本教程中,使用了作业来安排用于设备的直接方法以及设备孪生属性的更新。

若要继续完成 IoT 中心和设备管理模式(如远程无线固件更新)的入门内容,请参阅教程:如何更新固件

要了解如何将 AI 部署到具有 Azure IoT Edge 的边缘设备,请参阅 IoT Edge 入门