我正在尝试用node.js coap包来模拟node.js客户端节点。我让LwM2M服务器在我的Raspberry 3上运行并监听端口5555。
目前,我所做的就是将UDP数据包发送到lo (回环)接口。(不过,它被封装在另一个UDP数据包中,它的源和目的地为00: 00:00:00:00:00:00,但这对我来说现在并不重要)。
const coap = require('../') // Script is located inside package examples directory
const endpointClientName = 'someSensor'
const lifetime = '600'
const version = '1.0'
const binding = 'UQ'
let bodyString = '?ep=' + endpointClientName + '<=' + lifetime + '&lwm2m=' + version + '&b=' + binding;
let responseBody = '';
let options = {
host : 'fd72:cafe:face:0:fade:deaf:1234:5678',
port : 5555,
pathname : "/rd",
method : 'POST',
confirmable : 'true',
options : {
'Accept' : 'application/json'
}
};
let request = coap.request(options);
request.on('response', function (response) {
response.on('data', function () {
responseBody += response.payload.toString();
});
response.on('end', function () {
if (response.code == '2.01') {
console.log('[coap] device registered.');
var obj = JSON.parse(responseBody);
console.log('[coap] responseBody', obj);
} else {
console.log('[coap] coap response.code=' + response.code);
}
});
});
request.write(bodyString);
request.end();上面的代码生成包含数据的UDP数据包:
Data (50 bytes)
Data: 44021dff8ea487ebb272646132ff3f65703d736f6d655365...
[Length: 50]下面的数据从wireshark粘贴为十六进制转储
0000 44 02 1d ff 8e a4 87 eb b2 72 64 61 32 ff 3f 65
0010 70 3d 73 6f 6d 65 53 65 6e 73 6f 72 26 6c 74 3d
0020 36 30 30 26 6c 77 6d 32 6d 3d 31 2e 30 26 62 3d
0030 55 51不过,我希望Wireshark将数据包显示为CoAP数据包,其中包含分隔为几个部分的段:
Opt Name: #1: Uri-Path: rdOpt Name: #2: Uri-Query: ep=someSensorOpt Name: #3: Uri-Query: lt=600Opt Name: #4: Uri-Query: lwm2m=1.0Opt Name: #5: Uri-Query: b=UQ我做错了什么?也许我设定了错误的选择?我注意到一些发送请求来处理coap://localhost:port/path,但是我没有通过其他方法获得更好的结果。
发布于 2018-01-02 12:46:07
整个问题是,像lifetime和lwm2m版本这样的选项在包体中,但是它必须用query来描述。
查询:查询字符串。默认为“”。不应包括路径,例如
'a=b&c=d'
在注册设备之后,响应也不是json格式的,所有信息也不是在响应体中,而是在响应选项中:
message.options 所有CoAP选项,如CoAP-分组所解析的。 除了
'Content-Format'、'Accept'和'ETag'之外,所有选项都是二进制格式的。请参阅registerOption()以了解如何注册更多内容。 有关所有可能的选项,请参见https://datatracker.ietf.org/doc/html/draft-ietf-core-coap-18#section-5.4。
尽管如此,只要稍微修改代码,就可以解决问题:
const coap = require('../') // Script is located inside package examples directory
const serverAddress = 'fd72:cafe:face:0:fade:deaf:1234:5678'
const serverPort = 5555
const endpointClientName = 'someSensor'
const lifetime = '600'
const version = '1.0'
const binding = 'UQ'
const uriQuery = 'ep=' + endpointClientName + '<=' + lifetime + '&lwm2m=' + version + '&b=' + binding;
const clientResources = '/1/0'
let options = {
host : serverAddress,
port : serverPort,
pathname : "/rd",
method : 'POST',
confirmable : 'true',
query : uriQuery,
};
let request = coap.request(options);
request.on('response', function (response) {
console.log('[coap] coap response.code = ' + response.code);
console.log('[coap] coap response.options = ' + response.options);
});
request.write(clientResources);
request.end();https://stackoverflow.com/questions/48058828
复制相似问题