Il protocollo LoRa, come vedremo nei prossimi tutorial, è lo standard fisico di trasmissione che caratterizza il protocollo IoT LoRaWan, tuttavia, può anche essere utilizzato per realizzare facilmente una comunicazione punto-punto (detta anche Pear to Pear P2P) tra due dispositivi.
In questo tutorial introdurremo la scheda Arduino MKR WAN 1310, la board della famiglia MKR dotata di connettività LoRa e ti faremo vedere come realizzare una comunicazione P2P che utilizzi la trasmissione radio LoRa.
Solitamente questa scheda viene venduta in bundle con una antenna a dipolo, indispensabile per un uso sul campo della scheda.

Lo sketch utilizzato per il ruolo di “Alice” è riportato nel riquadro che segue.
#include <SPI.h>
#include <LoRa.h>
// parametrizzo l'indirizzo locale e quello di destinazione
String mioNome = "Alice";
byte mioIndirizzo = 0xAA;
byte indirizzoDestinatario = 0xBB;
void setup() {
// inizializzo la comunicazione seriale
// attend'apert del tenale seriale
// e stampo il messaggio di benvenuto
Serial.begin(9600);
while(!Serial);
Serial.println("Benvenuto nel Servizio di Chat via LoRa!");
// inizializzo il modem LoRa
// se viene restituito un errore fermo il programma
if (!LoRa.begin(868E6)) {
Serial.println("Errore nell'avvio del modem!");
while (true);
}
// pausa per lasciar stabilizzare il modem
delay(1000);
}
void loop() {
if (Serial.available()) {
String messaggio = Serial.readString();
if (messaggio.length() > 0) {
Serial.println(mioNome + ": " + messaggio); //visualizzato sul serial monitor
// Trasmissione pacchetto LoRa
LoRa.beginPacket();
LoRa.write(indirizzoDestinatario);
LoRa.write(mioIndirizzo);
LoRa.print(mioNome +": " + messaggio); //inviato sul canale LoRa
LoRa.endPacket();
}
}
// Verifico se è arrivato un messaggio per me
riceviMessaggio(LoRa.parsePacket());
}
void riceviMessaggio(int packetSize) {
if (packetSize == 0) return; // se non ci sono messaggi termina la funzione
// Leggo i primi due byte del pacchetto ricevuto
int destinatario = LoRa.read();
int mittente = LoRa.read();
// inizializzo a stringa vuota la stringa che conterrà il msg ricevuto
String msgRicevuto = "";
// leggo il contenuto del buffer di ricezione
// questa operazione deve essere sempre fatta
// per svuotare il buffer
while (LoRa.available()) {
msgRicevuto += (char)LoRa.read();
}
// Verifico se il pacchetto ricevuto è destinato a me
if ((destinatario != mioIndirizzo) || (mittente != indirizzoDestinatario)) {
// Serial.println("Questo messaggio non è per me.");
// il messaggio non è per me quindi termino la funzione
return;
}
// stampo sul terminale il messaggio ricevuto
Serial.print(msgRicevuto);
// stampo sul terminale il valore RSSI del pacchetto ricevuto
Serial.print(" || RSSI: ");
Serial.println(LoRa.packetRssi());
Serial.println();
}
Come ha visto nel video, questo sketch Arduino implementa un semplice sistema di chat utilizzando il protocollo di comunicazione LoRa.
Riportiamo per tua comodità la descrizione dettagliata delle sue funzionalità:
Serial.begin(9600), e il programma attende finché la connessione seriale non è pronta.e è zero, la funzione termina.Lo sketch che corrisponde al ruolo di “Bob” è identico al precedente, con l’unica differenza che le variabili mioNome, mioIndirizzo e indirizzoDestinatario sono ovviamente diverse.
Per tua comodità, di seguito è riportato anche questa versione dello sketch.
#include <SPI.h>
#include <LoRa.h>
// parametrizzo l'indirizzo locale e quello di destinazione
String mioNome = "Bob";
byte mioIndirizzo = 0xBB;
byte indirizzoDestinatario = 0xAA;
void setup() {
// inizializzo la comunicazione seriale
// attend'apert del tenale seriale
// e stampo il messaggio di benvenuto
Serial.begin(9600);
while(!Serial);
Serial.println("Benvenuto nel Servizio di Chat via LoRa!");
// inizializzo il modem LoRa
// se viene restituito un errore fermo il programma
if (!LoRa.begin(868E6)) {
Serial.println("Errore nell'avvio del modem!");
while (true);
}
// pausa per lasciar stabilizzare il modem
delay(1000);
}
void loop() {
if (Serial.available()) {
String messaggio = Serial.readString();
if (messaggio.length() > 0) {
Serial.println(mioNome + ": " + messaggio); //visualizzato sul serial monitor
// Trasmissione pacchetto LoRa
LoRa.beginPacket();
LoRa.write(indirizzoDestinatario);
LoRa.write(mioIndirizzo);
LoRa.print(mioNome +": " + messaggio); //inviato sul canale LoRa
LoRa.endPacket();
}
}
// Verifico se è arrivato un messaggio per me
riceviMessaggio(LoRa.parsePacket());
}
void riceviMessaggio(int packetSize) {
if (packetSize == 0) return; // se non ci sono messaggi termina la funzione
// Leggo i primi due byte del pacchetto ricevuto
int destinatario = LoRa.read();
int mittente = LoRa.read();
// inizializzo a stringa vuota la stringa che conterrà il msg ricevuto
String msgRicevuto = "";
// leggo il contenuto del buffer di ricezione
// questa operazione deve essere sempre fatta
// per svuotare il buffer
while (LoRa.available()) {
msgRicevuto += (char)LoRa.read();
}
// Verifico se il pacchetto ricevuto è destinato a me
if ((destinatario != mioIndirizzo) || (mittente != indirizzoDestinatario)) {
// Serial.println("Questo messaggio non è per me.");
// il messaggio non è per me quindi termino la funzione
return;
}
// stampo sul terminale il messaggio ricevuto
Serial.print(msgRicevuto);
// stampo sul terminale il valore RSSI del pacchetto ricevuto
Serial.print(" || RSSI: ");
Serial.println(LoRa.packetRssi());
Serial.println();
}