Mi-Wi l’alternativa a ZigBee

Le reti wireless sono la naturale evoluzione di quelle wired ed hanno visto il loro sviluppo a partire dalla metà degli anni ottanta con le cosiddette WLAN (Wireless Local Area Network).

Con lo sviluppo di dispositivi mobili di differente tipologia si è manifestata, poi, la necessità di realizzare reti che siano concentrate attorno alla persona e che quindi si estendano per pochi metri in tutte le direzioni. Tali reti si chiamano WPAN (Wireless Personal Area Network) e sono regolate dallo standard IEEE 802.15 (in figura 1 riportata una rappresentazione schematica).

Figura 1: esempio di rete Wireless Personal Area Network (WPAN).

Figura 1: esempio di rete Wireless Personal Area
Network (WPAN).

In particolare, sono definiti tre differenti classi di WPAN, sulla base della velocità di trasmissione, del consumo di energia e della qualità del servizio (QoS):
1- WPAN con data rate elevato (IEEE 802.15.3), indicate per applicazioni multimediali che richiedono un trasferimento dati real-time.

2- WPAN con data rate intermedio (IEEE 802.15.1/Bluetooth), indicate per una gran varietà di compiti tra cui telefoni cellulari, PDA ed in generale applicazioni adatte per comunicazioni vocali (es. auricolari per telefonini).

3-  WPAN  con  data  rate  basso  (IEEE 802.15.4/LR-WPAN), particolarmente indicate in campo industriale, home automation, medicale ed in generale per tutte quelle applicazioni che necessitano di un basso costo, ridotti consumi di potenza e velocità di trasmissione. In quest’ultima categoria rientra lo standard ZigBee.

Mi-Wi  Overview

Implementare applicazioni di rete basate sulle tecnologie wireless è diventato molto diffuso soprattutto negli ultimi anni. Dai dispositivi consumer alle applicazioni industriali è sempre più crescente la necessità di dotare gli apparati della capacità di comunicare tra loro senza l’ostacolo di troppi fili. Poiché si è assistito al proliferare di numerosi protocolli wireless, la sfida dei progettisti è diventata quella di selezionare  il giusto protocollo di rete e implementarlo in modo da ridurre al minimo il time-to-market. Microchip ha proposto, sulla base dello stack ZigBee, un protocollo proprietario noto TM con il nome di MiWi . Si tratta di un protocollo specifico per basse velocità, brevi distanze e costi ridotti. E’ fondamentalmente basato su IEEE 802.15.4, standard che regola il funzionamento delle WPAN. In particolare, MiWi ha come target application reti wireless dalle piccole dimensioni, con brevi hops tra i nodi; il livello fisico è implementato tramite il chip MRF24J40 funzionante nell’intorno della frequenza 2.4GHz. Una rete che utilizzi il protocollo MiWi è in grado di gestire fino a 1024 nodi. Ciascun nodo coordinatore è capace di controllare fino a 127 nodi figli ed il massimo numero di coordinatori è 8. Un pacchetto può effettuare, per passare dal mittente al destinatario, massimo 4 hops. Nel seguito dell’articolo si utilizzeranno, tra gli altri, termini come cluster e socket. Per maggiore chiarezza si specifica, sin da ora, il loro significato nelle applicazioni per reti MiWi ed in generale per WPAN. Il termine cluster si riferisce ad un gruppo di nodi che formano una rete. La profondità di cluster in una rete MiWi non può superate  il valore di 3 (nodi) ed ogni cluster deve avere un supervisore (clusterhead). Il secondo termine è socket e si riferisce ad una connessione virtuale tra due dispositivi. Ogni volta che un nodo deve registrarsi ad un cluster, instaura una procedura che gli consente di aprire un socket con altri dispositivi. Con l’uso dei socket, i  nodi nella rete posso trovare altri nodi dinamicamente senza avere alcuna informazione della rete pre-esistente.

Lo stack  MY-WI

PHY e MAC dello  standard IEEE 802.15.4

Lo stack MiWi si basa sui layer MAC e PHY delle specifiche  IEEE 802.15.4. Il protocollo fornisce la possibilità di cercare, formare e unirsi ad una rete oppure scoprire nodi nella rete ed effettuare l’instradamento tra essi. Lo standard prevede tre differenti bande di frequenze operative. Ciascuna banda di frequenza definisce uno specifico numero di canali e conseguentemente offre un bit rate differente. La tabella 1 specifica per ogni banda, il relativo  numero di canali ed il bit rate massimo.

TABELLA 1

TABELLA 1: banda di frequenza e canali disponibili

Si tenga presente che quest’ultimo valore comprende anche l’eventuale overhead del protocollo: quindi la velocità effettiva è sempre minore dei valori riportati in tabella. La lunghezza massima del pacchetto è di 127byte, incluso il controllo CRC a 16 bit. Quest’ultimo consente di garantire l’integrità dei dati. Inoltre, è utilizzato un meccanismo particolare per verificare l’avvenuta consegna del pacchetto. In questo caso si sfrutta un campo (ACK) che se impostato ad 1, richiede una risposta al ricevitore; se questa risposta non arriva entro un certo tempo, il trasmettitore ripete la trasmissione un certo numero di volte prima di dichiarare l’errore. E’ importante notare che questo meccanismo garantisce esclusivamente la consegna del pacchetto senza errori e non la corretta elaborazione dell’informazione da parte del ricevitore. Ad esempio, potrebbe succedere che il messaggio venga consegnato correttamente, ma a causa dell’incapacità di elaborazione dei layer superiori,  il nodo scarti il pacchetto consegnato.

Tipi di nodi

Il  protocollo IEEE 802.15.4 definisce 2 tipi di dispositivi:  FFD (Full Function Device) e RFD (Reduced Function Device). Il protocollo MiWi definisce 3 tipi di dispositivi in base alle loro funzionalità nella rete:

➤ Coordinatore della PAN.
➤ Coordinatore.
➤ Dispositivo terminale

Dei tre tipi di nodi il più importante è sicuramente il  PAN Coordinator. Esso è quello che avvia la rete, seleziona  il canale e l’ID della PAN. Tutti gli altri dispositivi che si uniscono alla rete devono riferirsi alle istruzioni di tale nodo.

Topologie  di rete

Esistono differenti topologie di rete come si può vedere in figura 2.

Figura 2: le topologie previste per le reti MiWi sono di tre differenti tipi: a stella, a maglia e cluster-tree.

Figura 2: le topologie previste per le reti MiWi sono di tre differenti tipi: a stella, a maglia e cluster-tree.

Il progettista dovrà di volta in volta riferirsi a quella che più si adatta alla propria applicazione. Un primo tipo di rete è quella a stella. Essa consiste di un PAN Coordinator ed uno o più dispositivi. In una stella tutti gli end device comunicano solo con il coordinatore della PAN. Questo significa che se un nodo deve trasferire dei dati ad un altro dispositivo, dovrà necessaria mente passare dal centro stella. Ovviamente, il punto debole di questa topologia è proprio nel centro stella: se ci sono problemi in questo nodo, tutta la rete è fuori servizio. La topologia cluster-tree è più complessa rispetto alla precedente.  In essa esiste ancora un unico coordinatore di rete; però ci sono altri nodi che possono unirsi alla rete con il ruolo di coordinatori “secondari”. Questo forma una specie di albero, in cui il PAN Coordinator rappresenta la radice, gli altri coordinatori sono i rami ed infine gli end device rappresentano le foglie. Perchè un messaggio arrivi al destinatario è necessario che segua il percorso dell’albero. Questo tipo di rete è noto con il termine di multi-hop. Con questo termine ci si riferisce al numero di coordinatori attraverso cui il pacchetto deve passare. Ad esempio nelle reti a stella il massimo numero di hop è pari a 1 (il PAN Coordinator). In una rete cluster-tree  il massimo valore è pari a 4 e comunque non più di 2 hop di distanza dal PAN Coordinator. In questo caso i coordinatori sono l’equivalente dei router nelle reti LAN. Infine, una rete mesh è simile ad una cluster-tree nella topologia, ma la differenza è nell’instradamento dei pacchetti. Essi posso infatti transitare direttamente da un FFD ad un altro FFD, anziché seguire la struttura dell’albero. Il vantaggio principale di questa rete è nella minore latenza del messaggio e nella maggiore affidabilità. Anche questo tipo di rete è di tipo multi-hop.

Indirizzamento nella  rete

Esistono tre tipi di indirizzi definiti da IEEE 802.15.4:

1- EUI (Extended Organizationally Unique Identifier). E’ un indirizzo di 8 byte unico a livello globale. Esso è l’equivalente degli indirizzi MAC per i dispositivi  di rete LAN.
2- PAN identifier. E’ l’identificativo di rete a 16 bit. Tale indirizzo è utilizzato dal dispositivo quando decide di unirsi ad una rete.
3- Short Address. E’ un indirizzo a 16 bit che è assegnato al nodo dal suo rispettivo coordinatore. E’ unico all’interno della PAN ed è utilizzato per l’invio di messaggi. Il PAN coordinator deve avere sempre indirizzo 0000h. La figura 3 illustra il significato di ogni singolo bit del campo Short Address. Il campo Parent’s Number (bit 10÷8) è unico per ogni coordinatore nella rete, incluso il PAN coordinator. Poiché tale campo è costituito da soli 3 bit, il massimo numero di coordinatori in una rete MiW i  è pari a 8. Il  campo Child’s Number (bit 6÷0) di ogni coordinatore nella rete sarà 00h. Questo indica appunto che il nodo sta operando come coordinatore. Altri valori sono indicativi del tipo di dispositivo (FFD o RFD) e della loro funzione.

Figura 3: composizione dell’indirizzo breve utilizzato all’interno di una rete MiWi per trasmettere e ricevere messaggi tra dispositivi.

Figura 3: composizione dell’indirizzo breve utilizzato all’interno di una rete MiWi per trasmettere e ricevere
messaggi tra dispositivi.

 

Figura 4: assegnazione del Short Address all’interno di una tipica rete MiWi.

Figura 4: assegnazione del Short Address all’interno di una tipica rete MiWi.

 

Il bit RxOffWhenIdle indica, se imposto ad 1, che il dispositivo ha spento il proprio trasmettitore ed è incapace di ricevere pacchetti. In questo caso il corrispondente dispositivo padre dovrà conservare i pacchetti finché il nodo non si risveglia. Infine, i  bit 15÷11 sono sempre impostati a ‘0’. In figura 5 è riportato l’header di un pacchetto MiWi. Come si nota, tra gli altri campi vi è anche l’indirizzo breve del destinatario e del mittente. Oltre questi valori, sono anche presenti:

1- Hops, rappresenta il numero di salti che il pacchetto deve compiere. 00h significa che il pacchetto non deve essere ritrasmesso. Se il valore è diverso da 00h allora il nodo che lo riceve capisce che deve ritrasmetterlo, ma prima decrementa di una unità il suo valore.
2- Frame Control, definisce  il comportamento di ogni pacchetto.
3- Dest PANID e Source PANID, rappresenta la rete di destinazione e di origine del pacchetto.
4- Sequenze Number, indica lo stato del pacchetto.
5- Report Type, è identificativo di chi ha generato il pacchetto; se il valore è 00h, allora il messaggio  è stato generato dallo Stack, mentre se è compreso tra 01h e FFh allora sono pacchetti generati dall’utente.
6- Report ID, il tipo di messaggio contenuto in questo pacchetto.

Figura 5: header di un pacchetto MiWi (tutti i valori sono espressi in byte).

Figura 5: header di un pacchetto MiWi (tutti i valori sono espressi in byte).

Creazione e gestione del progetto MiWi

Per assistere gli sviluppatori nella progettazione del firmware, Microchip fornisce un analizzatore di protocollo, chiamato ZENA. La figura 6 riporta una schermata del software.

Figura 6: il software ZENA, fornito da Microchip, aiuta gli sviluppatori nella progettazione di applicazioni basate su MiWi o ZigBee

Figura 6: il software ZENA, fornito da Microchip, aiuta gli sviluppatori nella progettazione di applicazioni basate su MiWi o ZigBee

Il  software consente di creare i  file di configurazione specifici per l’applicazione ed analizzare  il traffico dati precedentemente catturato. La versione fornita con lo stack MiWi è dimostrativa, mentre quella completa è venduta con un kit a parte e consente di effettuare un’analisi in real-time del traffico dati, tramite uno sniffer RF collegabile al PC tramite porta USB.

Organizzazione del flusso del codice

Il protocollo MiWi è scritto in maniera da garantire un multitasking di tipo cooperativo. Questo significa che tutti i  task devono cooperare tra loro perché tutto il sistema funzioni. Ogni task deve durare un tempo prestabilito e poi rilasciare l’uso del processore agli altri processi. Questo tipo di multitasking si differenzia da quello preemptive, in cui ogni processo può essere interrotto da un altro di maggiore priorità. Nel caso del MiWi di Microchip, questo comporta che mentre lo stack sta effettuando operazioni lunghe (es. ricerca o unione ad una rete), esso rilasci il controllo della CPU all’applicazione utente. Dopo è responsabilità dell’utente restituire il controllo allo stack. Ovviamente, anche l’applicazione utente non deve protrarsi per un tempo molto lungo, nel qual caso è necessario frammentare il relativo  task, secondo quanto riportato nel listato 1.

#define MAX_APPLICATION_STATE 1
BYTE applicationState=0;
while(1)
{
           MiWiTasks();
           Switch(applicationState)
           {
                   case 0:
                   //prima parte dell’applicazione utente
                   break;
                   case 1:
                   // seconda parte dell’applicazione utente
                   break;
       }
       applicationState++;
       if(applicationState>MAX_APPLICATION_STATE){ applicationState=0; }
}
Listato 1

Strutture dati  utilizzate

Ci sono due strutture dati che sono condivise tra lo Stack e l’applicazione utente: la tabella di rete ed il buffer RX/TX. Lo stack utilizza la tabella di rete per memorizzare le informazioni, quali reti disponibili, numero e tipo di nodi associati. Il risultato di ogni socket aperto crea una entry in tale tabella. La sua dimensione è configurabile attraverso il software ZENA oppure tramite modifica manuale del file MiWiDefs.h.

Operazioni tipiche  sullo stack

Ricerca  di una rete

La ricerca di reti disponibili a cui il nodo deve collegarsi è la prima fondamentale operazione che bisogna eseguire. La funzione DiscoverNetworks() effettua la ricerca su tutti i canali specificati  nell’array dei canali disponibili (parametro impostabile via ZENA o manualmente) e riempie la tabella di rete. La funzione SearchingForNetworks() consente di scoprire lo stato di avanzamento della ricerca: essa restituisce TRUE se il dispositivo  sta ancora effettuando la scansione della rete.

Unione  alla  rete

Quando la ricerca delle reti è completata, il dispositivo  analizzerà l’intera lista per decidere se ci sono reti a cui unirsi. Se una rete adeguata è rilevata, il  dispositivo tenterà di unirsi. La funzione JoinNetworks() esegue le operazioni necessarie, mentre lo stato di avanzamento di questa operazione può essere monitorato tramite la funzione AttemptingToJoinNetwork(). Quando quest’ultima funzione restituirà FALSE, allora la funzione MemberOfNetworks() indicherà se il dispositivo si è unito oppure no alla rete.

Formazione di una rete

Un dispositivo in grado di diventare PAN Coordinator, se rileva che non ci sono ancora reti disponibili, può decidere di crearne una nuova, diventando esso stesso il coordinatore.  La funzione da utilizzare in questo caso è FormNetwork().  Il parametro di input da passare a questa funzione è l’identificativo della rete (PAN ID). Se si passa il valore FFFFh significa generare un PAN ID random.

Trasmissione e ricezione dei dati

Coma già spiegato in precedenza, lo standard IEEE 802.15.4 definisce la dimensione del pacchetto in 127 byte. Il dispositivo Microchip utilizzato come transceiver (MRF24J40) dispone di un buffer di trasmissione e ricezione di 128 byte. Anche questo parametro può essere impostato manualmente oppure tramite ZENA. Il listato 2 riporta un esempio per la trasmissione di un pacchetto.

WriteData(0x55);// Report Type
WriteData(0xAA);// Report ID
WriteData(0xFF);// Data
SendReportByHandle(0x00,FALSE); // invia il pacchetto al dispositivo a cui
                                //corrisponde la prima entry
                               //nella tabella di rete
Listato 2
if(RxPacket())
{
  switch(*pRxData++)
  { //report type
  case USER_REPORT_TYPE:
  switch(*pRxData++)
  { //report id
  case LIGHT_REPORT:
  switch(*pRxData++)
   { //first byte of payload
  case LIGHT_ON:
  LATAbits.LATA1 = 1;
  break;
 }
}
break;
default:
while(RxSize—){
PrintChar(*pRxData++); //unknown data, print it out
}
break;
}
Listato 3

Prima di inviare qualsiasi dato, è necessario trasmettere i byte Report Type e Report ID. Ci sono differenti modi per inviare un pacchetto in una rete MiWi. Per i  nodi che hanno una entry nella tabella di rete, il modo più semplice è quello di fare una chiamata alla funzione SendReportByHandle(). E’ anche possibile, conoscendo l’indirizzo del nodo di destinazione, utilizzare la funzione SendReportByShortAddress() oppure SendReportByLongAddress(). Per sapere se un pacchetto è stato ricevuto si utilizza la funzione RxPacket(); in questo caso essa restituisce TRUE. La variabile RxSize conterrà il numero di byte disponibili e pRxData rappresenta  il puntatore alla prima posizione di tali dati. Il listato  3 riporta un esempio di lettura di un pacchetto.

 

2 Commenti

  1. Andrea Garrapa Andrea Garrapa 12 febbraio 2018

Scrivi un commento

EOS-Academy
EOS-Academy