помогите победить dns.getHostByName
- Войдите на сайт для отправки комментариев
Втр, 18/09/2012 - 01:19
Не могу ресолвить IP адрес с помощью dns.getHostByName. Что я делаю не так?
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Dhcp.h>
#include <dns.h>
#include <OneWire.h>
#include <avr/wdt.h>
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
byte ip[] = { 192,168,1,201 };
byte gateway[] = { 192,168,1,1 };
byte subnet[] = { 255, 255, 255, 0 };
unsigned int localPort = 7777;
unsigned int time;
unsigned int timetotemp=0;
unsigned int timetonexttemp=360; // 360
unsigned int timetoping=0;
unsigned int timetonextping=60; // 60
unsigned int connectattempts = 0;
char serverName[15] = "www.google.com";
char* kHostname = "www.google.com";
byte server[4]; // = { 64, 233, 187, 99 }; // Google
EthernetUDP Udp;
EthernetClient client;
byte remote_ip[] = {192, 168, 1, 156}; // Address of target machine
unsigned int remote_port = 6800;
OneWire ds(5);
int i=1;
char buf[60];
//
void setup() {
wdt_enable(WDTO_8S); // watchdog 8 sec
Serial.begin(9600);
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
pinMode(4, OUTPUT);
// start the Ethernet connection:
wdt_reset();
// Ethernet.begin(mac, ip, gateway, subnet); // ручная настройка
if (Ethernet.begin(mac) == 0) {Serial.println("Failed to configure Ethernet using DHCP"); for(;;) ;} // no point in carrying on, so do nothing forevermore,reboot with watchdog
Serial.println(Ethernet.localIP()); // print your local IP address:
Udp.begin(localPort);
//
//
DNSClient dns;
int ret = dns.getHostByName(kHostname, server);
//
//
//
}
1. Плата обычная, arduino uno + arduino ethernet W5100 , все стандартное.
Хочу от стандартной библиотеки Ethernet ресолвить IP, например google.com. И да, мне не надо присоединяться к этому ip, мне именно надо получить его IP, чтобы потом посылать туда upd пакеты. В описании сказано, что после вызова client.connect(server,port) автоматом ресолвится ip по имени, но как?
Что выдает компилятор:
lan_standart_board:49: error: no matching function for call to 'DNSClient::getHostByName(char*&, byte [4])'
E:\arduino\libraries\Ethernet/dns.h:30: note: candidates are: int DNSClient::getHostByName(const char*, IPAddress&)
Что, вообще никто не сталкивался с использованием динамического IP и необходимостью на этот динамичский IP отослать куда-нибудь? Не предполагал наличия телепатов, но людей, которые ковыряли стандартную Ethrenet либу найти надеялся.
2. вачдог работает отлично. Что впрочем никак не отражается на невозможности компиляции.
"Все стандартное" - понятие очень растяжимое. Вопросы связанные с Ethernet модулями на enc2j60 - сейчас не менее редки (если не более часты).
Не предполагал наличия телепатов, но людей, которые ковыряли стандартную Ethrenet либу найти надеялся.
Продалжаете предполагать. Даже люди которые "ковырялись" нем могут знать в чем же у вас трабла. Может железные проблемы, может настройки, может проблемы питания....
А оказывает - компилятор ругает (догадайтесь сами что говорит). Вы к доктору тоже приходите с "доктор что-то мне фигово, вы же людей лечили, неужели не знаете что со мной?"
Как можно было догадатся что у вас компиляция не проходит? Брать ваш скетч и компилировать? А вот с ошибкой - уже можно предположить "откуда ветер дует".
Компялятор, кстати, вам намекает что ему не нравится - типы параметров. И даже подсказывает какие типы были бы более правильными.
Пробовали перевести текст это ошибки?
Там сказанно что вторым параметром вы передали переменную типа byte [4], а он ожидает IPAddress
Объявите как он просит
IPAddress server; // = { 64, 233, 187, 99 }; // GoogleНе знаю как работать, а компилироватся - начнет.
Ну а с вачдогом - значит повезло вам. Я просто указал на него как источник возможных проблем.
Спасибо чуть подправил, работает. Оставлю это здесь:
DNS lookup:
char* kHostname = "google.com"; int ret = 0; IPAddress remote_addr; DNSClient dns; dns.begin(Ethernet.dnsServerIP()); ret = dns.getHostByName(kHostname, remote_addr); if (ret == 1) { Serial.println(""); Serial.print(kHostname); Serial.print(" resolved to "); Serial.print((int)remote_addr[0]); Serial.print("."); Serial.print((int)remote_addr[1]); Serial.print("."); Serial.print((int)remote_addr[2]); Serial.print("."); Serial.println((int)remote_addr[3]); } else { Serial.println("DNS lookup failed"); }А от ENC28J60 мне пришлось отказаться - не нашел библиотеки, подеерживающей отправки udp пакета в определенный адрес. И еще - по поводу ватчдога - где можно почитать? Всегда покупал оригинальные ардуины - проблем нет, но не факт что буду покупать их и впредь, может проблема в том, что неоригинал?