EByte LoRa E32 gateway: gestione REST e WebSocket (esp8266, esp32) – 1

Spread the love

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.

EByte LoRa E32 Manager REST WebSocket to configure and test esp8266 esp32
EByte LoRa E32 Manager REST WebSocket to configure and test esp8266 esp32

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

WeMos D1 mini esp8266 pinout mischianti low resolution
WeMos D1 mini esp8266 pinout mischianti low resolution

Devi connettere esp8266 con questa configurazione

E32WeMos D1 mini (esp8266)
M0D7
M1D6
TXD3
RXD4
AUXD5
VCC3.3v or 5v (meglio)
GNDGND
LoRa E32-TTL-100 and Wemos D1 mini fully connected
LoRa E32-TTL-100 and Wemos D1 mini fully connected

Cablaggio ESP32

ESP32 DOIT DEV KIT v1 pinout
ESP32 DOIT DEV KIT v1 pinout

Per l’ESP32 uso questa configurazione

E32ESP32
M019
M121
RXTX2
TXRX2
AUX15
VCC3.3v or 5v (better)
GNDGND
EByte LoRa E32 E22 ESP32 DEV KIT V1 Fully connected breadboard
EByte LoRa E32 E22 ESP32 DEV KIT V1 Fully connected breadboard

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:

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 alla libreria

Link al progetto GitHub del front end

Link all’implementazione delle API REST

  1. EByte LoRa E32 gateway: gestione REST e WebSocket
  2. EByte LoRa E32 Web Manager: descrizione, configurazione e demo

Spread the love

4 Risposte

  1. Nino ha detto:

    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

    • Renzo Mischianti ha detto:

      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

      • Nino ha detto:

        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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *