Integrazione del modulo LAN8720 su ESP32 con Core 3: supporto nativo del protocollo Ethernet con SSL e altre funzionalità
Con l’introduzione del Core 3, l’ESP32 supporta i protocolli Ethernet nativi, offrendo le stesse funzionalità disponibili per il Wi-Fi, incluso SSL, anche per le connessioni cablate. Questo articolo esplora l’integrazione del modulo Ethernet LAN8720 con l’ESP32 utilizzando il Core 3, seguendo una struttura simile alle nostre guide precedenti su W5500 e LAN8720 con Core 2. Tratteremo la configurazione, l’impostazione e le applicazioni pratiche.
Introduzione
La capacità dell’ESP32 di gestire sia connessioni Wi-Fi che Ethernet lo rende una scelta versatile per le applicazioni IoT. Con il Core 3, l’ESP32 può ora supportare nativamente i protocolli Ethernet, semplificando il processo di integrazione di moduli come il LAN8720 per connessioni cablate sicure ed efficienti.
Requisiti hardware
Per iniziare, avrai bisogno dei seguenti componenti:
- Scheda di sviluppo ESP32
Ecco la mia selezione di ESP32 ESP32 Dev Kit v1 - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 - WeMos Lolin32 mini - ESP32-CAM programmer - ESP32-CAM bundle - ESP32-WROOM-32 - ESP32-S
Ecco la mia selezione di ESP32-S3 ESP32 S3 Purlple AI-S3 - YD-ESP32-S3 - ESP32-S3-DevKitC-1 - ESP32-S3-DevKitC-1 - ESP32-S3 Board screen
- Modulo Ethernet LAN8720
- Cavetti jumper
- Breadboard (opzionale)
LAN8720 vs W5500
Il W5500 e il LAN8720 sono entrambi controller Ethernet, ma hanno ruoli differenti e caratteristiche distinte:
- W5500:
- Produttore: Wiznet
- Tipo: Controller Ethernet con stack TCP/IP completamente hardware.
- Caratteristiche principali:
- Stack di protocollo TCP/IP integrato che può gestire i protocolli TCP, UDP, IPv4, ICMP, ARP, IGMP e PPPoE.
- Supporta fino a 8 connessioni socket simultanee.
- SPI (Serial Peripheral Interface) per la comunicazione con i controller host.
- 32Kbytes di memoria interna per i buffer TX/RX.
- Adatto per applicazioni embedded grazie alla facilità di integrazione e al minimo carico sul processore host.
- Tipicamente utilizzato con microcontrollori come Arduino, STM32, ecc.
- LAN8720:
- Produttore: Microchip Technology (precedentemente SMSC)
- Tipo: Ricetrasmettitore a livello fisico (PHY).
- Caratteristiche principali:
- Opera a livello fisico del modello OSI.
- Supporta gli standard Ethernet 10BASE-T e 100BASE-TX.
- Utilizza l’interfaccia RMII (Reduced Media Independent Interface) per comunicare con i controller host.
- Consumo energetico ridotto.
- Generalmente utilizzato in applicazioni che richiedono un controller MAC (Media Access Control) separato, spesso presente in sistemi più complessi come quelli con processori ARM.
Ecco una selezione dei dispositivi Ethernet più diffusi w5500 lite - w5500 - enc26j60 mini - enc26j60 - lan8720
Principali differenze:
I moduli W5500 e LAN8720 utilizzano interfacce diverse per la comunicazione, offrendo vantaggi distinti e casi d’uso specifici.
- W5500: Il W5500 è un controller Ethernet TCP/IP con stack fisso che utilizza l’interfaccia SPI (Serial Peripheral Interface) per comunicare con l’ESP32. È noto per la sua semplicità e facilità d’uso, rendendolo ideale per applicazioni che richiedono una connettività Ethernet semplice e affidabile. Il modulo W5500 scarica lo stack TCP/IP dall’ESP32, liberando potenza di elaborazione per altri compiti.
- LAN8720: Il LAN8720, invece, utilizza l’interfaccia RMII (Reduced Media Independent Interface) per connettersi all’ESP32. Questa interfaccia è più complessa rispetto alla SPI ma offre una soluzione Ethernet più diretta e integrata. Il LAN8720 è adatto per applicazioni che richiedono prestazioni superiori e bassa latenza, poiché lavora a stretto contatto con il MAC Ethernet integrato nell’ESP32.
Entrambi i moduli sono ora supportati nativamente dall’ESP32 Core 3, consentendo la connettività Ethernet con funzionalità come SSL/TLS per la comunicazione sicura. Tuttavia, l’interfaccia RMII era già supportata anche nel Core 2, quindi non troverai molte differenze rispetto all’articolo precedente sul LAN8720, ma presta attenzione.
Attenzione: L’ESP32-S3 non supporta più l’interfaccia RMII.
Cablaggio
Di default, il dispositivo CHIP ha questo cablaggio.
Assegnazioni comuni dei pin dalla documentazione ufficiale
Utilizzando il MAC interno dell’ESP32
- Il cablaggio PHY RMII è fisso e non può essere cambiato tramite IOMUX o GPIO Matrix. Di default, sono collegati come segue:
GPIO | Segnale RMII | Note |
---|---|---|
GPIO21 | TX_EN | EMAC_TX_EN |
GPIO19 | TX0 | EMAC_TXD0 |
GPIO22 | TX1 | EMAC_TXD1 |
GPIO25 | RX0 | EMAC_RXD0 |
GPIO26 | RX1 | EMAC_RXD1 |
GPIO27 | CRS_DV | EMAC_RX_DRV |
- Uno dei seguenti pin GPIO può essere utilizzato come input/output del RMII REF_CLK:
GPIO | Funzione | Note |
---|---|---|
GPIO0 | EMAC_TX_CLK/CLK_OUT1 | input/output |
GPIO16 | EMAC_CLK_OUT | output |
GPIO17 | EMAC_CLK_180 | output |
- Il cablaggio SMI (Serial Management Interface) non è fisso. Potrebbe essere necessario cambiarlo in base allo schema della tua scheda. Di default, sono collegati come segue:
GPIO | Segnale SMI | Note |
---|---|---|
GPIO23 | MDC | Output al PHY |
GPIO18 | MDIO | Bidirezionale |
Cablaggio della scheda di prototipazione
Ecco il cablaggio con un ESP32 con 38 pin.
Nella nostra scheda prototipo, iniziamo il cablaggio con questa configurazione (quella standard).
ESP32 | LAN8720 |
---|---|
3V3 | Vcc |
GND | GND |
GPIO18 | MDIO |
GPIO19 | TXD0 |
GPIO21 | TXEN |
GPIO22 | TXD1 |
GPIO23 | MDC |
GPIO25 | RXD0 |
GPIO26 | RXD1 |
GPIO27 | CRS_DV |
GPIO0 | nINT/RETCLM |
Ma con questa versione e la scheda LAN8720 cinese potresti avere un problema, potresti ricevere un messaggio del genere in modo casuale.
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
ets Jul 29 2019 12:21:46
rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download
ets Jul 29 2019 12:21:46
rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download
A volte funziona, altre volte no. Questo accade perché colleghi il GPIO0 all’oscillatore del cristallo. Quando l’oscillatore è ALTO, il GPIO0 mette il tuo ESP32 in modalità boot; se sei fortunato e l’oscillatore è BASSO, l’avvio avviene normalmente.
Per risolvere questo problema, devi saldare un filo dal pin di abilitazione dell’oscillatore al pin NC (Not Connected) e cablare in questo modo.
ESP32 | LAN8720 modificato |
---|---|
3V3 | Vcc |
GND | GND |
GPIO18 | MDIO |
GPIO19 | TXD0 |
GPIO21 | TXEN |
GPIO22 | TXD1 |
GPIO23 | MDC |
GPIO25 | RXD0 |
GPIO26 | RXD1 |
GPIO27 | CRS_DV |
GPIO0 | nINT/RETCLM |
GPIO17 | NC |
// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_PHY_ADDR 1 // DEFAULT VALUE IS 0 YOU CAN OMIT IT
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_PHY_TYPE ETH_PHY_LAN8720 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_PHY_POWER 17 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_PHY_MDC 23 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_PHY_MDIO 18 // DEFAULT VALUE YOU CAN OMIT IT
// External clock from crystal oscillator
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN // DEFAULT VALUE YOU CAN OMIT IT
// Fixed value for RMI
//#define ETH_RMII_TX_EN 21
//#define ETH_RMII_TX0 19
//#define ETH_RMII_TX1 22
//#define ETH_RMII_RX0 25
//#define ETH_RMII_RX1_EN 26
//#define ETH_RMII_CRS_DV 27
Qui c’è la modifica sul mio dispositivo.
Configurazione delle impostazioni Ethernet
Configura le impostazioni Ethernet nel tuo sketch.
ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
Oppure puoi mettere il define
prima dell’inclusione di ETH.h
.
Utilizza la funzione onEvent
di Network
per sapere quando siamo pronti a fare una richiesta.
Network.onEvent(onEvent);
Devi creare una funzione per gestire l’evento di connessione o per monitorare tutti gli stati della rete.
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
switch (event) {
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
//set eth hostname here
ETH.setHostname("esp32-eth0");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
Serial.println(ETH);
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_LOST_IP:
Serial.println("ETH Lost IP");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
Dopo la connessione, saremo pronti per eseguire le operazioni.
Richiesta HTTP semplice
Per prima cosa, proveremo a fare una semplice richiesta HTTP. Ho scelto un servizio online creato per testare questo tipo di richiesta.
Utilizzerò un servizio semplice fornito da httpbin.org, e puoi usare le stesse API REST in HTTP e HTTPS.
Ricorda che HTTP funziona sulla porta 80 e HTTPS sulla 443, quindi per interrogare l’endpoint sulla porta 443, devi validare un certificato.
Successivamente, proviamo a connetterci e richiedere un endpoint in GET.
// Test client connection
void testClient(const char * host, uint16_t port)
{
Serial.print("\nconnecting to ");
Serial.println(host);
NetworkClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
return;
}
client.println("GET /get HTTP/1.1");
client.println("Host: httpbin.org");
client.println("Connection: close");
client.println();
while (client.connected() && !client.available());
while (client.available()) {
Serial.write(client.read());
}
Serial.println("closing connection\n");
client.stop();
}
Ricorda di fare la richiesta dopo che il modulo ha completato la stretta di mano.
void loop()
{
if (eth_connected) {
testClient("httpbin.org", 80);
}
delay(10000);
}
E infine, lo sketch completo.
/*
This sketch shows how to use lan8720 with esp32 core 3 with minimal/standard configuration
by Renzo Mischianti <mischianti.org>
*/
#include <ETH.h>
// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_PHY_ADDR 1 // DEFAULT VALUE IS 0 YOU CAN OMIT IT
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_PHY_TYPE ETH_PHY_LAN8720 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_PHY_POWER 17 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_PHY_MDC 23 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_PHY_MDIO 18 // DEFAULT VALUE YOU CAN OMIT IT
// External clock from crystal oscillator
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN // DEFAULT VALUE YOU CAN OMIT IT
// Fixed value for RMI
//#define ETH_RMII_TX_EN 21
//#define ETH_RMII_TX0 19
//#define ETH_RMII_TX1 22
//#define ETH_RMII_RX0 25
//#define ETH_RMII_RX1_EN 26
//#define ETH_RMII_CRS_DV 27
static bool eth_connected = false;
// Ethernet event handler
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
switch (event) {
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
// Set Ethernet hostname here
ETH.setHostname("esp32-eth0");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
Serial.println(ETH);
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_LOST_IP:
Serial.println("ETH Lost IP");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
// Test client connection
void testClient(const char * host, uint16_t port)
{
Serial.print("\nconnecting to ");
Serial.println(host);
NetworkClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
return;
}
client.println("GET /get HTTP/1.1");
client.println("Host: httpbin.org");
client.println("Connection: close");
client.println();
while (client.connected() && !client.available());
while (client.available()) {
Serial.write(client.read());
}
Serial.println("closing connection\n");
client.stop();
}
void setup()
{
Serial.begin(115200);
Network.onEvent(onEvent);
// ETH.begin();
ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
}
void loop()
{
if (eth_connected) {
testClient("httpbin.org", 80);
}
delay(10000);
}
Il risultato è questo.
ETH Started
ETH Connected
ETH Got IP: 'eth0'
*eth0: <UP,100M,FULL_DUPLEX,AUTO,ADDR:0x1> (DHCPC,GARP,IP_MOD)
ether B8:D6:1A:68:E5:7F
inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
gateway 192.168.1.1 dns 192.168.1.10
connecting to httpbin.org
HTTP/1.1 200 OK
Date: Mon, 22 Jul 2024 13:15:13 GMT
Content-Type: application/json
Content-Length: 199
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-669e5b60-3756730c76c74b21622ca9c0"
},
"origin": "84.221.199.122",
"url": "http://httpbin.org/get"
}
closing connection
Richiesta HTTPS
Ora, se cambiamo l’endpoint alla porta 443, richiederemo un server sicuro con crittografia SSL.
// Test client connection
void testClient(const char * host, uint16_t port)
{
Serial.print("\nconnecting to ");
Serial.println(host);
NetworkClientSecure client;
client.setInsecure();
if (!client.connect(host, port)) {
Serial.println("connection failed");
return;
}
client.println("GET /get HTTP/1.1");
client.println("Host: httpbin.org");
client.println("Connection: close");
client.println();
while (client.connected() && !client.available());
while (client.available()) {
Serial.write(client.read());
}
Serial.println("closing connection\n");
client.stop();
}
Se non imposti la modalità insicura, non puoi connetterti e riceverai un messaggio del genere.
ETH Started
ETH Connected
ETH Got IP: 'eth0'
*eth0: <UP,100M,FULL_DUPLEX,AUTO,ADDR:0x1> (DHCPC,GARP,IP_MOD)
ether B8:D6:1A:68:E5:7F
inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
gateway 192.168.1.1 dns 192.168.1.10
connecting to httpbin.org
connection failed
E utilizza la porta 443.
void loop()
{
if (eth_connected) {
testClient("httpbin.org", 443);
}
delay(10000);
}
Qui lo sketch completo.
/*
This sketch shows how to use lan8720 with esp32 core 3 with minimal/standard configuration
In this example we are going to use https with insecure setting.
by Renzo Mischianti <mischianti.org>
*/
#include <ETH.h>
#include <NetworkClientSecure.h>
// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_PHY_ADDR 1 // DEFAULT VALUE IS 0 YOU CAN OMIT IT
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_PHY_TYPE ETH_PHY_LAN8720 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_PHY_POWER 17 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_PHY_MDC 23 // DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_PHY_MDIO 18 // DEFAULT VALUE YOU CAN OMIT IT
// External clock from crystal oscillator
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN // DEFAULT VALUE YOU CAN OMIT IT
// Fixed value for RMI
//#define ETH_RMII_TX_EN 21
//#define ETH_RMII_TX0 19
//#define ETH_RMII_TX1 22
//#define ETH_RMII_RX0 25
//#define ETH_RMII_RX1_EN 26
//#define ETH_RMII_CRS_DV 27
static bool eth_connected = false;
// Ethernet event handler
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
switch (event) {
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
// Set Ethernet hostname here
ETH.setHostname("esp32-eth0");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
Serial.println(ETH);
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_LOST_IP:
Serial.println("ETH Lost IP");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
// Test client connection
void testClient(const char * host, uint16_t port)
{
Serial.print("\nconnecting to ");
Serial.println(host);
NetworkClientSecure client;
client.setInsecure();
if (!client.connect(host, port)) {
Serial.println("connection failed");
return;
}
client.println("GET /get HTTP/1.1");
client.println("Host: httpbin.org");
client.println("Connection: close");
client.println();
while (client.connected() && !client.available());
while (client.available()) {
Serial.write(client.read());
}
Serial.println("closing connection\n");
client.stop();
}
void setup()
{
Serial.begin(115200);
Network.onEvent(onEvent);
// ETH.begin();
ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
}
void loop()
{
if (eth_connected) {
testClient("httpbin.org", 443);
}
delay(10000);
}
Ora, quando eseguiamo lo sketch, otteniamo questo output.
ETH Started
ETH Connected
ETH Got IP: 'eth0'
*eth0: <UP,100M,FULL_DUPLEX,AUTO,ADDR:0x1> (DHCPC,GARP,IP_MOD)
ether B8:D6:1A:68:E5:7F
inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
gateway 192.168.1.1 dns 192.168.1.10
connecting to httpbin.org
HTTP/1.1 200 OK
Date: Mon, 22 Jul 2024 13:22:07 GMT
Content-Type: application/json
Content-Length: 200
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-669e5cff-79adceda5a489dfc30f72b4c"
},
"origin": "84.221.199.122",
"url": "https://httpbin.org/get"
}
ÿclosing connection
Recupero del certificato
Come puoi vedere, per il test, ho utilizzato la modalità insicura
NetworkClientSecure client;
client.setInsecure();
Ma la cosa giusta da fare è recuperare il certificato dell’Autorità di Certificazione per validare l’host.
Quindi, nella pagina di httpbin, clicca sulle impostazioni del sito.
Successivamente, devi selezionare le informazioni sulla connessione.
Ora clicca sul certificato.
E infine, seleziona la riga in cima alla lista (il certificato root).
Esporta il certificato, apri il file, copia il contenuto e inseriscilo tutto in una variabile di tipo array di caratteri.
const char* rootCA= R""""(-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----)"""";
Ora possiamo impostare il certificato dell’Autorità di Certificazione. Per effettuare il controllo, dobbiamo validare il server httpbin nel NetworkClientSecure.
NetworkClientSecure client;
client.setCACert(rootCA);
Conclusione
Integrare il modulo Ethernet W5500 con l’ESP32 utilizzando il Core 3 espande le capacità dei tuoi progetti IoT fornendo una connettività di rete cablata robusta e sicura. Con il supporto nativo per i protocolli Ethernet, SSL/TLS, e altre funzionalità, puoi sfruttare appieno il potenziale dell’ESP32 per diverse applicazioni.
- ESP32: piedinatura, specifiche e configurazione dell’Arduino IDE
- ESP32: fileSystem integrato SPIFFS
- ESP32: gestire più seriali e logging per il debug
- ESP32 risparmio energetico pratico
- ESP32 risparmio energetico pratico: gestire WiFi e CPU
- ESP32 risparmio energetico pratico: modem e light sleep
- ESP32 risparmio energetico pratico: deep sleep e ibernazione
- ESP32 risparmio energetico pratico: preservare dati al riavvio, sveglia a tempo e tramite tocco
- ESP32 risparmio energetico pratico: sveglia esterna e da ULP
- ESP32 risparmio energetico pratico: sveglia da UART e GPIO
- ESP32: filesystem integrato LittleFS
- ESP32: filesystem integrato FFat (Fat/exFAT)
- ESP32-wroom-32
- ESP32-CAM
- ESP32: ethernet w5500 con chiamate standard (HTTP) e SSL (HTTPS)
- ESP32: ethernet enc28j60 con chiamate standard (HTTP) e SSL (HTTPS)
- Come usare la scheda SD con l’esp32
- esp32 e esp8266: file system FAT su memoria SPI flash esterna
- Gestione aggiornamenti firmware e OTA
- Gestione del firmware
- Aggiornamento OTA con Arduino IDE
- Aggiornamento OTA con browser web
- Aggiornamenti automatici OTA da un server HTTP
- Aggiornamento del firmware non standard
- Integrare LAN8720 con ESP32 per la connettività Ethernet con plain (HTTP) e SSL (HTTPS)
- Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
- ESP32-C3: piedinatura, specifiche e configurazione dell’IDE Arduino
- Integrazione del modulo W5500 su ESP32 con Core 3: supporto nativo ai protocolli Ethernet con SSL e altre funzionalità
- Integrazione del modulo LAN8720 su ESP32 con Core 3: supporto nativo del protocollo Ethernet con SSL e altre funzionalità.