Utilizzare UDP per creare una semplice comunicazione via lan
Il protocollo UDP(User Datagram Protocol) è molto utilizzato per trasmettere dati in maniera molto veloce ed efficiente tra applicazioni semplici. Anche Arduino supporta questo protocollo ed è quindi consigliato per permettere connessioni rapide e semplici tra le schede. Se ci troviamo nella situazione in cui abbiamo delle schede collegate in una LAN e abbiamo il bisogno di scambiare dati tra loro, il protocollo UDP è sicuramente il metodo più veloce e rapido da semplice da usare.
Possiamo utilizzare delle schede Arduino UNO con Ethernet shield, Arduino Ethernet o schede della serie MKR con shield MKR ETH.
Le libreria da utilizzare è quella ufficiale Arduino che supporta sia schede con chip Wiz5100 sia quelle con chip Wiz5500.
#include<Ethernet.h> #include<EthernetUdp.h>
Nel blocco setup() dobbiamo inizializzare la classe Ethernet, creare un oggetto dalla classe EthernetUDP:
//Indirizzo mac della board
byte mac[] = { 0xD5, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//indirizzo ip della board
IPAddress ip(10, 192, 1, 177);
//porta utilizzata per udp
unsigned int localPort = 7878;
//definisco un array di char per memorizzare i
//dati in ricezione
char DatiRX[20];
//Creo un oggetto
EthernetUDP Udp;
void setup()
{
//Init modulo Ethernet
Ethernet.begin(mac, ip);
//Init oggetto EthernetUdp
Udp.begin(localPort);
//inizializzo la seriale per inviare
//informazioni di debug al Serial Monitor
Serial.begin(19200);
}
La classe Ethernet viene inizializzata con il metodo begin() passandogli come parametri il mac address e l’indirizzo ip che vogliamo assegnare alla scheda.
Il metodo begin() dell’oggetto Udp accetta come parametro il numero della porta dove saranno trasmessi e ricevuti i dati.
Nel blocco loop() scriviamo il codice che ci permette di ricevere i dati che vengono inviati alla scheda. Utilizzando il metodo parsePacket() dell’oggetto Udp verifichiamo se nel buffer di ricezione della scheda sono disponibili dei dati da leggere.
parsePacket() restituisce il numero di byte presenti nel buffer di ricezione. Usando una istruzione if possiamo gestire la lettura dei dati presenti nel buffer:
void loop()
{
//Controlla se sono presenti dati da leggere
int NumDataRx = Udp.parsePacket();
if (NumDataRX > 0)
{
//leggi i dati
}
}
All’interno del blocco if effettuiamo la lettura dei dati presenti nel buffer di ricezione con il metodo read()
void loop()
{
//Controlla se sono presenti dati da leggere
int NumDataRx = Udp.parsePacket();
if (NumDataRX > 0)
{
//Invio al serial monitor il numero di byte presenti nel buffer
Serial.print("Numero di byte da leggere: ");
Serial.println(NumDataRx);
//leggo i dati e li memorizzo in un array
Udp.read(DatiRX, NumDataRx);
for (int i = 0; i < numByteRX; i++)
Serial.print(DatiRX[i], DEC);
}
}
Al metodo read() dobbiamo passare un array di char dove verranno memorizzati i dati letti dal buffer di ricezione. Il ciclo for invia i singoli byte al serial monitor, utile per verificare il contenuto dei dati.
Inviare dati
Per quanto riguarda l’invio di un pacchetto UDP vengono impiegate tre istruzioni, beginPacket(), che permette di specificare l’indirizzo ip e la porta a cui vogliamo spedire il pacchetto, write() che scrive i dati all’interno del pacchetto e endPacket() che chiude e spedisce il pacchetto dati UDP. Le istruzioni da utilizzare sono le seguenti
void loop()
{
//Controlla se sono presenti dati da leggere
int NumDataRx = Udp.parsePacket();
if (NumDataRX > 0)
{
//Invio al serial monitor il numero di byte presenti nel buffer
Serial.print("Numero di byte da leggere: ");
Serial.println(NumDataRx);
//leggo i dati e li memorizzo in un array
Udp.read(DatiRX, 20);
for (int i = 0; i < numByteRX; i++)
Serial.print(DatiRX[i], DEC);
//Una volta ricevuti i dati invio una stringa di
//conferma all'indirizzo e alla porta che hanno
//instaurato un collegamento con l'Arduino
//preparo il pacchetto con l'indirizzo e la porta
//che mi hanno inviato dati precedentemente
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
//scrivo nel pacchetto i dati da inviare
Udp.write("RX_OK");
//spedisco il pacchetto
Udp.endPacket();
}
}
Il metodo write() accetta sia una stringa di caratteri sia un array di char.
Impiego questo protocollo quando non ho bisogno di avere una connessione stabile con la scheda Arduino (come accade utilizzando il protocollo TCP/IP) ma quando ho bisogno di un metodo semplice, e veloce che mi permette di scambiare dati tra il computer e la scheda o far comunicare due schede tra loro.
Come avete visto per usare il protocollo Udp con Arduino sono sufficienti solo alcune righe di codice quasi quanto utilizzare le istruzioni per l’uso della seriale!
Related posts
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
