Integrazione del modulo LAN8720 su ESP32 con Core 3: supporto nativo del protocollo Ethernet con SSL e altre funzionalità


Integrating lan8720 with ESP32 Using Core 3
Integrazione del LAN8720 con ESP32 utilizzando Core 3

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:

  1. 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.
  2. 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.

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:
GPIOSegnale RMIINote
GPIO21TX_ENEMAC_TX_EN
GPIO19TX0EMAC_TXD0
GPIO22TX1EMAC_TXD1
GPIO25RX0EMAC_RXD0
GPIO26RX1EMAC_RXD1
GPIO27CRS_DVEMAC_RX_DRV
  • Uno dei seguenti pin GPIO può essere utilizzato come input/output del RMII REF_CLK:
GPIOFunzioneNote
GPIO0EMAC_TX_CLK/CLK_OUT1input/output
GPIO16EMAC_CLK_OUToutput
GPIO17EMAC_CLK_180output
  • 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:
GPIOSegnale SMINote
GPIO23MDCOutput al PHY
GPIO18MDIOBidirezionale

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).

ESP32LAN8720
3V3Vcc
GNDGND
GPIO18MDIO
GPIO19TXD0
GPIO21TXEN
GPIO22TXD1
GPIO23MDC
GPIO25RXD0
GPIO26RXD1
GPIO27CRS_DV
GPIO0nINT/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.

ESP32LAN8720 modificato
3V3Vcc
GNDGND
GPIO18MDIO
GPIO19TXD0
GPIO21TXEN
GPIO22TXD1
GPIO23MDC
GPIO25RXD0
GPIO26RXD1
GPIO27CRS_DV
GPIO0nINT/RETCLM
GPIO17NC
// 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.

  1. ESP32: piedinatura, specifiche e configurazione dell’Arduino IDE
  2. ESP32: fileSystem integrato SPIFFS
  3. ESP32: gestire più seriali e logging per il debug
  4. ESP32 risparmio energetico pratico
    1. ESP32 risparmio energetico pratico: gestire WiFi e CPU
    2. ESP32 risparmio energetico pratico: modem e light sleep
    3. ESP32 risparmio energetico pratico: deep sleep e ibernazione
    4. ESP32 risparmio energetico pratico: preservare dati al riavvio, sveglia a tempo e tramite tocco
    5. ESP32 risparmio energetico pratico: sveglia esterna e da ULP
    6. ESP32 risparmio energetico pratico: sveglia da UART e GPIO
  5. ESP32: filesystem integrato LittleFS
  6. ESP32: filesystem integrato FFat (Fat/exFAT)
  7. ESP32-wroom-32
    1. ESP32-wroom-32: flash, piedinatura, specifiche e configurazione dell’Arduino IDE
  8. ESP32-CAM
    1. ESP32-CAM: piedinatura, specifiche e configurazione dell’Arduino IDE
    2. ESP32-CAM: upgrade CamerWebServer con gestione della luce flash
  9. ESP32: ethernet w5500 con chiamate standard (HTTP) e SSL (HTTPS)
  10. ESP32: ethernet enc28j60 con chiamate standard (HTTP) e SSL (HTTPS)
  11. Come usare la scheda SD con l’esp32
  12. esp32 e esp8266: file system FAT su memoria SPI flash esterna
  13. Gestione aggiornamenti firmware e OTA
    1. Gestione del firmware
      1. ESP32: flash del firmware binario compilato (.bin)
      2. ESP32: flash del firmware e filesystem (.bin) con strumenti grafici
    2. Aggiornamento OTA con Arduino IDE
      1. Aggiornamenti OTA su ESP32 con Arduino IDE: filesystem, firmware e password
    3. Aggiornamento OTA con browser web
      1. Aggiornamenti OTA su ESP32 tramite browser web: firmware, filesystem e autenticazione
      2. Aggiornamenti OTA su ESP32 tramite browser web: caricamento in HTTPS (SSL/TLS) con certificato autofirmato
      3. Aggiornamenti OTA su ESP32 tramite browser web: interfaccia web personalizzata
    4. Aggiornamenti automatici OTA da un server HTTP
      1. Aggiornamento automatico Firmware OTA dell’ESP32 dal server
      2. Aggiornamento automatico Firmware OTA dell’ESP32 dal server con controllo della versione
      3. Aggiornamento automatico Firmware OTA dell’ESP32 in HTTPS (SSL/TLS) con certificato autofirmato affidabile
    5. Aggiornamento del firmware non standard
      1. Aggiornamento firmware e filesystem ESP32 dalla scheda SD
      2. Aggiornamento firmware e filesystem ESP32 con client FTP
  14. Integrare LAN8720 con ESP32 per la connettività Ethernet con plain (HTTP) e SSL (HTTPS)
  15. Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
  16. ESP32-C3: piedinatura, specifiche e configurazione dell’IDE Arduino
  17. Integrazione del modulo W5500 su ESP32 con Core 3: supporto nativo ai protocolli Ethernet con SSL e altre funzionalità
  18. Integrazione del modulo LAN8720 su ESP32 con Core 3: supporto nativo del protocollo Ethernet con SSL e altre funzionalità.

Lascia un commento

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