我必须开发一个 node.js应用程序,它可以与另一个 oneM2M 服务器进行交互。
特别是,node.js应用程序需要使用 CoaP 协议(protocol)交换数据,但我不知道如何以oneM2M兼容方式进行操作。

我使用以下模块启动了 node.js 项目:https://github.com/mcollina/node-coap
但是我需要一些支持才能使用oneM2M协议(protocol)创建CoaP客户端。

代码示例非常感谢。

最佳答案

根据第6.2.1节标题中的TS-0008: CoAP Protocol Binding的介绍,以下使用CoAP方法映射的一个M2M操作:

Operation      CoAP Method
CREATE         POST
RETRIEVE       GET
UPDATE         PUT
DELETE         DELETE
NOTIFY         POST

然后在章节6.2.2.4新选项的定义中,引入了一组新的CoAP选项,映射了一个M2M header 参数。在这里,主要的HTTP header 变量与CoAP选项等效项一起列出:
Header HTTP variable   CoAP Option
X-M2M-Origin           256
X-M2M-RI               257
oneM2M-TY              267

因此,这是执行 GET操作的最小的node.js脚本,即使用路径/<cseBase>/<AE>/<Container>检索容器资源中的最新contentInstance:
var coap = require('coap');

var options = {
    host : '<hostname>',
    port : 5683,
    pathname : "/<cseBase>/<AE>/<Container>/la",
    method : 'get',
    confirmable : 'true',
    options : {
        'Accept' : 'application/json'
    }
};
var bodyString = '';    // void string for GET operation
var responseBody = '';

var req = coap.request(options);
req.setOption("256", new Buffer("<origin>"));   // X-M2M-Origin (mandatory)
req.setOption("257", new Buffer('123456'));     // X-M2M-RI (mandatory)

req.on('response', function (res) {
    res.on('data', function () {
        responseBody += res.payload.toString();
    });
    res.on('end', function () {
        if (res.code == '2.05') {
            console.log('[coap] coap ready, request OK');
            var obj = JSON.parse(responseBody);
            console.log('[coap] responseBody', obj);
        } else {
            console.log('[coap] coap res.code='+res.code);
        }
    });
});
req.write(bodyString);
req.end();

这是一个最小的 POST操作例子,即在容器资源中使用路径/<cseBase>/<AE>/<Container>创建一个contentInstance:
var coap = require('coap');

var options = {
    host : '<hostname>',
    port : 5683,
    pathname : "/<cseBase>/<AE>/<Container>",
    method : 'post',
    confirmable : 'true',

    options : {
        'Content-Format' : 'application/json'
    }
};
var bodyString = new Buffer('{"m2m:cin":{ "con":{"temperature":33}}}');
var responseBody = '';

var req = coap.request(options);
req.setOption("256", new Buffer("<origin>"));   // X-M2M-Origin (mandatory)
req.setOption("257", new Buffer('123456'));     // X-M2M-RI (mandatory)
req.setOption("267", new Buffer([4]));          // ty = 4, ContentInstance resource type

req.on('response', function (res) {
    res.on('data', function () {
        responseBody += res.payload.toString();
    });
    res.on('end', function () {
        if (res.code == '2.05') {
            console.log('[coap] coap ready, request OK');
            var obj = JSON.parse(responseBody);
            console.log('[coap] responseBody', obj);
        } else {
            console.log('[coap] coap res.code='+res.code);
        }
    });
});
req.write(bodyString);
req.end();

09-27 03:36