使用直接方法(.NET/Node)

Azure IoT 中心是一项完全托管的服务,可在数百万个设备和一个解决方案后端之间实现安全可靠的双向通信。 以前的教程(IoT 中心入门使用 IoT 中心发送云到设备的消息 )介绍了 IoT 中心的设备到云和云到设备的基本消息传递功能。 用户还可以通过 IoT 中心从云调用设备上的非持久方法。 直接方法表示与设备进行的请求-答复式交互,类似于 HTTP 调用,因为它们不管是成功还是失败,速度都非常快(在用户指定的超时过后),会让用户知道调用的状态。 调用设备上的直接方法更详细地介绍了各种直接方法,指导用户何时使用直接方法而不是云到设备消息或所需属性。

本教程演示如何:

  • 使用 Azure 门户创建 IoT 中心,以及如何在 IoT 中心创建设备标识。
  • 创建一个模拟设备应用,该应用包含可通过云调用的直接方法。
  • 创建一个控制台应用,该应用通过 IoT 中心调用模拟设备应用中的直接方法。
Note

目前只能在通过 MQTT 协议连接到 IoT 中心的设备上使用直接方法。 有关如何转换现有设备应用以使用 MQTT 的说明,请参阅 MQTT 支持 一文。

在本教程中,我们将开发 .NET 和 Node.js 控制台应用:

  • CallMethodOnDevice.sln:一个 .NET 后端应用,可调用模拟设备应用上的方法并显示响应。
  • SimulatedDevice.js:一个 Node.js 应用,可模拟使用早先创建的设备标识连接到 IoT 中心的设备,并响应通过云调用的方法。
Note

Azure IoT SDK 一文提供了各种 Azure IoT SDK 的相关信息,用户可以使用这些 SDK 构建可在设备和解决方案后端上运行的应用程序。

若要完成本教程,你需要:

  • Visual Studio 2015 或 Visual Studio 2017。
  • Node.js 版本 0.10.x 或更高版本。
  • 有效的 Azure 帐户。 (如果没有帐户,只需花费几分钟就能创建一个试用帐户。)

创建 IoT 中心

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

  1. 登录到 Azure 门户
  2. 在“跳转栏”中,依次单击“新建” > “物联网” > “IoT 中心”。

    Azure 门户跳转栏

  3. 在“IoT 中心”边栏选项卡中,选择 IoT 中心的配置。

    IoT 中心边栏选项卡

    • 在“名称”框中,输入 IoT 中心的名称。 如果该“名称”有效且可用,“名称”框中会出现绿色的勾选标记。
    • 选择 定价和缩放层。 本教程不需要特定的层。 对于本教程,请使用免费 F1 层。
    • 在“资源组”中,创建资源组或选择现有的资源组。 有关详细信息,请参阅使用资源组管理 Azure 资源
    • 在“位置”中,选择托管 IoT 中心的位置。 对于本教程,请选择最近位置。
  4. 选择 IoT 中心配置选项后,单击“创建”。 Azure 可能需要几分钟时间来创建 IoT 中心。 若要检查状态,可以在“启动板”或“通知”面板中监视进度。

    新的 IoT 中心状态

  5. 成功创建 IoT 中心后,请在 Azure 门户中单击 IoT 中心对应的新磁贴,以打开新 IoT 中心的边栏选项卡。 记下“主机名”,然后单击“共享访问策略”。

    新的 IoT 中心边栏选项卡

  6. 在“共享访问策略”边栏选项卡中,单击“iothubowner”策略,然后复制并记下“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
    

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

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

创建模拟设备应用程序

在本部分,用户需创建一个 Node.js 控制台应用,用于响应解决方案后端调用的方法。

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

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

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. 使用文本编辑器在 simulateddevice 文件夹中创建一个文件,并将其命名为 SimulatedDevice.js
  4. SimulatedDevice.js 文件的开头添加以下 require 语句:

    'use strict';
    
    var Mqtt = require('azure-iot-device-mqtt').Mqtt;
    var DeviceClient = require('azure-iot-device').Client;
    
  5. 添加 connectionString 变量,并使用它创建 DeviceClient 实例。 将 {device connection string} 替换为在“创建设备标识”部分生成的设备连接字符串:

    var connectionString = '{device connection string}';
    var client = DeviceClient.fromConnectionString(connectionString, Mqtt);
    
  6. 添加以下函数,实现设备上的直接方法:

    function onWriteLine(request, response) {
        console.log(request.payload);
    
        response.send(200, 'Input was written to log.', function(err) {
            if(err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.' );
            }
        });
    }
    
  7. 打开与 IoT 中心的连接并初始化方法侦听器:

    client.open(function(err) {
        if (err) {
            console.error('could not open IotHub client');
        }  else {
            console.log('client opened');
            client.onDeviceMethod('writeLine', onWriteLine);
        }
    });
    
  8. 保存并关闭 SimulatedDevice.js 文件。
Note

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

在设备上调用直接方法

在本部分中,用户需创建一个 .NET 控制台应用,以便调用模拟设备应用中的方法,然后显示响应。

  1. 在 Visual Studio 中,使用“ 控制台应用程序 ”项目模板将 Visual C# Windows 经典桌面项目添加到当前解决方案。 确保 .NET Framework 版本为 4.5.1 或更高。 将项目命名为 CallMethodOnDevice

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

  2. 在“解决方案资源管理器”中,右键单击“CallMethodOnDevice”项目,然后单击“管理 NuGet 包...”。
  3. 在“NuGet 包管理器”窗口中,选择“浏览”,搜索 microsoft.azure.devices,选择“安装”以安装 Microsoft.Azure.Devices 包,然后接受使用条款。 该过程将下载、安装 Azure IoT 服务 SDK NuGet 包及其依赖项并添加对它的引用。

    “NuGet 包管理器”窗口

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

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

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    
  6. 将以下方法添加到 Program 类:

    private static async Task InvokeMethod()
    {
        var methodInvocation = new CloudToDeviceMethod("writeLine") { ResponseTimeout = TimeSpan.FromSeconds(30) };
        methodInvocation.SetPayloadJson("'a line to be written'");
    
        var response = await serviceClient.InvokeDeviceMethodAsync("myDeviceId", methodInvocation);
    
        Console.WriteLine("Response status: {0}, payload:", response.Status);
        Console.WriteLine(response.GetPayloadAsJson());
    }
    

    此方法在 myDeviceId 设备上调用名为 writeLine 的直接方法。 然后将设备提供的响应写入到控制台。 请注意,如何指定设备响应的超时值。

  7. 最后,在 Main 方法中添加以下行:

    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    InvokeMethod().Wait();
    Console.WriteLine("Press Enter to exit.");
    Console.ReadLine();
    

运行应用程序

现在,你已准备就绪,可以运行应用程序了。

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

  2. simulateddevice 文件夹的命令提示符处运行以下命令,开始侦听向从 IoT 中心发出的方法调用:

    node SimulatedDevice.js
    

    等待模拟设备打开:

  3. 设备已连接,正在等待方法调用,此时可运行 .NET CallMethodOnDevice 应用,调用模拟设备应用中的方法。 此时会看到写入控制台的设备响应。

  4. 然后,该设备通过输出此消息来响应该方法:

后续步骤

本教程中,在 Azure 门户中配置了新的 IoT 中心,然后在 IoT 中心的标识注册表中创建了设备标识。 你已通过此设备标识启用模拟设备应用的相关功能,使之能够响应通过云调用的方法。 你还创建了一个应用,用于调用设备上的方法并显示来自设备的响应。

若要继续了解 IoT 中心入门知识并浏览其他 IoT 方案,请参阅:

若要了解如何扩展 IoT 解决方案并在多个设备上计划方法调用,请参阅 Schedule and broadcast jobs (计划和广播作业)教程。