1

Тема: Как собрать пинговалку на Arduino.

Есть Freeduino+Ethernet shield. Требуется собрать на этой платформе пинговалку. Есть интернет - зажигаем зеленый светодиод. Нет-интернета - зажигаем красный светодиод. Прошу совета. Может кто уже реализовывал?

2

Re: Как собрать пинговалку на Arduino.

например вот так:
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
byte server[] = { 194, 87, 0, 50 };
int outputPin = 8; 

Client client(server, 80);

boolean send_request()
{
  if (client.connect()) {
    digitalWrite(outputPin, 1);
    Serial.println("1");
  }else{
    digitalWrite(outputPin, 0);
    Serial.println("0");
  }
}

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  pinMode(outputPin, OUTPUT);
}

void loop()
{
  send_request();
  client.stop();
  delay(1000);
}

правда я ограничился одним светодиодом, который просто горит-не горит в зависимости от доступности сервера, но можно добавить еще один светодиод и управлять еще и им вместе с этим.
да, в качестве сервера я использовал IP-адрес сервера www.ru - он в принципе всегда должен быть доступен.

3 (2010-05-21 13:29:07 отредактировано saaremaa)

Re: Как собрать пинговалку на Arduino.

Спасибо за пример, но это немного не то. Нужен ping c результатами тестов в милисекундах чтобы еще приблизительно анализировать загрузку канала.
UPD#1. Проверил пример - работает. Единственное - мне надо было добавить шлюз в код.

4 (2010-05-21 13:33:49 отредактировано kanakhin)

Re: Как собрать пинговалку на Arduino.

дык надо тогда так и говорить. вы сами задачу так поставили - "Есть интернет - зажигаем зеленый светодиод. Нет-интернета - зажигаем красный светодиод."
по поводу же этой задачи - мне кажется нужно смотреть в сторону замера разницы во времени до начала запроса и после запроса. сейчас времени нет пробовать к сожалению, работы полно.
ну я как бе перед тем как что-то советовать обычно это проверяю:)

5

Re: Как собрать пинговалку на Arduino.

Аппетиты растут  :) Попробую с замерами. От помощи тоже не откажусь.

6

Re: Как собрать пинговалку на Arduino.

как время появится... сам пытаюсь выкроить время для экспериментов...
а по поводу результатов замера - если для пинговалки вполне достаточно светодиода, то куда выводить пинги? если только ЖК-экранчик подключать...

7 (2010-05-21 13:47:14 отредактировано saaremaa)

Re: Как собрать пинговалку на Arduino.

Опишу в кратце:
1. Берем 3 светодиода (красный, желтый, зеленый)
2. Замеряем время подключения. каждые 10 секунд, например.
3. В зависимости от полученного времени (загруженности канала) зажигаем или  красный или желтый или зеленый светодиод.
Получается эдакий админский светофор.
админский светофор

8 (2010-05-23 15:22:25 отредактировано saaremaa)

Re: Как собрать пинговалку на Arduino.

Быстро написанный скетч в обед - в общем решает задачу. Бантики и рюшечки, а так же оптимизацию кода потом допишу. Спасибо за начальную идею.

#include <Ethernet.h>
/*"Админский светофор"*/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 88, 25 }; // IP-адрес Ethernet shield`a
byte subnet[] = { 255, 255, 255, 0 };   //маска подсети
byte server[] = {194, 87, 0, 50}; // IP-адрес жертвы, шучу. Адрес удаленного интернет-сервера (www.ru)
byte gateway[] = { 192,168, 88, 1 }; // Шлюз с локальной сети 
int redfPin = 8; // красный светодиод (ошибка соединения)на 8 пине
int redPin = 6; // красный светодиод на 6 пине
int yellowPin = 4; // желтый светодиод на 4 пине
int greenPin = 2;  // зеленый светодиод на 2 пине
int low = 50 ; // нижняя планки величины пинга что меньше значения low - это нормально 
int middle = 200 ; // средняя планка величины пинга что меньше значения low - это средняя наггрузка
Client client(server, 80); // порт по которому мы будем соединяться с удаленным сервером

boolean send_request()
{
  int sc_start=millis(); // замеряем время до начала подключения
  if (client.connect()) {
    int sc_stop=millis(); // после успешного соединения замеряем время окончатния соединения
    rtime=(rtime+(sc_stop-sc_start))/2; // считаем сколько времени ушло на соединение - среднее значение
    // Время отклика привысило критический предел - зажигаем красный светодиод
    if (rtime > middle){ 
      digitalWrite(redfPin, 0); 
      digitalWrite(redPin, 1);
      digitalWrite(yellowPin, 0);
      digitalWrite(greenPin, 0);
      Serial.print("Red status ->");
    }
    // Время отклика в среднем диапазоне - зажигаем желтый светодиод
    if ((rtime > low) && (rtime < middle)){ 
      digitalWrite(redfPin, 0); 
      digitalWrite(redPin, 0);
      digitalWrite(yellowPin, 1);
      digitalWrite(greenPin, 0);
      Serial.print("Yellow status ->");
    }
    // Время отклика в минимальном диапазоне - зажигаем зеленый светодиод
    if ((rtime > 1) && (rtime < low)){ 
      digitalWrite(redfPin, 0); 
      digitalWrite(redPin, 0);
      digitalWrite(yellowPin, 0);
      digitalWrite(greenPin, 1);
      Serial.print("Green status ->");
    }
    Serial.print("average response time = ");
    Serial.println(rtime);
//    Serial.print("Debug: response time = ");
//    Serial.println(sc_stop-sc_start);  
  }else{
    // Не удалось соединиться - зажигаем красный светодиод (ошибка соединения)
    digitalWrite(redfPin, 1); 
    digitalWrite(redPin, 0); 
    digitalWrite(yellowPin, 0); 
    digitalWrite(greenPin, 0); 
    Serial.println("Red status -> response time = Timeout");
    rtime=rtime+middle; 
  }
}

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet);
  Serial.begin(9600);
  pinMode(redfPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
 // Проводим тест всех светодиодов при запуске
  digitalWrite(redfPin, 1); 
  delay(1000);
  digitalWrite(redPin, 1);
  delay(1000);
  digitalWrite(yellowPin, 1);
  delay(1000);
  digitalWrite(greenPin, 1);
  delay(2000);
  //Сбрасываем состояние светодиодов на выкл.
  digitalWrite(redfPin, 0); 
  digitalWrite(redPin, 0);
  digitalWrite(yellowPin, 0);
  digitalWrite(greenPin, 0);
}
void loop()
{
  send_request();
  client.stop();
  delay(10000);
}

9

Re: Как собрать пинговалку на Arduino.

saaremaa пишет:

Опишу в кратце:
...
3. В зависимости от полученного времени (загруженности канала) зажигаем или  красный или желтый или зеленый светодиод.
...
админский светофор

Любой нормальный админ знает, что пинг не показатель загруженности канала.
На не нагруженном канале может быть большое значение пинга, а на нагруженном может быть и маленькое значение.
Все зависит от настроек маршрутизаторов и приоритета трафика.

10

Re: Как собрать пинговалку на Arduino.

Не суть, ардуинка была как временное решение. Сейчас Netwatch производит специальная железка.