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