2017-05-31 46 views
0

我试图通过CoAP使用node-coap从物联网设备传输传感器数据。数据到达CoAP服务器时的顺序对我很重要。我找不到保存数据序列的方法,即使使用confirmable请求选项。保存数据订单是否需要时可以使用CoAP?

我有一个小程序,下面显示了我的意思。

如果数据的顺序/顺序很重要,是否可以使用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(); 
    }); 
}); 

节点方案上面会输出不同的顺序每次跑。

回答

1

它不能只要你使用UDP作为传输。

按照RFC7252:

由于CoAP协议势必可靠传输如UDP,CoAP协议的消息 可以到达的顺序,重复出现,或去无 通知失踪。出于这个原因,CoAP实现了一种轻量级的可靠性机制,而不需要重新创建像TCP那样的传输的完整功能集。它具有以下特点:

  • 简单的停止和等待重传时指数 回退为确认的消息的可靠性。

  • 重复检测可确认和不可确认的 消息。

https://tools.ietf.org/html/rfc7252

有一些努力,使CoAP协议HTTP上的不同实现,但它不属于CoAP协议RFC本身。

如果您绝对不得不使用CoAP,您可以尝试以这种方式进行挖掘。

+0

你的意思是TCP上的CoAP不是HTTP正确的? – rynop

+0

是的。在我使用的实现(Californium,java)中,CoAP-over-TCP目前正在进行中。在其他实现中我不知道这一点。不幸的是,目前只有RFC草案。 –

相关问题