EByte LoRa E32 gateway: gestione REST e WebSocket (esp8266, esp32) – 1
Faccio molti progetti con gli EByte LoRa E32, tutti basati sulla mia libreria “Libreria EByte Lora E32“, e molte persone lo scaricano, ma gli strumenti di EByte sono molto poveri e talvolta difettosi.
Quindi proverò a creare un esempio che da web supporti tutte le funzionalità di configurazione e i widget per testare l’invio e la ricezione.
Ecco i dispositivi LoRa E32 AliExpress (433MHz 5Km) - AliExpress (433MHz 8Km) - AliExpress (433MHz 16Km) - AliExpress (868MHz 915MHz 5.5Km) - AliExpress (868MHz 915MHz 8Km)
Puoi dividere l’applicazione in 2 parti
Cablaggio esp8266
Devi connettere esp8266 con questa configurazione
E32 | WeMos D1 mini (esp8266) |
---|---|
M0 | D7 |
M1 | D6 |
TX | D3 |
RX | D4 |
AUX | D5 |
VCC | 3.3v or 5v (meglio) |
GND | GND |
Cablaggio ESP32
Per l’ESP32 uso questa configurazione
E32 | ESP32 |
---|---|
M0 | 19 |
M1 | 21 |
RX | TX2 |
TX | RX2 |
AUX | 15 |
VCC | 3.3v or 5v (better) |
GND | GND |
Back End (come un semplice gateway)
Ho scritto 2 back end, uno per esp8266 e uno per esp32, li trovate sugli esempi della mia libreria “Libreria EByte Lora E32”.
Puoi scegliere di lavorare con il dispositivo come Soft AP oppure puoi inserire il tuo WiFi SSID e la password e usarli come un normale server, per abilitare il Soft AP devi commentare questa riga
#define SERVER_MODE
Quindi se colleghi D0 con una resistenza di pull-up al pin RESET, resetto automaticamente il dispositivo quando necessario.
Caricamento degli sketch e interfaccia utente Web
Per caricare gli sketchs puoi fare riferimento ai tutorial che ho già scritto:
- esp8266:
- Gestisci l’ambiente e carica lo sketch “WeMos D1 mini (esp8266): piedinatura, caratteristiche e configurazione dell’Arduino IDE“
- Carica i dati su LittleFS “WeMos D1 mini (esp8266): FileSystem integrato LittleFS“
- esp32:
- Gestire l’ambiente e caricare lo sketch “Esp32: piedinatura, specifiche e configurazione dell’Arduino IDE“
- Carica i dati su SPIFFS “ESP32: fileSystem integrato SPIFFS“
Interfacciamento al back-end
Creo un template con Postman con la documentazione di Rest API, lo strumento offre un set completo di implementazioni con i linguaggi più comuni come .NET, Python, nodejs, PHP ecc.
API REST
Le API REST rispondono dalla porta 8080 senza il controllo CORS per informazioni fai riferimento a “Server REST con esp8266 e esp32“.
Ottieni la configurazione
GET 192.168.1.119:8080/configuration
var requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch("192.168.1.119:8080/configuration", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"configuration": {
"ADDH": 0,
"ADDL": 0,
"CHAN": 23,
"OPTION": {
"fec": 1,
"fixedTransmission": 0,
"ioDriveMode": 1,
"transmissionPower": 0,
"wirelessWakeupTime": 0
},
"SPED": {
"airDataRate": 2,
"uartBaudRate": 3,
"uartParity": 0
}
}
}
Imposta configurazione
POST 192.168.1.119:8080/configuration
{
"ADDH": 0,
"ADDL": 0,
"CHAN": 23,
"OPTION": {
"fec": 1,
"fixedTransmission": 0,
"ioDriveMode": 1,
"transmissionPower": 0,
"wirelessWakeupTime": 0
},
"SPED": {
"airDataRate": 2,
"uartBaudRate": 3,
"uartParity": 0
}
}
Esempio di richiesta
var raw = "{
\n \"ADDH\": 0,
\n \"ADDL\": 0,
\n \"CHAN\": 23,
\n \"OPTION\": {
\n \"fec\": 1,
\n \"fixedTransmission\": 0,
\n \"ioDriveMode\": 1,
\n \"transmissionPower\": 0,
\n \"wirelessWakeupTime\": 0
\n },
\n \"SPED\": {
\n \"airDataRate\": 2,
\n \"uartBaudRate\": 3,
\n \"uartParity\": 0
\n }
\n}";
var requestOptions = {
method: 'POST',
body: raw,
redirect: 'follow'
};
fetch("192.168.1.119:8080/configuration", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"configuration": {
"ADDH": 0,
"ADDL": 0,
"CHAN": 23,
"OPTION": {
"fec": 1,
"fixedTransmission": 0,
"ioDriveMode": 1,
"transmissionPower": 0,
"wirelessWakeupTime": 0
},
"SPED": {
"airDataRate": 2,
"uartBaudRate": 3,
"uartParity": 0
}
}
}
Ripristina microcontrollore
GET 192.168.1.119:8080/reset
Esempio di richiesta
var requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch("192.168.1.119:8080/reset", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Ripristina modulo E32
GET 192.168.1.119:8080/resetModule
Esempio di richiesta
var requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch("192.168.1.119:8080/resetModule", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"status": {
"code": "1",
"error": false,
"description": "Success"
}
}
Ottieni informazioni sul modulo
GET 192.168.1.119:8080/moduleInfo
Esempio di richiesta
var requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch("192.168.1.119:8080/moduleInfo", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"moduleInfo": {
"frequency": "32",
"version": "48",
"features": "14"
}
}
Invia un messaggio trasparente
POST 192.168.1.119:8080/transparentMessage
{
"message": "Messaggio prova"
}
Esempio di richiesta
var raw = "{
\n \"message\": \"Messaggio prova\"
\n}";
var requestOptions = {
method: 'POST',
body: raw,
redirect: 'follow'
};
fetch("192.168.1.119:8080/transparentMessage", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"status": {
"code": "1",
"error": false,
"description": "Success"
}
}
Invia messaggio fisso
POST 192.168.1.119:8080/fixedMessage
{
"CHAN": 23,
"ADDL": 2,
"ADDH": 0,
"message": "Messaggio prova"
}
Esempio di richiesta
var raw = "{
\n \"CHAN\": 23,
\n \"ADDL\": 2,
\n \"ADDH\": 0,
\n \"message\": \"Messaggio prova\"
\n}";
var requestOptions = {
method: 'POST',
body: raw,
redirect: 'follow'
};
fetch("192.168.1.119:8080/fixedMessage", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"status": {
"code": "1",
"error": false,
"description": "Success"
}
}
Invia messaggio broadcast
POST 192.168.1.119:8080/broadcastMessage
{
"CHAN": 23,
"message": "Messaggio prova"
}
Esempio di richiesta
var raw = "{
\n \"CHAN\": 23,
\n \"message\": \"Messaggio prova\"
\n}";
var requestOptions = {
method: 'POST',
body: raw,
redirect: 'follow'
};
fetch("192.168.1.119:8080/broadcastMessage", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Esempio di risposta
{
"status": {
"code": "1",
"error": false,
"description": "Success"
}
}
Web Socket
Il WebSocket risponde dalla porta 8081 con protocollo ws (ws://192.168.1.119:8081/
)
All’apertura della connessione ricevi il primo messaggio con le informazioni di base
{"type":"connection", "connection": true, "simpleMessage": true}
Quindi inizi a ricevere il messaggio con informazioni sulla potenza del segnale in tempo reale
{"type":"wifi_rt","value":"-38"}
per iniziare a ricevere messaggi devi inviare questo messaggio
{"startReceiveDevMsg":true,"singleMessage":true}
se è tutto ok ricevi
{"type": "device_msg", "receiving": true}
quindi puoi metterti in ascolto dei messaggi ricevuti dal dispositivo
{"type":"message","code":true,"description":"Success","message":"Messaggio di prova","error":false}
Puoi usare questo semplice client WebSocket
http://home.mischianti.org/WebSocketClient/MischiantiWebSocketClient.html
Grazie
Link al progetto GitHub del front end
Link all’implementazione delle API REST
- EByte LoRa E32 gateway: gestione REST e WebSocket
- EByte LoRa E32 Web Manager: descrizione, configurazione e demo
Leggo che scrivi che le E32 non sono affidabili e vedo che ci sono vari modelli di E32.
Quale modello consigli ?
Tra il T20D ed il T30D (868) cambia solo la potenza di trasmissione?
Tutte le E32 sono compatibili con la tua libreria?
Vedo che il rivenditore ufficiale di Ebyte è Alibaba. Sai se è un rivenditore affidabile?
Ps dovrei realizzare un sistema con circa 60 nodi in un magazzino che inviano sporadicamente una stringa ad un ESP32 che poi salva il dato su Firebase. Pensi possa andare bene l’E32 o credi sia più stabile usare direttamente il chip sx1276?
https://www.amazon.it/gp/product/B084NWDFH1/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1
Grazie
Ciao Nino,
no mi sono spiegato male, ho avuto problemi con il software di gestione (che aveva alcuni bug ora risolti), ma al tempo mi ha spinto a create questo software per cambiare al volo le impostazioni dei dispositivi.
Come stabilità è molto superiore al chip grezzo in quanto implementa nativamente il LoRa spread spectrum anti interference management (migliore del semplice FSK) e il FEC (Forward error correction). Oltre ad avere un semplice sistema di encrypting dei dati.
Visto che hai molti nodi potresti pensare di usare un E220 o anche un E22 solo per una questione di dimensione del buffer di ricezione.
La differenza tra il T20D ed il T30D sono i dBm, cioè la potenza del segnale e di conseguenza anche i consumi.
Il rivenditore linkato sul sito è quello ufficiale EByte.
Ciao RM
Confrontando le schede tecniche:
* E32-900T30D Buffer 512 Byte
* E220-900T30D Buffer 400 Byte
Dovrei prendere la E32 che ha un buffer più grande?
Secondo la tua esperienza, se ho una scheda esp32 e un E32, senza display o altri elementi, con 2 batterie AA da 2400 mAh inviando un paio di messaggi al giorno, a grandi linee le batterie saranno sufficiente per 3 mesi di vita o è meglio usare 4 batterie?
L’antenna che ti riporto di seguito potrebbe andare bene o credi sia meglio un’altro tipo? E’ questo il rivenditore che indicavi giusto?
https://s.click.aliexpress.com/e/_DB6UwY7
Grazie mille per la tua disponibilità ed i tuoi consigli
Per la dimensione del buffer devi valutare la dimensione dei pacchetti e la quantità, se il buffer è pieno (ancora non letto dal processore) rischi di perdere il pacchetto.
Per i consumi vanno fatti dei test specifici, ma ti dico che sono risibili se rimangono sempre in deep sleep.
Per le antenne devi valutare la distanza e gli ostacoli, sul forum in inglese avevamo fatto una breve analisi.
Ciao Renzo