помогите победить dns.getHostByName

ver
Offline
Зарегистрирован: 13.03.2012

 Не могу ресолвить 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);
//
//
//
}

 

 

leshak
Offline
Зарегистрирован: 29.09.2011
  1. Предполгаете наличие телепатов на форуме (что за либы, что за чип, что значит "не могу")?
  2. Используете вачдог (может быть череповато, хотя если работает - повезло, но на многих платах, из-за бага в бутлоадере, результатом может стать бесконечный ребут платы).
ver
Offline
Зарегистрирован: 13.03.2012

leshak пишет:

  1. Предполгаете наличие телепатов на форуме (что за либы, что за чип, что значит "не могу")?
  2. Используете вачдог (может быть череповато, хотя если работает - повезло, но на многих платах, из-за бага в бутлоадере, результатом может стать бесконечный ребут платы).

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. вачдог работает отлично. Что впрочем никак не отражается на невозможности компиляции.

 

leshak
Offline
Зарегистрирован: 29.09.2011

 "Все стандартное" - понятие очень растяжимое. Вопросы связанные с Ethernet модулями на enc2j60 - сейчас не менее редки (если не более часты).

Цитата:

Не предполагал наличия телепатов, но людей, которые ковыряли стандартную Ethrenet либу найти надеялся.

Продалжаете предполагать. Даже люди которые "ковырялись" нем могут знать в чем же у вас трабла. Может железные проблемы, может настройки, может проблемы питания....

А оказывает - компилятор ругает (догадайтесь сами что говорит). Вы к доктору тоже приходите с "доктор что-то мне фигово, вы же людей лечили, неужели не знаете что со мной?"

Как можно было догадатся что у вас компиляция не проходит? Брать ваш скетч и компилировать? А вот с ошибкой - уже можно предположить "откуда ветер дует".

 

Компялятор, кстати, вам намекает что ему не нравится - типы параметров. И даже подсказывает какие типы были бы более правильными.

Пробовали перевести текст это ошибки?

Там сказанно что вторым параметром вы передали переменную типа  byte [4], а он ожидает IPAddress

Объявите как он просит

IPAddress server; // = { 64, 233, 187, 99 }; // Google

Не знаю как работать, а компилироватся - начнет.

Ну а с вачдогом - значит повезло вам. Я просто указал на него как источник возможных проблем.

 

ver
Offline
Зарегистрирован: 13.03.2012

Спасибо чуть подправил, работает. Оставлю это здесь:

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 пакета в определенный адрес. И еще - по поводу ватчдога - где можно почитать? Всегда покупал оригинальные ардуины - проблем нет, но не факт что буду покупать их и впредь, может проблема в том, что неоригинал?