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