WT32 ETH01 LAN8720 connessione senza risposta

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 :slight_smile:

// 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);
}

Questo quello che mi risulta in seriale:

Grazie

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.

#include <NetworkClientSecure.h>

.....
  NetworkClientSecure client;
  client.setInsecure();

Ho provato a fare così, ma non ho risposta comunque, la stringa per la modalità insecure l'ho inserita nel setup:

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);
  client.setInsecure();
}

e ho impostato la porta 443

void loop()
{
  if (eth_connected)
  {
    testClient("google.com", 443);
  }
  delay(10000);
}

Ma è normale che prima di rimanere su connesso ci sono diverse disconnessioni?

L'esempio in questione prevede un client dichiarato localmente nella funzione testClient(), lo hai spostato come istanza globale?

Si, se non ho capito male, mi sembra di aver fatto come istanza globale:

// 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>
#include <NetworkClientSecure.h>

NetworkClientSecure client;

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);
  client.setInsecure();
}

void loop()
{
  if (eth_connected)
  {
    testClient("google.com", 443);
  }
  delay(10000);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.