Para todos que fazem projetos com o arduino usando a EthernetShield, provavelmente já tiveram a necessidade de usar os recursos de DHCP e DNS. Finalmente consegui encontrar para meus projetos uma library confiável, e que realmente funciona para atender isso.
Para quem não sabe, DHCP é um protocolo de rede que permite aos computadores (ou dispositivos) conectados a uma rede, receber suas configurações de rede automaticamente a partir de um servidor central, sem que você precise configurá-los manualmente. Já o DNS é um sistema de gerenciamento de nomes x IPs. Ele é o responsável por traduzir uma URL qualquer, em um endereço IP. Esse endereço IP é essencial para acessarmos qualquer coisa na internet.
Encontrei essas libraries no seguinte endereço: http://gkaindl.com/software/arduino-ethernet. Depois de ter baixado e testado, comprovadamente funcionam. Ligando o arduino no meu Access Point, ele recebeu um ip da minha rede sem nenhum problema, além de configurações de máscara de rede, gateway e até servidor DNS. Logo após, fiz um teste de requisição para a página do google, porém, ao invés de passar o IP, simplesmente passei “www.google.com”, e a library funcionou como esperado: traduziu o nome em IP, e fez a requisição ao site… Parabéns ao desenvolvedor George Kaindl.
Segue o exemplo testado e aprovado…
#if defined(ARDUINO) && ARDUINO > 18
#include <SPI.h>
#endif
#include <Ethernet.h>
#include <EthernetDHCP.h>
#include <EthernetDNS.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.google.com";
const byte* ipAddr;
const byte* gatewayAddr;
const byte* dnsAddr;
void requisita() {
byte serverIpAddr[4];
DNSError err = EthernetDNS.resolveHostName(server, serverIpAddr);
if (DNSSuccess == err) {
Serial.print("IP: ");
Serial.println(ip_to_str(serverIpAddr));
Client client(serverIpAddr, 80);
Serial.println("Conectando...");
if (client.connect()) {
Serial.println("Conectou...");
client.println("GET / HTTP/1.1");
client.println();
} else {
Serial.println("Conexão falhou...");
}
delay(100);
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);
}
}
Serial.println("Desconectando...");
client.stop(); //desconectando...
} else if (DNSTimedOut == err) {
Serial.println("Timeout...");
} else if (DNSNotFound == err) {
Serial.println("Host não existe.");
} else {
Serial.print("Código do erro: ");
Serial.print((int)err, DEC);
Serial.println(".");
}
}
void setup()
{
Serial.begin(9600);
Serial.println("Obtendo ip...");
EthernetDHCP.begin(mac);
ipAddr = EthernetDHCP.ipAddress();
Serial.print("IP obtido: ");
Serial.println(ip_to_str(ipAddr));
gatewayAddr = EthernetDHCP.gatewayIpAddress();
Serial.print("Gateway: ");
Serial.println(ip_to_str(gatewayAddr));
dnsAddr = EthernetDHCP.dnsIpAddress();
Serial.print("DNS: ");
Serial.println(ip_to_str(dnsAddr));
EthernetDNS.setDNSServer(dnsAddr);
}
void loop()
{
EthernetDHCP.maintain();
requisita();
delay(5000);
}
const char* ip_to_str(const uint8_t* ipAddr)
{
static char buf[16];
sprintf(buf, "%d.%d.%d.%d\0", ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]);
return buf;
}
Segue link para download das Libraries DHCP e DNS: DOWNLOAD
E o bom, é que essas libs já fazem parte do Arduino 1.0.
Abraço.
Pessoal,
Acesse o site da EMPRETECNET, eles fabricam um KIT com uma placa compatível com arduino duemilanove, uma placa de rele, de potenciômetro, de sensor de luz, de sensor de luminosidade, de buzzer, de botão e demais componentes que podem ser realizados vários experimentos sem a necessidade de solda. Qualidade excelente!!
Quando faço o upload ocorre erro em “DNSError err = EthernetDNS.resolveHostName(server, serverIpAddr)”, sera que tenho problemas na EthernetDHCP.h?