wake-on-esp/src/wol.h

63 lines
1.5 KiB
C

#include <ESP8266WiFi.h>
#include <ESPAsyncUDP.h>
static AsyncUDP udp;
static uint16_t localUdpPort = 9; // local port to listen on
static unsigned char incomingPacket[255]; // buffer for incoming packets
const byte preamble[] = {255,255,255,255,255,255};
static byte target_mac[6];
void udpCallback(AsyncUDPPacket packet);
void wolSetup();
void udpCallback(AsyncUDPPacket packet) {
size_t len = packet.length();
memcpy(&incomingPacket, packet.data(),len);
if (len == 102) {
Serial.printf("*WOL: Received a package from %s\n", packet.remoteIP().toString().c_str());
if (len > 0) {
incomingPacket[len] = 0;
}
bool packageIsValid = true;
for(byte b=0; b<6; b++) {
if(preamble[b] != incomingPacket[b])
{
packageIsValid = false;
break;
}
}
if(packageIsValid) {
Serial.println("*WOL: Package seems to be a valid WOL-package");
}
for(byte b=6; b<12; b++) {
if(int(target_mac[b-6]) != int(incomingPacket[b]))
{
packageIsValid = false;
break;
}
}
if(packageIsValid) {
Serial.println("*WOL: Package is destined for me.");
action_power= 1;
}
}
}
void wolSetup() {
Serial.print("*WOL: My MAC-Address is: ");
String mac = WiFi.macAddress();
Serial.println(mac);
mac.replace(":","");
StringToBytes(mac, target_mac);
udp.listen(localUdpPort);
udp.onPacket(udpCallback);
Serial.printf("*WOL: Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}