http://s6.uploads.ru/t/9Axm3.jpg
Naben Pinger 1.0 - это проект на Arduino, помогающий удалённо пинговать нужный адрес в интернете или локальной сети ив случае отсутствия ответа перезагрузить модем. Был создан для работы Zyxel Kinetic от которого постоянно отваливался 3G модем.
Использованное оборудование:
- Arduino Uno R3
- Ethernet Shield W5100
- 2 channel re

Скетч:

Код:
#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
#include <Base64.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 gateway( 192, 168, 2, 1 );
IPAddress subnet( 255, 255, 255, 0 );
IPAddress pingAddr(192, 168, 45, 99); // ip address to ping
int i = 0;
SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
int led7 = 7; // Горящая лампочка зелёного цвета при успешном пинге
int led6 = 6; // Горящая лампочка красного цвета при отсутствии пинга
int led5 = 5; // Лампочка жёлтого цвета, означающий наличие напряжения в сети
int led4 = 4; // Пин реле
char server[] = "smtpcorp.com"; // smtp сервер сайта smtp2go для отправки через него емэйла
int port = 2525;

char login[] = "her@gmail.com"; // Ваш логин с сайта smtp2go
char password[] = "12345678";       // Ваш пароль с сайта smtp2go

char email_sendto[] = "her@gmail.com"; // Адрес получателя письма
char email_sendfrom[] = "her@gmail.com"; // Адрес отправителя письма

char name_sendto[] = "her"; // Имя получателя письма
char name_sendfrom[] = "Epic Fail";      // Имя отправителя письма

char subject[] = "Modem was rebooted!"; // Тема письма
EthernetClient client;


void setup()

{
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led4, OUTPUT);
  // start Ethernet


  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  Serial.begin(9600);
  digitalWrite(led5, HIGH);
  digitalWrite(led4, HIGH);
}

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);
    digitalWrite(led7, HIGH);
    digitalWrite(led6, LOW);
    i = 0; //Количество попыток пингования, после которых модем перезагрузиться
    Serial.println(buffer);
  }
  else
  {
    digitalWrite(led6, HIGH);
    digitalWrite(led7, LOW);
    sprintf(buffer, "Echo request failed; %d", echoReply.status);
    i = i + 1;
    Serial.println(i);
    Serial.println(buffer);
    delay(100000); //Пауза между попытками пингования, когда было обнаружен
    if (i == 3) {
      Serial.println("Fuck, now reboot modem");
      digitalWrite(led5, LOW);
      digitalWrite(led4, LOW);
      i = 0;
      delay(5000); //Время на которое выключается реле
      digitalWrite(led5, HIGH);
      digitalWrite(led4, HIGH);
      delay(100000); //Время после включения реле (включается модем и подключается 3G модем)
      Serial.println("Sending email"); //Вывод собщения в терминал, что будет выполнена попытка отправки письма на емаил.
      sendEmail(); //Попытка отправки письма на почтовый ящик о том, что модем был перезагружен
    }
  }
  delay(300000); //Пауза между пингованиями адресата
  }

byte sendEmail() //Функция отправки письма
{
  byte thisByte = 0;
  byte respCode;
  if (client.connect(server, port) == 1) {
    Serial.println(F("connected"));
  }
  else {
    Serial.println(F("connection failed"));
    return 0;
  }
  if (!eRcv()) return 0;
  Serial.println(F("Sending hello"));
  // replace 1.2.3.4 with your Arduino's ip
  client.println("EHLO 1.2.3.4");
  if (!eRcv()) return 0;
  Serial.println(F("Sending auth login"));
  client.println("auth login");
  if (!eRcv()) return 0;
  Serial.println(F("Sending User"));
  // Change to your base64 encoded user
  client.println(strToBase64(login));
  if (!eRcv()) return 0;
  Serial.println(F("Sending Password"));
  // change to your base64 encoded password
  client.println(strToBase64(password));
  if (!eRcv()) return 0;
  // change to your email address (sender)
  Serial.println(F("Sending From"));
  //  client.println("MAIL From: <her@gmail.com>");
  client.print("MAIL From: <");
  client.print(email_sendfrom);
  client.println(">");
  if (!eRcv()) return 0;
  // change to recipient address
  Serial.println(F("Sending To"));
  //client.println("RCPT To: <her@gmail.com>");
  client.print("RCPT To: <");
  client.print(email_sendto);
  client.println(">");
  if (!eRcv()) return 0;
  Serial.println(F("Sending DATA"));
  client.println("DATA");
  if (!eRcv()) return 0;
  Serial.println(F("Sending email"));
  // change to recipient address
  //client.println("To: You <her@gmail.com>");
  client.print("To: ");
  client.print(name_sendto);
  client.print(" <");
  client.print(email_sendto);
  client.println(">");
  // change to your address
  //client.println("From: Me <her@gmail.com>");
  client.print("From: ");
  client.print(name_sendfrom);
  client.print(" <");
  client.print(email_sendfrom);
  client.println(">");
  //client.println("Subject: 111\r\n");
  client.print("Subject: ");
  client.print(subject);
  client.println("\r\n");
  client.println("Modem was rebooted!");
  client.println("Modem was rebooted!");
  client.println("Modem was rebooted!");
  client.println("Modem was rebooted!");
  client.println(".");
  if (!eRcv()) return 0;
  Serial.println(F("Sending QUIT"));
  client.println("QUIT");
  if (!eRcv()) return 0;
  client.stop();
  Serial.println(F("disconnected"));
  return 1;
}
byte eRcv()
{
  byte respCode;
  byte thisByte;
  int loopCount = 0;
  while (!client.available()) {
    delay(1);
    loopCount++;
    // if nothing received for 10 seconds, timeout
    if (loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return 0;
    }
  }
  respCode = client.peek();
  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }
  if (respCode >= '4')
  {
    efail();
    return 0;
  }
  return 1;
}

void efail()
{
  byte thisByte = 0;
  int loopCount = 0;
  client.println(F("QUIT"));
  while (!client.available()) {
    delay(1);
    loopCount++;
    // if nothing received for 10 seconds, timeout
    if (loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return;
    }
  }
  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }
  client.stop();
  Serial.println(F("disconnected"));
}
// кодировка Base64
String strToBase64(char str[]) {
  char charArray[64];
  base64_encode(charArray, str, strlen(str));
  String result = charArray;
  return result;
}