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

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

本教程演示如何:

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

在本教程中,我们开发 .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 版本 4.0.x 或更高版本。
  • 有效的 Azure 帐户。 (如果没有帐户,只需花费几分钟就能创建一个试用帐户。)

创建 IoT 中心

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

  1. 登录到 Azure 门户
  2. 选择“新建” > “物联网” > “IoT 中心”。

    Azure 门户跳转栏

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

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

    Important

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

    • 定价和缩放层:对于本教程,请选择“F1 - 免费”层。 有关详细信息,请参阅定价和缩放层

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

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

    • 固定仪表板:选中此选项可以方便地从仪表板访问 IoT 中心。

      IoT 中心窗口

  4. 单击“创建” 。 创建 IoT 中心可能需要数分钟的时间。 可在“通知”窗格中监视进度。

创建 IoT 中心以后,即可找到将设备和应用程序连接到 IoT 中心时需要使用的重要信息。

  1. 成功创建 IoT 中心后,请在 Azure 门户中单击 IoT 中心对应的新磁贴,以打开新 IoT 中心的属性窗口。 记下“主机名”,并单击“共享访问策略”。

    新建 IoT 中心窗口

  2. 在“共享访问策略”中,单击“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

    Important

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

记下结果中的设备连接字符串。 设备应用使用此设备连接字符串以设备身份连接到 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 (计划和广播作业)教程。