我正在尝试使用node-coap通过CoAP从IoT设备传输传感器数据。到达CoAP服务器时,数据的顺序对我来说很重要。即使使用confirmable
请求选项,我也无法找到保留数据序列的方法。
我下面有一个小程序,显示我的意思。
如果订单/数据序列很重要,是否可以使用CoAP?如果可以的话,我做错了什么?
'use strict';
const coap = require('coap'),
cbor = require('cbor'),
server = coap.createServer();
const sequentialData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let incomingData = [];
let numResponses = sequentialData.length;
server.on('request', (req, res) => {
const obj = cbor.decodeFirstSync(req.payload);
incomingData.push(obj.data);
res.end();
});
server.listen(() => {
const reqOpts = {
hostname: 'localhost',
method: 'POST',
pathname: '/sequential',
options: {
Accept: 'application/cbor'
}
};
sequentialData.forEach((item) => {
const req = coap.request(reqOpts);
req.write(cbor.encode({
data: item
}));
req
.on('response', (res) => {
res.pipe(process.stdout);
res.on('end', () => {
if (--numResponses === 0) {
console.log(`got data in this order`, incomingData);
process.exit();
}
})
});
req.end();
});
});
上面的节点程序每次运行时都会输出不同的顺序。
答案 0 :(得分:1)
只要您使用UDP作为传输,就不会这样。
根据RFC7252:
由于CoAP绑定了不可靠的传输,例如UDP,CoAP消息 可能无序到达,出现重复,或没有失踪 注意。因此,CoAP实现了轻量级可靠性 机制,而不是试图重新创建一个完整的功能集 像TCP这样的传输。它具有以下特点:
具有指数的简单停止等待重传可靠性 可确认消息的退避。
对可确认和不可确认的重复检测 消息。
https://tools.ietf.org/html/rfc7252
在不同的实现中,有一些努力要使用CoAP-over-HTTP,但它不属于CoAP RFC本身。
如果您绝对不得不使用CoAP,您可能会尝试以这种方式进行挖掘。