Ciao,
dopo aver impazzito un po' a livello hardware per inizializzare la shield ethernet, ora devo impazzire ancora un po' per avere una connessione...
Da seriale sembra che la LAN si connette, ma non ho una risposta dal server google, ho utilizzato l'esempio della libreria già inserita nel core di ESP32, nella quale ho aggiunto le impostazioni dell'IP statico, ma non ho comunque risposta.
Dal mio router non vedo questo collegamento, quà sotto lo sketch per capire se sto sbagliando qualcosa
// IMPORTANTE!! da definire prima di <ETH.h>
// affinchè ETH.begin() funzioni
#ifndef ETH_PHY_MDC
#define ETH_PHY_TYPE ETH_PHY_LAN8720
#if CONFIG_IDF_TARGET_ESP32
#define ETH_PHY_ADDR 0
#define ETH_PHY_MDC 23
#define ETH_PHY_MDIO 18
#define ETH_PHY_POWER -1
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
#elif CONFIG_IDF_TARGET_ESP32P4
#define ETH_PHY_ADDR 0
#define ETH_PHY_MDC 31
#define ETH_PHY_MDIO 52
#define ETH_PHY_POWER 51
#define ETH_CLK_MODE EMAC_CLK_EXT_IN
#endif
#endif
#include <ETH.h>
IPAddress IP(192, 168, 1, 7);
IPAddress GW(192, 168, 1, 1);
IPAddress DNS(8, 8, 8, 8);
IPAddress MASK(255, 255, 255, 0);
static bool eth_connected = false;
// WARNING: onEvent is called from a separate FreeRTOS task (thread)!
void onEvent(arduino_event_id_t event)
{
switch (event)
{
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
/*
Il nome host deve essere impostato dopo l'avvio dell'interfaccia, ma deve essere
impostato prima di DHCP, quindi impostarlo dal thread del gestore eventi
*/
ETH.setHostname("esp32-ethernet");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("ETH Connesso");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.print("ETH MAC: ");
Serial.print(ETH.macAddress());
Serial.print(", IPv4: ");
Serial.print(ETH.localIP());
if (ETH.fullDuplex())
{
Serial.print(", FULL_DUPLEX");
}
Serial.print(", ");
Serial.print(ETH.linkSpeed());
Serial.println("Mbps");
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_LOST_IP:
Serial.println("ETH IP perso");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnesso");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH fermato");
eth_connected = false;
break;
default: break;
}
}
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.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
while (client.connected() && !client.available());
while (client.available()) {
Serial.write(client.read());
}
Serial.println("closing connection\n");
client.stop();
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("Test LAN8720");
Serial.println();
delay(100);
Network.onEvent(onEvent);
delay(100);
ETH.begin();
delay(100);
ETH.config(IP, GW, MASK, DNS);
delay(100);
}
void loop()
{
if (eth_connected)
{
testClient("google.com", 80);
}
delay(10000);
}
L'esempio probabilmente è un po' datato perché non credo che Google consenta un accesso HTTP sulla porta 80.
Probabilmente ottieni un redirect su HTTPS (porta 443) che poi non viene gestito.
Prova ad usare un NetworkClientSecure, aggiungendo il giusto #include ed impostando la modalità "insecure" cosi da evitare di dover passare anche il certificato SSL per l'host di Google.