1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
| //#define DEBUG #ifdef DEBUG #define BLYNK\_PRINT Serial //#define BLYNK\_DEBUG //#define ENABLE\_DEBUG\_PING #endif
#define BLYNK\_NO\_BUILTIN//disable built-in analog and digital operations. //#define BLYNK\_NO\_INFO//disable providing info about device to the server. (saving time)
#include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <WiFiUdp.h> #include <ESP8266Ping.h>
//blynk colors #define BLYNK\_GREEN"#23C48E" #define BLYNK\_BLUE"#04C0F8" #define BLYNK\_YELLOW"#ED9D00" #define BLYNK\_RED"#D3435C" #define BLYNK\_DARK\_BLUE"#5F7CD8"
//WiFi config const char auth\[\] = "Blynk\_AuthToken"; const char ssid\[\] = "WiFi\_SSID"; const char pass\[\] = "WiFi\_Password";
const IPAddress ip(192, 168, 0, 123); const IPAddress gateway(192, 168, 0, 1); const IPAddress bcastAddr(192, 168, 0, 255); const IPAddress subnet(255, 255, 255, 0); const IPAddress dns(1, 1, 1, 1);
//WOL device config const IPAddress device\_ip(192, 168, 0, 234); byte macAddr\[6\] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
//Alert config const char email\[\] = "example@example.com"; const char device\_name\[\] = "NAS"; const uint16\_t boot\_time = 45;//number for countdown (It does not represent seconds, read the known issues!)
//WOL #define MAGIC\_PACKET\_LENGTH 102 #define PORT\_WAKEONLAN 9 byte magicPacket\[MAGIC\_PACKET\_LENGTH\]; unsigned int localPort = 9;
WiFiUDP udp;
//pins #define STATE\_PINV0 #define BUTTON\_PINV1 #define PING\_TIME\_PINV2 #define RSSI\_PINV3
//state struct WOLServerState { bool IsOnline; uint16\_t boot\_time; bool boot\_error; uint16\_t ping; uint32\_t previousMillis; uint32\_t interval; }; WOLServerState currentState = { false, 0, false, 0, 0, 5000UL };
void setup() { #ifdef DEBUG Serial.begin(115200); #endif
connectWiFi(); connectBlynk();
//if (Blynk.connected()) { if (udp.begin(localPort) == 1) { BLYNK\_LOG("udp begin OK"); buildMagicPacket(); } else { delay(500); ESP.restart(); } //} }
void connectWiFi() { WiFi.mode(WIFI\_STA); WiFi.hostname("WOL server"); WiFi.config(ip, dns, gateway, subnet); WiFi.begin(ssid, pass);
int count = 0; while (WiFi.status() != WL\_CONNECTED) { delay(250); digitalWrite(LED\_BUILTIN, HIGH); delay(250); digitalWrite(LED\_BUILTIN, LOW);
count++; if (count > 20) { delay(500); ESP.restart(); } }
//BLYNK\_LOG("WiFi connected, IP: %s", WiFi.localIP().toString()); }
void connectBlynk() { Blynk.config(auth); Blynk.disconnect();
int count = 0; while (Blynk.connect(10000) == false) { delay(250); digitalWrite(LED\_BUILTIN, HIGH); delay(250); digitalWrite(LED\_BUILTIN, LOW);
count++; if (count > 20) { delay(500); ESP.restart(); } }
BLYNK\_LOG("Blynk connected"); }
void loop() { // Reconnect WiFi if (WiFi.status() != WL\_CONNECTED) { connectWiFi(); return; }
// Reconnect to Blynk Cloud if (!Blynk.connected()) { connectBlynk(); return; }
uint32\_t currentMillis = millis(); if (currentMillis - currentState.previousMillis >= currentState.interval) { currentState.previousMillis = currentMillis;
if (currentState.boot\_time == 0) { currentState.interval = 5000UL; } else { currentState.boot\_time--; if (currentState.boot\_time == 0) { currentState.boot\_error = true; Blynk.email(email, "{DEVICE\_NAME} : Alert", String(device\_name) + " could not be turned on!"); } }
if (Ping.ping(device\_ip, 1)) { currentState.IsOnline = true; currentState.boot\_error = false; currentState.boot\_time = 0; currentState.ping = Ping.averageTime(); } else { currentState.IsOnline = false; currentState.ping = 0; } }
Blynk.run(); }
// Generate magic packet void buildMagicPacket() { memset(magicPacket, 0xFF, 6); for (int i = 0; i < 16; i++) { int ofs = i \* sizeof(macAddr) + 6; memcpy(&magicPacket\[ofs\], macAddr, sizeof(macAddr)); } } //BLYNK\_CONNECTED() { // Blynk.syncVirtual(BUTTON\_PIN); //} // BOOT PC button handler of application BLYNK\_WRITE(BUTTON\_PIN) { if (!currentState.IsOnline && currentState.boot\_time == 0) { BLYNK\_LOG("AppButtonWakeOnLan: value=%d", param.asInt()); udp.beginPacket(bcastAddr, PORT\_WAKEONLAN); udp.write(magicPacket, MAGIC\_PACKET\_LENGTH); udp.endPacket(); currentState.boot\_time = boot\_time; currentState.interval = 1000UL; } } BLYNK\_READ(STATE\_PIN) { Blynk.virtualWrite(RSSI\_PIN, WiFi.RSSI()); Blynk.virtualWrite(PING\_TIME\_PIN, currentState.ping); if (currentState.IsOnline) { Blynk.setProperty(STATE\_PIN, "color", BLYNK\_GREEN); Blynk.virtualWrite(STATE\_PIN, String(device\_name) + " is Online"); Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_DARK\_BLUE); Blynk.setProperty(BUTTON\_PIN, "offLabel", String(device\_name) + " running..."); Blynk.setProperty(BUTTON\_PIN, "onLabel", String(device\_name) + " running..."); } else if (!currentState.IsOnline && currentState.boot\_time > 0) { Blynk.setProperty(STATE\_PIN, "color", BLYNK\_BLUE); Blynk.virtualWrite(STATE\_PIN, "Waiting for ping...");
Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_YELLOW); Blynk.setProperty(BUTTON\_PIN, "offLabel", currentState.boot\_time); Blynk.setProperty(BUTTON\_PIN, "onLabel", "Waiting for ping..."); } else if (!currentState.IsOnline && currentState.boot\_time == 0 && currentState.boot\_error) { Blynk.setProperty(STATE\_PIN, "color", BLYNK\_RED); Blynk.virtualWrite(STATE\_PIN, "Oops! Something happened, Try It Again!");
Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_YELLOW); Blynk.setProperty(BUTTON\_PIN, "offLabel", "Try It Again"); Blynk.setProperty(BUTTON\_PIN, "onLabel", "Magic Packet has been sent"); } else { Blynk.setProperty(STATE\_PIN, "color", BLYNK\_RED); Blynk.virtualWrite(STATE\_PIN, String(device\_name) + " is Offline");
Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_BLUE); Blynk.setProperty(BUTTON\_PIN, "offLabel", "Turn On"); Blynk.setProperty(BUTTON\_PIN, "onLabel", "Magic Packet has been sent"); } }
|