Estoy usando un Arduino Uno con Ethernet Shield.La conexión del cliente Arduino (Uno) Ethernet falla después de que muchas impresiones del cliente
Después de enviar muchas solicitudes HTTP, client.println (...), el cliente comienza a fallar al conectarse. El tiempo para el fallo parece ser aleatorio, y la lectura de secuencia del ciclo puede variar entre ~ 1000 y ~ 7000.
El error no tiene que ver con la Ethernet Transmit Buffer desbordante (siguientes this advice)
Este es el código que está fallando:
#include <Ethernet.h>
#include <SPI.h>
// Network constants
byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01};
byte ip[] = {/*REDACTED*/};
byte server[] = {/*REDACTED*/};
int port = /*REDACTED*/;
Client client(server, port);
// State
int sequence;
void setup(){
Ethernet.begin(mac, ip);
Serial.begin(9600);
sequence = 0;
delay(1000);
}
void loop(){
httpPut("/topic/:test/publish?sessionId=SESenanhygrp");
Serial.println(sequence++);
}
void httpPut(char* url){
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
client.print("PUT");
client.print(" ");
client.print(url);
client.println(" HTTP/1.0");
client.println();
while(!client.available()){
delay(1);
}
while(client.available()) {
char c = client.read();
Serial.print(c);
}
while(client.connected()){
Serial.println("Waiting for server to disconnect");
}
client.stop();
}
El error se produce en el segmento siguiente
if (!client.connect()) {
Serial.println("EXCEPTION: during HTTP PUT. Could not connect");
return;
}
En el momento en que el cliente no se conecta, hago dos cosas: (1) revisa los registros del servidor en busca de evidencia del servidor que recibe las solicitudes de conexión fallidas; (2) use 'netstat' en el servidor para establecer si las conexiones previas se han cerrado o están detenidas. – NPE
Además de lo anterior, 3) Verificaría si la pila se está desbordando. 4) ¿Hay una pérdida de memoria que ocurre después de miles de ciclos? – Jeff
Los registros del servidor no indicaron ningún problema. La memoria siempre es un problema al usar Arduinos, pero el código anterior debería ser bastante "seguro para la memoria" – ChrisSSocha