Пингер на UNO+W5100
Пингер на UNO+W5100
Добрый день! Есть у меня задача пинговать 8 статических IP-адресов. За каждым адресом закрепляется свой порт микроконтроллера. Если есть связь с указанным IP-адресом то на закрепленном порту МК логическая "1", а если нет ответа 5 раз подряд то логический "0". На просторах интернета находил примеры, но они все на один адрес, например вот https://litl-admin.ru/zhelezo/proverka- ... duino.html .
Подскажите пожалуйста, может быть у кого то есть готовый блок для моей задачи?
Подскажите пожалуйста, может быть у кого то есть готовый блок для моей задачи?
- kulibinsvv
- Лейтенант
- Сообщения: 487
- Зарегистрирован: 18 сен 2015, 10:04
- Откуда: Омск
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
Пингер на UNO+W5100
Если не секрет, для чего вам такая пинговалка?
Мой змей, этот ползучий соблазн сомнения,всё шевелится, побуждая «искать концы»... (Станислав Ермаков)
Пингер на UNO+W5100
Я работаю в связи, на прошлых выходных перерубили кабель, а этот кабель не магистральный а отвод. То что там не работает IP-телефон узнали только на следующий день!
-
- Лейтенант
- Сообщения: 373
- Зарегистрирован: 25 фев 2018, 17:56
- Имя: sonata
Пингер на UNO+W5100
не один а два:
Код: Выделить всё
IPAddress pingAddr(192,168,1,9); // локальный адрес
IPAddress pingAddr2(77,88,8,8); // публичный DNS
вообще вам надо разобраться с библиотекой Arduino-ping , которую автор статьи, по ссылке выше, любезно НЕ предоставил в статье, ну или я не увидел ее... там есть в примерах такой вот:
[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);
}
поищите описание и конфигурацию этой строки, что она делает (я не нашел):
Код: Выделить всё
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);
}
я так понял сама команда для начала пинга:
Код: Выделить всё
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);
}
Отправлено спустя 3 минуты 32 секунды:
нашел ссылку на гит разработчика библиотеки - https://github.com/BlakeFoster/Arduino-Ping/
Отправлено спустя 2 минуты 33 секунды:
вообще интересная либа для пользовательского блока. у кого есть w5100 и время поразбираться
а вообще пинговалки нету в стандартной Ethernet либе на w5100?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- kulibinsvv
- Лейтенант
- Сообщения: 487
- Зарегистрирован: 18 сен 2015, 10:04
- Откуда: Омск
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
Пингер на UNO+W5100
[ref]andertant[/ref], я не буду отговаривать вас от вашей затеи, но вопрос мониторинга соединения в сетях решается несколько иначе. Не хочу обижать ваших админов, это их работа. И решается данная задача написанием скрипта в течении 30 мин. с почёсыванием в затылке.
Мой змей, этот ползучий соблазн сомнения,всё шевелится, побуждая «искать концы»... (Станислав Ермаков)
-
- Лейтенант
- Сообщения: 373
- Зарегистрирован: 25 фев 2018, 17:56
- Имя: sonata
Пингер на UNO+W5100
не, скриптом легко и не интересно 
с библиотечкой разобрался бы кто. у меня банально железа нету такого и времени сейчас. на первый взгляд не сложно там
кстати мне чет припоминается, что все ж в стандартной либе эзернетовской есть функция, которая проверяет установился ли коннект с отдельным ип, если нет - выводит ошибку. такая себе мониторилка айпишки

с библиотечкой разобрался бы кто. у меня банально железа нету такого и времени сейчас. на первый взгляд не сложно там
кстати мне чет припоминается, что все ж в стандартной либе эзернетовской есть функция, которая проверяет установился ли коннект с отдельным ип, если нет - выводит ошибку. такая себе мониторилка айпишки
Пингер на UNO+W5100
Спасибо всем кто откликнулся, вопрос решил! В том примере, который приводил я выше, подобавлял адреса и выхода МК. Всё работает, правда без счетчика потеряных пакетов, но ничего еще разберусь! Спасибо! 

Пингер на UNO+W5100

[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);
}
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей