使用 Node.js 做设备开发

最后更新:2017-03-14 在GitHub编辑

您可以采用Node.js中的客户端库和示例来构建和开发与 IBM Watson™IoT 平台上个人项目交互的设备代码。

使用提供的信息和示例,通过Node.js开始开发您的设备。

下载Node.js客户端和资源

要访问Watson IoT Platform的Node.js客户端库和其他可用资源,请转到GitHub中的iot-nodejs,并完成安装说明。

有关详细信息,请参阅以下资源:

Github中的模板
NPM上的ibmiotf

构造函数

构造函数构建了设备客户端实例。它接受一个JSON 格式对象,其中包含以下内容:

定义 说明
org 您的组织ID
type 键入您设备的类型。通常,deviceType是执行特定任务的设备的分组,例如“weatherballoon”。
id 设备的ID。通常,对于给定的设备类型,deviceId是该设备的唯一标识符,例如序列号或MAC地址。
auth-method 要使用的认证方法。当前唯一支持的方式是token
auth-token 用于将设备安全连接到Watson IoT平台的认证 token。如果auth-methodtoken,则此字段是必需的。

注意:如果您想使用快速入门服务,那么您只需要提交前三个属性。

    var iotf = require("ibmiotf");
    var config = {
        "org" : "organization",
        "id" : "deviceId",
        "type" : "deviceType",
        "auth-method" : "token",
        "auth-token" : "authToken"
    };

    var deviceClient = new iotf.IotfDevice(config);

使用配置文件

您可以使用JSON配置文件来提供必要的属性配置,而不是直接在代码中使用,如下例所示:

    var iotf = require("ibmiotf");
    var config = require("./device.json");
    var deviceClient = new iotf.IotfDevice(config);

device.json配置文件必须采用以下格式:

{
    "org": "xxxxx",
    "type": "raspi",
    "id": "pi1",
    "auth-method" : "token",
    "auth-token" : "xxxxxxxxxxxxxxxx"
}

连接到 Watson IoT平台

您可以通过调用connect函数连接到Watson IoT平台。

    var iotf = require("ibmiotf");
    var config = require("./device.json");

    var deviceClient = new iotf.IotfDevice(config);

   //设置日志级别进行调试。默认情况下它的“警告”
    deviceClient.log.setLevel('debug');

    deviceClient.connect();

    deviceClient.on('connect', function(){
        var i=0;
        console.log("connected");
        setInterval(function function_name () {
            i++;
            deviceClient.publish('myevt', 'json', '{"value":'+i+'}', 2);
        },2000);
    });

成功连接到 Watson IoT 平台服务后,设备客户端会发送连接事件。这个过程意味着所有的设备控制逻辑都可以在这个回调函数内实现。

设备客户端在连接失败时自动尝试重新连接。当重新连接成功时,客户端发送重新连接事件。

日志记录

默认情况下,仅记录类型为warn的日志事件。如果要增加或减少日志记录级别,请使用log.setLevel函数。支持以下日志级别:

  • trace
  • debug
  • info
  • warn
  • error
    var iotf = require("ibmiotf");
    var config = require("./device.json");

    var deviceClient = new iotf.IotfDevice(config);

    //设置日志级别进行调试。默认情况下它是“警告”
    deviceClient.log.setLevel('debug');

发布事件

事件是设备向Watson IoT平台发布数据的机制。该设备控制事件的内容,并为其发送的每个事件分配一个名称。

当Watson IoT Platform实例接收到事件时,接收到的事件凭据唯一的标识会发送到设备,这意味着当前设备不能模拟其他设备。

您可以提高发布的事件的服务质量(QoS)级别。QoS级别高于0的事件可能需要更长的时间才能发布,因为包含了额外的确认收据信息。

注意:快速入门流模式仅支持QoS级别0。

事件可以发布具有以下属性:

属性 描述
eventType 要发布的事件的类型,例如状态或GPS
eventFormat 事件的格式,例如JSON
data 事件的有效负载,它必须是一个缓冲区字符串。
QoS 发布事件的MQTT服务质量。支持的值为0,1和2。
    var deviceClient = new Client.IotfDevice(config);

    deviceClient.connect();

    deviceClient.on("connect", function () {
        //发布默认服务质量的事件
        deviceClient.publish("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');

        //用户定义的服务质量发布事件
        var myQosLevel=2
        deviceClient.publish("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}', myQosLevel);
    });

处理命令

当设备客户端连接时,它会自动订阅此设备的任何命令。要处理特定的命令,您必须注册一个命令回调函数。当接收到命令时,设备客户端调用命令回调函数。回调函数具有以下属性:

属性 描述
commandName 一个字符串,指定被调用的命令的名称。
format 一个字符串,指定事件的格式,例如JSON。
payload 指定命令有效载荷的数据的字符串。
topic 作为设备发布时,topic字符串不包括设备类型或设备ID;这些都取自客户端ID。例如,iot-2/evt/event_id/fmt/format_string。当应用程序或网关代表设备发布时,主题必须包含设备类型和设备ID。例如iot-2/type/device_type/id/device_id/evt/event_id/fmt/format_string
    var deviceClient = new Client.IotfDevice(config);

    deviceClient.connect();

    deviceClient.on("connect", function () {
    //发布默认服务质量的事件
        deviceClient.publish("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');

    });

    deviceClient.on("command", function (commandName,format,payload,topic) {
        if(commandName === "blink") {
            console.log(blink);
    //为此命令执行的功能
            blink(payload);
        } else {
            console.log("Command not supported.. " + commandName);
        }
    });

处理错误

当设备客户端遇到错误时,它会发送一个错误事件。

    var deviceClient = new Client.IotfDevice(config);

    deviceClient.connect();

    deviceClient.on("connect", function () {
    //发布默认服务质量的事件
        deviceClient.publish("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');

    });

    deviceClient.on("error", function (err) {
        console.log("Error : "+err);
    });
    ....

断开客户端

以下示例显示如何断开客户端并释放连接:

    var deviceClient = new Client.IotfDevice(config);

    deviceClient.connect();

    client.on("connect", function () {
        //发布默认服务质量的事件
        client.publish("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');

        //以用户定义的服务质量发布事件
        var myQosLevel=2
        client.publish("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}', myQosLevel);

        //断开客户端
        client.disconnect();
    });

    //....

原文地址:Node.js for device developers