xbee, invio "sicuro"

Tra un xbee e l'altro ci sono un bel po' di ostacoli, a volte mi perde qualche "invio"... quando arriva lo fa in maniera perfetta, ma io vorrei avere la certezza che mi arrivi sempre o che al massimo ci ritenti subito dopo il primo invio non corrisposto.

Sapete se esiste qualche settaggio direttamente nella configurazione degli xbee pro series 2 o non mi rimane altra scelta che implementare questa funzione via codice?

Non parlo di integrità dati eh, ripeto, quella è perfetta... il problema è che mi salta direttamente un pacchetto o due ogni 100... e visto che sto costruendo un antifurto vorrei evitare che mi perda proprio quell'invio.

Gli Xbee di loro già prevedono il rinvio pacchetto se ci sono problemi di ricezione, avviene in modo trasparente all'utente, però se il pacchetto non arriva proprio, o talmente corrotto da non poterne trarre nessuna informazione, non hanno modo di richiederlo nuovamente.
Devi essere tu che richiedi nuovamente un pacchetto dati totalmente mancante se non ti arriva entro un certo time out o quello che ricevi non corrisponde a quanto atteso.

Grazie astro... purtroppo speravo che bisognasse abilitare qualcosa per avere questa funzione, così da evitare di inserire ulteriore codice nello sketch.

Mi toccherà implementare la ricevuta di ritorno... sono conciato peggio delle poste! :slight_smile:

Ti basta usare un CRC: alleghi la somma di controllo alla fine del pacchetto. All'arrivo, ricalcoli il CRC sui dati ricevuti e lo compari col CRC spedito. Se sono diversi ciò che hai ricevuto è errato (dati, CRC o entrambi). Se i dati non sono molti, ti basta il CRC8, che pesa pochissimo in termini di risorse (è un algoritmo relativamente semplice), altrimenti il CRC16.

Si parla di una stringa da 8/10 caratteri...

Il tuo http://www.leonardomiliani.com/2013/un-semplice-crc8-per-arduino/ va bene, giusto?

Ma non c'è più la possibilità di editare i messaggi?

Comunque devo tirare in piedi qualcosa per verificare che mi arrivi il messaggio, perché l'integrità non è un problema.

Sì, il CRC8 del mio sito va più che bene.

Sulla questione dell'edit, ho chiesto perché in diversi utenti avete fatto presente che passati alcuni minuti non vi è più possibile modificarli.

terrornoize:
Comunque devo tirare in piedi qualcosa per verificare che mi arrivi il messaggio, perché l'integrità non è un problema.

Non ti avevo risposto a questo.
L'uso del CRC ti permette di verificare che entrambi i dati spediti, dati e CRC, arrivino integri:

  • se i dati arrivano errati ma il CRC sano, il ricalcolo fatto dal ricevitore darà un CRC diverso da quello allegato al pacchetto
  • se i dati arrivano sani ma il CRC errato, anche in questo caso il ricalcolo ti darà un CRC diverso da quello allegato.
  • idem se entrambi (dati e CRC) arrivano alterati.

Se poi vuoi più sicurezza sul fatto che non ci possa essere un CRC identico per due pacchetti dati diversi, allora devi usare un CRC con una somma di controllo più lunga di 8 bit (16 o 32). Però fai delle prove, prima perché se non si parla di tanti dati trasmessi, il CRC8 potrebbe bastarti.

Il problema rimane sempre lo stesso però... se il dato non mi arriva, posso verificare tutte le integrità che voglio, ma non serve a nulla. :cry:

Peccato che non ci sia una cosa a livello di xbee per tracciare se un messaggio sia stato "recepito" dall'altro...

COme ti ha detto astrobeed, devi mettere un timeout, ossia un sistema per attendere la ricezione del dato entro un certo lasso di tempo, trascorso il quale senza aver ricevuto nulla richiedi il pacchetto nuovamente.
Ad abbondanza, puoi anche mettere un controllo per cui se dopo X richieste i dati non sono arrivati, esci con un errore di ricezione.

Dovrei quindi tirare in piedi una cosa del genere...

modulo invia dato "xxxx"
centralina riceve dato "xxxx" invia "xxxx-ok"
se il modulo riceve "xxxx-ok" bene, altrimenti lo reinvia...

è giusto come ragionamento?

oppure
modulo "xxxx"+crc
centralina riceve "xxxx"+crc e manda crc
se modulo riceve crc e il confronto con quello che ha inviato è ok, altrimenti rimanda...

Ma quel crc8 fa anche il controllo su una stringa di dati? scusami ma ho poca esperienza in merito con queste cose...

terrornoize:
Peccato che non ci sia una cosa a livello di xbee per tracciare se un messaggio sia stato "recepito" dall'altro...

Non ci siamo capiti, gli Xbee sfruttano un protocollo dati abbastanza complesso, se sono serie 2 usano il protocollo Zigbee, tra loro comunicano a 250 kbps e se c'è un problema di integrità dati su un pacchetto ricevuto viene richiesto nuovamente in automatico.
Però se il pacchetto non viene proprio ricevuto non c'è nulla da richiedere nuovamente e gli Xbee non possano sapere cosa deve arrivare e quando deve arrivare.
Dal lato Tx l'xbee che cerca di inviare il pacchetto fa una serie di retry se non riesce a contattare l'Rx, però una volta scaduti i tentativi, mi pare tre (da verificare), semplicemente viene abortita la trasmissione.
Se usi gli Xbee in modalità API puoi interrogarli per conoscere lo stato trasmissione, in modalità trasparente no, però utilizzarli in questo modo è abbastanza complesso e non credo ne valga la pena, fai prima a verificare la cosa a livello ricezione.

astrobeed:
Dal lato Tx l'xbee che cerca di inviare il pacchetto fa una serie di retry se non riesce a contattare l'Rx, però una volta scaduti i tentativi, mi pare tre (da verificare), semplicemente viene abortita la trasmissione.

Ecco, questo sarebbe interessante approfondire... se ci fosse la possibilità di modificare direttamente il numero di tentativi risolverebbe subito il mio problema, senza star li a sclerare con il codice, che per adesso non è il mio miglior alleato!

Tramite xctu non mi sembra di poter modificare i retries... :sob:

Settarli in API è tanto difficile?

astrobeed:
Non ci siamo capiti, gli Xbee sfruttano un protocollo dati abbastanza complesso, se sono serie 2 usano il protocollo Zigbee, tra loro comunicano a 250 kbps e se c'è un problema di integrità dati su un pacchetto ricevuto viene richiesto nuovamente in automatico.

Interessante questo. Quindi o il pacchetto arriva integro e lo passano al dispositivo ricevitore oppure se arriva corrotto sono loro ad accorgersene ed a richiederlo nuovamente al modulino trasmettitore. Sicché non serve nessun CRC, usando questi moduli? Bella cosa, non la sapevo.