使用 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-method是token,则此字段是必需的。 |
注意:如果您想使用快速入门服务,那么您只需要提交前三个属性。
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();
});
//....