2017-05-31 8 views
0

J'essaie de transmettre des données de capteur à partir d'un appareil IoT via CoAP en utilisant node-coap. L'ordre des données, tel qu'il arrive au serveur CoAP, est important pour moi. Je ne peux pas trouver un moyen de préserver la séquence de données, même en utilisant l'option de demande confirmable.CoAP peut-il être utilisé lorsque la conservation des données est requise?

J'ai un petit programme ci-dessous qui montre ce que je veux dire.

Est-ce que CoAP ne peut pas être utilisé si l'ordre/la séquence de données est important? Si c'est possible, qu'est-ce que je fais de mal?

'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(); 
    }); 
}); 

programme noeud ci-dessus émet un ordre différent à chaque fois couru.

Répondre

1

Il ne peut pas aussi longtemps que vous utilisez UDP comme transport.

Comme par RFC7252:

Comme CoAP est lié à des transports non fiables comme les messages UDP, CoAP peuvent arriver de l'ordre, apparaissent dupliqués ou disparaissent sans préavis . Pour cette raison, CoAP implémente un mécanisme de fiabilité légère , sans essayer de recréer l'ensemble des fonctionnalités d'un transport comme TCP. Il présente les caractéristiques suivantes:

  • retransmission arrêt et attente simple fiabilité exponentielle back-off pour les messages confirmable.

  • Détection en double pour les messages confirmables et non confirmables.

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

Il y a quelques efforts pour CoAP sur HTTP dans différentes implémentations mais il n'appartient pas à CoAP RFC lui-même.

Vous pouvez essayer de creuser de cette façon si vous êtes absolument obligé d'utiliser CoAP.

+0

Vous voulez dire CoAP sur TCP non HTTP? – rynop

+0

Oui. Dans une implémentation utilisée par moi (Californium, java), CoAP-over-TCP est actuellement en cours. Je ne sais pas à ce sujet dans d'autres implémentations. Malheureusement, il n'y a encore qu'un projet de RFC pour cela. –