Ping доменного имени, как это сделать?

Coder
Coder аватар
Offline
Зарегистрирован: 04.03.2012

Добрый вечер.

 

Возникла необходимость пинговать сервер который не имеет статического IP. На роутере сервереа был настроен DynDNS и теперь у сервера есть доменное имя. Но не могу разобраться как теперь его пинговать через arduino. Есть библиотека ICMPPing предназначенаая для пингования IP адресов, но как мне средствами arduino преобразоваться домен в IP? Перешерстил интернет, но так и не нашел ответа. Может кто знает как это можно сделать? Заранее благодарен.

Coder
Coder аватар
Offline
Зарегистрирован: 04.03.2012

Вот пример кода с вышеуказанной библиотекой.

Ссылка на библиотеку

Как мне получить IP из доменного имени?

/*
  Ping Example
 
 This example sends an ICMP pings every 500 milliseconds, sends the human-readable
 result over the serial port. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 30 Sep 2010
 by Blake Foster
 
 */

#include <SPI.h>         
#include <Ethernet.h>
#include <ICMPPing.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {192,168,0,177}; // ip address for ethernet shield
IPAddress pingAddr(74,125,26,147); // ip address to ping

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

void setup() 
{
  // start Ethernet
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
}

void loop()
{
   
  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS)
  {
    sprintf(buffer,
            "Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
            echoReply.data.seq,
            echoReply.addr[0],
            echoReply.addr[1],
            echoReply.addr[2],
            echoReply.addr[3],
            REQ_DATASIZE,
            millis() - echoReply.data.time,
            echoReply.ttl);
  }
  else
  {
    sprintf(buffer, "Echo request failed; %d", echoReply.status);
  }
  Serial.println(buffer);
  delay(500);
}

 

 

TSheff
Offline
Зарегистрирован: 10.04.2015

Тут есть библиотека работы с DNS

http://www.mcqn.com/weblog/dhcp_and_dns_arduino

 

DnsClient.gethostbyname()

 

Coder
Coder аватар
Offline
Зарегистрирован: 04.03.2012

О, спасибо. Щас буду разбираться.

Coder
Coder аватар
Offline
Зарегистрирован: 04.03.2012

Все отлично получилось. Вот результат:

/*
  Ping Example
 
 This example sends an ICMP pings every 500 milliseconds, sends the human-readable
 result over the serial port. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 30 Sep 2010
 by Blake Foster
 
 */

#include <SPI.h>         
#include <Ethernet.h>
#include <ICMPPing.h>
#include <Dns.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {192,168,0,177}; // ip address for ethernet shield
IPAddress pingAddr(0,0,0,0); // ip address to ping

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

void setup() 
{
  // start Ethernet
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  DNSClient dns; 
dns.begin(Ethernet.dnsServerIP()); 
dns.getHostByName("ya.ru",pingAddr); // at this point the function works 
  
}

void loop()
{
   
  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS)
  {
    sprintf(buffer,
            "Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
            echoReply.data.seq,
            echoReply.addr[0],
            echoReply.addr[1],
            echoReply.addr[2],
            echoReply.addr[3],
            REQ_DATASIZE,
            millis() - echoReply.data.time,
            echoReply.ttl);
  }
  else
  {
    sprintf(buffer, "Echo request failed; %d", echoReply.status);
  }
  Serial.println(buffer);
  delay(500);
}

 

alexnik100
Offline
Зарегистрирован: 21.12.2015

Здравствуйте!

У меня Ваш скетч не компилируется. Не проходит проверку.

Подскажите на какой версии среды разработки Arduino Вы запустили и какую плату использовали?

Я проверил несколько  сред  1.0.6, 1.6.0,  1.6.4 , ни с одной не запускается.

Заранее спасибо.

alexnik100

 

 

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

версия 1.6.6

Либа положена

[путь]\libraries\icmp_ping\

Скачана

http://playground.arduino.cc/Code/ICMPPing

Следует учесть!

Каталог в архиве

Arduino-Ping-master\

Нужно подкаталог

icmp_ping\

положить в либрари проекта.

Скетч использует 13 776 байт (44%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 775 байт (37%) динамической памяти, оставляя 1 273 байт для локальных переменных. Максимум: 2 048 байт.

alexnik100
Offline
Зарегистрирован: 21.12.2015

Спасибо за совет!

Скачал. Вставил как сказали. Результат отрицательный

На версии 1.0.6 не компилируется.

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Windows XP), Board: "Arduino Ethernet"
Ping:26: error: no matching function for call to 'ICMPPing::ICMPPing(SOCKET&, uint16_t)'
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:28: note: candidates are: ICMPPing::ICMPPing(SOCKET)
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:26: note:                 ICMPPing::ICMPPing(const ICMPPing&)
Ping.ino: In function 'void loop()':
Ping:37: error: 'ICMPEchoReply' was not declared in this scope
Ping:37: error: expected `;' before 'echoReply'
Ping:38: error: 'echoReply' was not declared in this scope
Ping:38: error: 'SUCCESS' was not declared in this scope

 

На версии 1.6.6 не компилируется.

 Arduino: 1.6.6 (Windows XP), Плата:"Arduino Yún"

 
Неверная библиотека найдена в F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-master: F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-master
Неверная библиотека найдена в F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-version1.0: F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-version1.0
Неверная библиотека найдена в F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-version2.0: F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-version2.0
Неверная библиотека найдена в F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-version3.0: F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\Arduino-Ping-version3.0
Ping:26: error: no matching function for call to 'ICMPPing::ICMPPing(SOCKET&, uint16_t)'
 
F:\Documents and Settings\ALEX\Мои документы\arduino-1.6.6-windows\arduino-1.6.6\libraries\icmp_ping\examples\Ping\Ping.ino:26:51: note: candidates are:
 
In file included from F:\Documents and Settings\ALEX\Мои документы\arduino-1.6.6-windows\arduino-1.6.6\libraries\icmp_ping\examples\Ping\Ping.ino:17:0:
 
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:28:2: note: ICMPPing::ICMPPing(SOCKET)
 
  ICMPPing(SOCKET s); // construct an ICMPPing object for socket s
 
  ^
 
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:28:2: note:   candidate expects 1 argument, 2 provided
 
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:25:7: note: constexpr ICMPPing::ICMPPing(const ICMPPing&)
 
 class ICMPPing
 
       ^
 
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:25:7: note:   candidate expects 1 argument, 2 provided
 
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:25:7: note: constexpr ICMPPing::ICMPPing(ICMPPing&&)
 
F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing/ICMPPing.h:25:7: note:   candidate expects 1 argument, 2 provided
 
F:\Documents and Settings\ALEX\Мои документы\arduino-1.6.6-windows\arduino-1.6.6\libraries\icmp_ping\examples\Ping\Ping.ino: In function 'void loop()':
 
Ping:37: error: 'ICMPEchoReply' was not declared in this scope
 
Ping:37: error: expected ';' before 'echoReply'
 
Ping:38: error: 'echoReply' was not declared in this scope
 
Ping:38: error: 'SUCCESS' was not declared in this scope
 
Несколько библиотек найдено для "ICMPPing.h"
 Используется: F:\Documents and Settings\ALEX\Мои документы\Arduino\libraries\ICMPPing
Не используется: F:\Documents and Settings\ALEX\Мои документы\arduino-1.6.6-windows\arduino-1.6.6\libraries\icmp_ping
exit status 1
no matching function for call to 'ICMPPing::ICMPPing(SOCKET&, uint16_t)'
 
  Это сообщение будет содержать больше информации чем
  "Отображать вывод во время компиляции"
  включено в Файл > Настройки
 

     

alexnik100
Offline
Зарегистрирован: 21.12.2015

Скачал еще три версии 

Arduino-Ping-version1.0

Arduino-Ping-version2.0

Arduino-Ping-version3.0

Вставил прямо так в [путь]\libraries.

На версии 1.0.6  компилируется Arduino-Ping-version1.0  

Ping идет, через монитор видна отправка пакетов и ответ.

На версии 1.0.6  НЕ компилируется Arduino-Ping-version2.0   и 3.0

Затыкается на строчке ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

 

На версии 1.6.6  НЕ компилируется Arduino-Ping-version1.0, 2.0   и 3.0

 

 

alexnik100
Offline
Зарегистрирован: 21.12.2015

 

Подскажите , пожалуйста, что делать.

 

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Удалить ВСЕ версии ардуино.

Перегрузить комп.

Поставить последнюю версию (1.6.6 или 1.6.7)

Прописать место для проектов - лучше не в документ энд сеттингс.

Избегать путей с кирилицей (как правило это имя пользователя)

В пути к проектам в каталог либрарес положить нужные файлы.

 

alexnik100
Offline
Зарегистрирован: 21.12.2015

СПАСИБО!

Делаю.  Как выполню сообщу.

Существует два каталога. Один в папке версии 1.6.6  - libraries, там все библиотеки.

Я копирую все дополнительные библиотеки в первый катлог.

И второй каталог в папке для скетчей. Там  только:

 Информация по установке библиотек: http://www.arduino.cc/en/Guide/Libraries

Туда сохраняются скетчи.

Я правильно делаю?

 

 

 

 

 

alexnik100
Offline
Зарегистрирован: 21.12.2015

Добрый день!

Все заработало. Бился с Arduino-Пинicmp_pingICMPPing.h 

по вечерам  более недели.

БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ!

С уважением, alexnik100