Официальный сайт компании Arduino по адресу arduino.cc
ping нескольких ip адресов
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сб, 17/06/2017 - 21:26
Здравствуйте, нужно пинговать с заданой периодичностью несколько ip адресов, с одним ip адресом проблем нет, но добавляю еще адреса и интерпретатор ругается.
Где собака порылась ) ?
#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,1,119}; // ip address for ethernet shield IPAddress pingAddr_1(192,168,1,101); // ip address to ping IPAddress pingAddr_2(192,168,1,102); // ip address to ping IPAddress pingAddr_3(192,168,1,103); // ip address to ping IPAddress pingAddr_4(192,168,1,104); // ip address to ping IPAddress pingAddr_5(192,168,1,105); // ip address to ping IPAddress pingAddr_6(192,168,1,106); // ip address to ping IPAddress pingAddr_7(192,168,1,107); // ip address to ping IPAddress pingAddr_8(192,168,1,108); // ip address to ping IPAddress pingAddr_9(192,168,1,109); // ip address to ping IPAddress pingAddr_10(192,168,1,110); // 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_1, 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(1000); ICMPEchoReply echoReply = ping(pingAddr_2, 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(1000); ICMPEchoReply echoReply = ping(pingAddr_3, 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(1000); }
/sites/default/files/u10145/snimok_0.jpg
https://hostingkartinok.com/show-image.php?id=37a3d1e08a24aef033bc2a84f1...
Почему то строка
ICMPEchoReply echoReply = ping(pingAddr_1, 4);
в коде должна быть только одна, при добавлении второй вываливается ошибка
/sites/default/files/u10145/snimok_2.jpg
Разобрался, в строке ICMPEchoReply echoReply = ping(pingAddr_1, 4);
надо echoReply менять также echoReply_1, echoReply_2, echoReply_3
Не обязательно (более того - не нужно, - так памяти не напасешься).
Можно заключить каждый из фрагментов для опроса одного адреса в фигурные скобки.
Ну и (или) вообще-то такие вещи делаются через циклы.
Сейчас понадобилось запустить это проект, не не работает библиотека https://github.com/BlakeFoster/Arduino-Ping
Код из примера выдает ошибку , не понятно в чем проблема. Кто знает?
https://hostingkartinok.com/show-image.php?id=fbba7867707f8796908ceb9c11...
Код из примера выдает ошибку , не понятно в чем проблема. Кто знает?
Автор
Код из примера самой библиотеки выдает ошибку. Видимо расчитано для старой версии компилятора. Надо под новой версией запустить
Библиотека Ethernet сменилась.
Поставил библиотеку 1.1.2 Ethernet, компиляция пошла. При выставлении шлюза можно пинговать устройства в других подсетях.
Теперь думаю как сделать перебор IP адресов в цикле, надо пинговать 300 IP адресов, для каждого писать свою функцию не пойдет, памяти не хватит.
Не могу придумать пока как сделать перебор адресов в цикле,
буду рад помощи
В Меге2560 хватит.
Хватит, ее и использую, но не нашему это, говно код не хочется городить, хотя и будет работать.
По нормальному надо библиотеку переписывать, писать свою.
Ну, не знаю. Если даже с простым перебором в цикле проблема, то куда уж замахиваться на переписывание библиотеки...
Придется так писать, как есть. Главное работает.
Пытался либу поковырять, это темный лес....
А что, IP переменной нельзя сделать и в цикле прокрутить? Массив на 300 IP всяко куда меньше чем 300 п.п. Объяви массив IP и вызывай ping в цикле с параметром номер массива. И, что бы помогли, напиши что нибудь сам. Посмотрим, поможем. А плач не могу ведёт прямо в раздел ищу исполнителя.
Не, там в цикле не получиться, попробуйте
Ну почти всё супер. К массиву обращение чут чуть подправить и должно работать. Вы разберитесь в каких точках какие адреса подставить в процедуры. Генерить в цикле надо Ваш temp
Все получилось, в цикле заработало.
Всего вышло сканировать 325 IP адресов.
Осталось подключить отправку на сервер BLYNK.CC , что бы получать данные на телефон через приложение блинка, этот вариант уже отработан.
здравствуйте, не подскажете откуда взять нужную ICMPing библиотеку? перепробовал несколько штук и каждая на что то своё ругается
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ping-arduino