ping нескольких ip адресов

russo
Offline
Зарегистрирован: 20.11.2014

Здравствуйте, нужно пинговать с заданой периодичностью несколько 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

 

russo
Offline
Зарегистрирован: 20.11.2014
russo
Offline
Зарегистрирован: 20.11.2014

Почему то строка

 ICMPEchoReply echoReply = ping(pingAddr_1, 4);

в коде должна быть только одна, при добавлении второй вываливается ошибка

/sites/default/files/u10145/snimok_2.jpg

russo
Offline
Зарегистрирован: 20.11.2014

Разобрался, в строке ICMPEchoReply echoReply = ping(pingAddr_1, 4);

надо echoReply менять также echoReply_1, echoReply_2, echoReply_3

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не обязательно (более того - не нужно, - так памяти не напасешься).

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

Ну и (или) вообще-то такие вещи делаются через циклы.

russo
Offline
Зарегистрирован: 20.11.2014

Сейчас понадобилось запустить это проект, не не работает библиотека https://github.com/BlakeFoster/Arduino-Ping

Код из примера выдает ошибку , не понятно в чем проблема. Кто знает?

https://hostingkartinok.com/show-image.php?id=fbba7867707f8796908ceb9c11...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

russo пишет:

Код из примера выдает ошибку , не понятно в чем проблема. Кто знает?

Автор

russo
Offline
Зарегистрирован: 20.11.2014

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Библиотека Ethernet сменилась.

russo
Offline
Зарегистрирован: 20.11.2014

Поставил библиотеку 1.1.2 Ethernet, компиляция пошла. При выставлении шлюза можно пинговать устройства в других подсетях.

Теперь думаю как сделать перебор IP адресов в цикле, надо пинговать 300 IP адресов, для каждого писать свою функцию не пойдет, памяти не хватит.

 

russo
Offline
Зарегистрирован: 20.11.2014

Не могу придумать пока как сделать перебор адресов в цикле,

буду рад помощи

sadman41
Offline
Зарегистрирован: 19.10.2016

В Меге2560 хватит.

russo
Offline
Зарегистрирован: 20.11.2014

Хватит, ее и использую, но не нашему это, говно код не хочется городить, хотя и будет работать.

По нормальному надо библиотеку переписывать, писать свою.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, не знаю. Если даже с простым перебором в цикле проблема, то куда уж замахиваться на переписывание библиотеки...

russo
Offline
Зарегистрирован: 20.11.2014

Придется так писать, как есть. Главное работает.

Пытался либу поковырять, это темный лес....

nik182
Онлайн
Зарегистрирован: 04.05.2015

А что, IP переменной нельзя сделать и в цикле прокрутить? Массив на 300 IP всяко куда меньше чем 300 п.п. Объяви массив IP и вызывай ping в цикле с параметром номер массива. И, что бы помогли, напиши что нибудь сам. Посмотрим, поможем. А плач не могу ведёт прямо в раздел ищу исполнителя. 

russo
Offline
Зарегистрирован: 20.11.2014

Не, там в цикле не получиться, попробуйте

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
long time_otvet;

IPAddress ip(10,215,3,50);
IPAddress myDns(10,215,3,254);
IPAddress gateway(10,215,3,254);
IPAddress subnet(255, 255, 255, 0);

int IPAddr[11][4]= {
  {10,215,  3,  5},
  {10,215,  3, 11},
  {10,215,  3, 12},
  {10,215,  3, 13},
  {10,215,  3, 14},
  {10,215,  3, 15},
  {10,215, 11, 72},
  {10,215, 12,107},
  {10,215, 11, 45},
  {10,215, 10, 14},
  {10,215, 10, 15}};

  int temp[4];

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
 
void setup()
{
  // start Ethernet
  //Ethernet.begin(mac, ip);
  Ethernet.begin(mac, ip, myDns, gateway, subnet);
  Serial.begin(9600);

  for(int i=0; i<4; i++) temp[i]=IPAddr[0][i];
  IPAddress temp;
}

void loop() {
  for(int i=0; i<11; i++){
    ICMPEchoReply echoReply = ping(temp, 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);
    }
    time_otvet = millis() - echoReply.data.time;
    Serial.println(buffer);
    if(time_otvet>100)
    {
      Serial.println("LONG OTVET");
    
    }
    delay(500);
  }
}

 

nik182
Онлайн
Зарегистрирован: 04.05.2015

Ну почти всё супер. К массиву обращение чут чуть подправить и должно работать. Вы разберитесь в каких точках какие адреса подставить в процедуры. Генерить в цикле надо Ваш temp

 
russo
Offline
Зарегистрирован: 20.11.2014

Все получилось, в цикле заработало.

Всего вышло сканировать 325 IP адресов.

Осталось подключить отправку на сервер BLYNK.CC , что бы получать данные на телефон через приложение блинка, этот вариант уже отработан.