
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;
}