Para implementar o "Keep alive", deve alterar a biblioteca do W5100, que normalmente fica na pasta:
"C:\Program Files (x86)\Arduino\libraries\Ethernet\src"
No arquivo "EthernetServer.h" adicione na classe EthernetServer o protótipo do método:
static void keepAlive(uint32_t interval = 5000);
E no arquivo "EthernetServer.cpp", adicione a definição:
void EthernetServer::keepAlive(uint32_t interval){
static uint32_t lastKeepAlive = 0;
if (millis() - lastKeepAlive > interval) {
lastKeepAlive = millis();
for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
EthernetClient client(sock);
if (client.status() == SnSR::ESTABLISHED) {
W5100.execCmdSn(sock, Sock_SEND_KEEP);
}
}
}
}
No arquivo "Ethernet.cpp", dentro no método:
int EthernetClass::begin(uint8_t *mac_address, unsigned long timeout, unsigned long responseTimeout)
acrescente:
// Configurate timeout = 3,22 seconds
W5100.setRetransmissionTime(512); //miliseconds * 10
W5100.setRetransmissionCount(5);
Os três arquivos alterados estão em anexo para facilitar.
No seu código, normalmente no loop(), adicione antes de:
EthernetClient client = server.available();
A chamada do método:
server.keepAlive();
Em meus testes, o W5100 fecha as conexões travadas em dois momentos: quando falha ao enviar algum dado e usando o keep alive.
O problema do keep alive é que se você transmitir algo para os clientes logo após o invocar, o keep alive é "anulado", então são necessário testes.
Ethernet.cpp (3.93 KB)
EthernetServer.cpp (2.17 KB)
EthernetServer.h (443 Bytes)