Прохождение пинга при помощи Uno+Ethernet Shield

Тема в разделе "Проводная и беспроводная связь", создана пользователем ortah, 9 июн 2018.

  1. ortah

    ortah Нуб

    Доброго времени суток, товарищи! Передо мной стоит задача реализовать проверку канала связи при помощи Arduino Uno и Ethernet Shield, основываясь на материале следующей статьи:
    https://litl-admin.ru/zhelezo/proverka-kanala-svyazi-na-arduino.html
    Суть заключается в том, чтобы устройство посылало пинги на два ip адреса: локальный и внешний (удаленный). В случае успеха обоих операций загорается зеленый светодиод, одной операции - желтый, ни одной красный. В последствии, хочу вывести эту информацию на ЖК экран (с экраном проблем быть не должно, потому что его настройка показала его исправность в работе).
    Я использовал для этого, согласно статьи, библиотеку ICMPping. Если загрузить скетч из примеров, связанный, к примеру, с созданием сервера или проверкой dhcp адреса, все работает без проблем. Но пинги не проходят.
    Если пинговать непосредственно с компьютера, с командной строки все проходит отлично.
    Схема соединения следующая: arduino uno с ethernet shield воткнуто в сетевую карту компьютера. Сам же компьютер получает интернет с wi-fi модуля, который соединен с роутером по wi-fi. В сетевых подключениях на компьютере сделан мост (с сетевухи на Wi-fi модуль).
    с помощью команды dhcpaddressprinter мы знаем, что ip-адрес устройства 192.168.1.8. Из параметров сетевого подключения ip адреса dns и gw равны 192.168.1.1. Какой адрес прописать в качестве локального? Где его взять?
    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>
    #include <ICMPPing.h>
    byte mac[] = {0xDE, 0xAD, 0xBE, 0xFE, 0xFE, 0xFE}; // MAC адрес устройства
    byte ip[] = {192,168,1,8}; // IP устройства
    byte ds[] = {192,168,1,1}; // DNS
    byte gw[] = {192,168,1,1}; // GW
    IPAddress pingAddr(192,168,1,9); // локальный адрес
    IPAddress pingAddr2(77,88,8,8); // публичный DNS
    SOCKET pingSocket = 0;
    int interval = 10000; // 10 секунд
    int MAX_FAIL = 6; // сколько пингов считать неуспешными
    int FAIL = 0; // счётчик фейлов
    int ledRED = 7; // пин для красного диода (и далее - остальных)
    int ledYEL = 6;
    int ledGRN = 5;
    ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
    // Инициализируем Ethernet нашим MAC, IP и шлюзом по умолчанию.
    void setup()
    {
    Ethernet.begin(mac, ip, ds, gw);
    pinMode(ledGRN, OUTPUT);
    pinMode(ledYEL, OUTPUT);
    pinMode(ledRED, OUTPUT);
    }
    void loop()
    {
    ICMPEchoReply echoReply = ping(pingAddr, 2);
    if (echoReply.status == SUCCESS)
    {
    ICMPEchoReply echoReplyWORLD = ping(pingAddr2, 2);
    if (echoReplyWORLD.status == SUCCESS)
    {
    digitalWrite(ledGRN, HIGH);
    digitalWrite(ledRED, LOW);
    digitalWrite(ledYEL, LOW);
    FAIL=0;
    }
    else
    {
    digitalWrite(ledGRN, LOW);
    digitalWrite(ledRED, LOW);
    digitalWrite(ledYEL, HIGH);
    FAIL=0;
    }
    }
    else
    {
    // Увеличиваем счётчик фейлов
    FAIL++;
    }
    // Если счётчик фейлов превысил некий порог
    if (FAIL >= MAX_FAIL)
    {
    // Меняем индикацию
    digitalWrite(ledGRN, LOW);
    digitalWrite(ledYEL, LOW);
    digitalWrite(ledRED, HIGH);
    }
    // не даём счётчику фейлов переполнять переменную
    if (FAIL > 300) {FAIL=6;}
    delay(interval);
    }
    В плане кода я думаю все должно быть понятно. 7,6,5 цифровые выводы подключены к светодиодам красного, желтого и зеленого цветов соответственно.
    Пожалуйста, подскажите что мне делать. Или тыкните носом в необходимую литературу. Очень много времени мучаюсь, а результата нет. Заранее большое спасибо за любой конструктивный ответ! Извините за неграмотность, это мой первый проект.
     

    Вложения:

  2. parovoZZ

    parovoZZ Гуру

    У тебя скетч вообще ждёт эхо-ответ? Адреса указаны верно.
     
  3. ortah

    ortah Нуб

    да, в итоге все получилось. проблема решилась настройкой сетевого моста (там я прописал ip 192.168.1.9, и DNS 192.168.1.1.)
    Сейчас не могу настроить ЖК экран. Отдельно в скетче blink из библиотеки liquidcrystal он работает, а совместно с вышеуказанным кодом нет. Как быть?
     
  4. stasych

    stasych Нерд

    Я думаю, что будет нецелесообразно создавать еще одну подобную тему.

    Пытаюсь сделать на W5100 проверку канала связи. Суть в том, что крайне редко бывает случается подвисает роутер на даче. И хотелось бы его релюхой перезагружать. При условии непрохождении пинга.

    1.Вышеописанный скетч подходит на 90%. Однако не могу найти нормальную библиотеку ICMPPing.h. Несколько штук скачал, ноу них какие-то проблемы с определением переменных. Компилятор выдает кучу ошибок. Будьте добры, подскажите где взять эту библиотеку в рабочем состоянии.
    2. Я так думаю, что это возможно сделать, основываясь на средствах библиотеки Ethernet.h.

    Нашел похожую тему http://forum.amperka.ru/threads/ping-ip-w5100-реле.12483/

    Пока экспериментирую по обоим направлениям. Может кто что подскажет.