Пингер на UNO+W5100

Ответить
andertant
Рядовой
Сообщения: 25
Зарегистрирован: 18 янв 2017, 09:21
Откуда: Днепропетровск

Пингер на UNO+W5100

Сообщение andertant »

Добрый день! Есть у меня задача пинговать 8 статических IP-адресов. За каждым адресом закрепляется свой порт микроконтроллера. Если есть связь с указанным IP-адресом то на закрепленном порту МК логическая "1", а если нет ответа 5 раз подряд то логический "0". На просторах интернета находил примеры, но они все на один адрес, например вот https://litl-admin.ru/zhelezo/proverka- ... duino.html .
Подскажите пожалуйста, может быть у кого то есть готовый блок для моей задачи?
Аватара пользователя
kulibinsvv
Лейтенант
Сообщения: 487
Зарегистрирован: 18 сен 2015, 10:04
Откуда: Омск
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Пингер на UNO+W5100

Сообщение kulibinsvv »

Если не секрет, для чего вам такая пинговалка?
Мой змей, этот ползучий соблазн сомнения,всё шевелится, побуждая «искать концы»... (Станислав Ермаков)
andertant
Рядовой
Сообщения: 25
Зарегистрирован: 18 янв 2017, 09:21
Откуда: Днепропетровск

Пингер на UNO+W5100

Сообщение andertant »

Я работаю в связи, на прошлых выходных перерубили кабель, а этот кабель не магистральный а отвод. То что там не работает IP-телефон узнали только на следующий день!
pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25 фев 2018, 17:56
Имя: sonata

Пингер на UNO+W5100

Сообщение pony sonata »

andertant писал(а): 14 май 2018, 10:24но они все на один адрес
не один а два:

Код: Выделить всё

IPAddress pingAddr(192,168,1,9); // локальный адрес
IPAddress pingAddr2(77,88,8,8); // публичный DNS
Отправлено спустя 12 минут 37 секунд:
вообще вам надо разобраться с библиотекой Arduino-ping , которую автор статьи, по ссылке выше, любезно НЕ предоставил в статье, ну или я не увидел ее...
Arduino-Ping.zip
там есть в примерах такой вот:
[spoiler]

Код: Выделить всё

/*
  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,2,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);
}
[/spoiler]

поищите описание и конфигурацию этой строки, что она делает (я не нашел):

Код: Выделить всё

ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
Обработка одного адреса:
[spoiler]

Код: Выделить всё

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);
  }
[/spoiler]

я так понял сама команда для начала пинга:

Код: Выделить всё

ICMPEchoReply echoReply = ping(pingAddr, 4);
, где 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);
  }
если успешный пинг - заполняем буфер мессагами с инфой о пинге, если нет - выводим Echo request failed

Отправлено спустя 3 минуты 32 секунды:
нашел ссылку на гит разработчика библиотеки - https://github.com/BlakeFoster/Arduino-Ping/

Отправлено спустя 2 минуты 33 секунды:
вообще интересная либа для пользовательского блока. у кого есть w5100 и время поразбираться
а вообще пинговалки нету в стандартной Ethernet либе на w5100?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
kulibinsvv
Лейтенант
Сообщения: 487
Зарегистрирован: 18 сен 2015, 10:04
Откуда: Омск
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Пингер на UNO+W5100

Сообщение kulibinsvv »

[ref]andertant[/ref], я не буду отговаривать вас от вашей затеи, но вопрос мониторинга соединения в сетях решается несколько иначе. Не хочу обижать ваших админов, это их работа. И решается данная задача написанием скрипта в течении 30 мин. с почёсыванием в затылке.
Мой змей, этот ползучий соблазн сомнения,всё шевелится, побуждая «искать концы»... (Станислав Ермаков)
pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25 фев 2018, 17:56
Имя: sonata

Пингер на UNO+W5100

Сообщение pony sonata »

не, скриптом легко и не интересно :)
с библиотечкой разобрался бы кто. у меня банально железа нету такого и времени сейчас. на первый взгляд не сложно там
кстати мне чет припоминается, что все ж в стандартной либе эзернетовской есть функция, которая проверяет установился ли коннект с отдельным ип, если нет - выводит ошибку. такая себе мониторилка айпишки
andertant
Рядовой
Сообщения: 25
Зарегистрирован: 18 янв 2017, 09:21
Откуда: Днепропетровск

Пингер на UNO+W5100

Сообщение andertant »

Спасибо всем кто откликнулся, вопрос решил! В том примере, который приводил я выше, подобавлял адреса и выхода МК. Всё работает, правда без счетчика потеряных пакетов, но ничего еще разберусь! Спасибо! :yahoo:
andertant
Рядовой
Сообщения: 25
Зарегистрирован: 18 янв 2017, 09:21
Откуда: Днепропетровск

Пингер на UNO+W5100

Сообщение andertant »

:yahoo: Получилось. Кому надо пользуйтесь на здоровье!

[spoiler]

Код: Выделить всё

#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xFE, 0xFE, 0xFE}; // MAC адрес устройства
byte ip[] = {10,254,145,100}; // IP устройства
byte ds[] = {10,254,145,254}; // DNS
byte gw[] = {10,254,145,254}; // GW


IPAddress pingAddr1(10,254,145,10); 
IPAddress pingAddr2(10,254,145,12); 
IPAddress pingAddr3(10,254,145,14);  
IPAddress pingAddr4(10,254,145,15);  
IPAddress pingAddr5(10,254,145,16);  
IPAddress pingAddr6(10,254,145,17);  
IPAddress pingAddr7(10,254,145,18);  
IPAddress pingAddr8(10,254,145,20);  
SOCKET pingSocket = 0;

int max_fail = 3; // Максимальное количество не ответов
int opros = 1;    // Количество запросов на один цикл
int fail1 = 0;
int fail2 = 0;
int fail3 = 0;
int fail4 = 0;
int fail5 = 0;
int fail6 = 0;
int fail7 = 0;
int fail8 = 0; 


int led1 = 0; 
int led2 = 1;
int led3 = 2;
int led4 = 3;
int led5 = 5;
int led6 = 6;
int led7 = 7;
int led8 = 8;


ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
// Инициализируем Ethernet нашим MAC, IP и шлюзом по умолчанию.
void setup()
{
Ethernet.begin(mac, ip, ds, gw);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);

}

void loop()
{
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr1, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led1, HIGH); fail1 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail1++;}
if (fail1 >= max_fail ) {digitalWrite(led1, LOW);}
}
delay(500);
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr2, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led2, HIGH); fail2 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail2++;}
if (fail2 >= max_fail ) {digitalWrite(led2, LOW);}
}
delay(500);
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr3, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led3, HIGH); fail3 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail3++;}
if (fail3 >= max_fail ) {digitalWrite(led3, LOW);}
}
delay(500);
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr4, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led4, HIGH); fail4 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail4++;}
if (fail4 >= max_fail ) {digitalWrite(led4, LOW);}
}
delay(500);
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr5, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led5, HIGH); fail5 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail5++;}
if (fail5 >= max_fail ) {digitalWrite(led5, LOW);}
}
delay(500);
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr6, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led6, HIGH); fail6 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail6++;}
if (fail6 >= max_fail ) {digitalWrite(led6, LOW);}
}

delay(500);
{
ICMPEchoReply echoReplyWORLD = ping(pingAddr7, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led7, HIGH); fail7 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail7++;}
if (fail7 >= max_fail ) {digitalWrite(led7, LOW);}
}
delay(500);

{
ICMPEchoReply echoReplyWORLD = ping(pingAddr8, opros);
if (echoReplyWORLD.status == SUCCESS) {digitalWrite(led8, HIGH); fail8 = 0;}
if (echoReplyWORLD.status != SUCCESS){ fail8++;}
if (fail8 >= max_fail ) {digitalWrite(led8, LOW);}
}

delay(500);
}
[/spoiler]
Ответить

Вернуться в «Помогите, а то я "нимагу"»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя