2017-05-31 124 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草案。 –

相關問題