Делюсь опытом ESP8266 + Arduino IDE = Wake On LAN (WOL) by WiFi

RjLexx

New member
Всем привет. Возникла потребность включать комп через ESP. Сам комп подключен к WiFi роутеру по шнурку. На просторах интернета что-то не нашлось примерчиков для Arduino IDE. Решил набросать свой. Выкладываю в общее пользование, вдруг кому-то пригодится. Данный пример позволяет включить комп отправив на ESP запрос в виде http://[IP ESP]/wol.
У меня нет внешнего IP и данный пример вместе с blynk, позволил мне включать комп даже вне домашней сети.

Код:
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

#define SSID "YOU_WIFI"
#define PASSWORD "your_password"

// MAC адрес компа, который нужно разбудить
const byte targetMacAddress[] = { 0xa1, 0xb2, 0xd3, 0xe4, 0xf5, 0x67 };
// IP адрес компа, который нужно разбудить. Также можно указать широковещательный адрес сети, указав в 4м сегменте 255
const byte targetIPAddress[] = { 192, 168, 1, 255 };
// WOL порт. Обычно 7 или 9
const int targetWOLPort = 9;
const unsigned int localUdpPort = 12345;

WiFiServer server(80);
WiFiUDP Udp;

void setup() {
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    // Wait until the client sends some data
    while(!client.available()){
      delay(1);
    }
  
    // Read the first line of the request
    String req = client.readStringUntil('\r');
    String response = "";
    client.flush();

    if (req.indexOf("/wol") != -1) {
      sendWOL();
      response += "ok";
    }

    client.print(formatResponse(response));
    delay(1);
  }
}

String formatResponse(String body) {
  // Prepare the response
  String s = F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n");
  s += body;
  s += F("</html>\n");
  return s;
}

void sendWOL() {
  const int magicPacketLength = 102;
  byte magicPacket[magicPacketLength] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

  for (int ix=6; ix < magicPacketLength; ix++)
    magicPacket[ix] = targetMacAddress[ix % 6];
  
  Udp.begin(localUdpPort);
  Udp.beginPacket(targetIPAddress, targetWOLPort);
  Udp.write(magicPacket, magicPacketLength);
  Udp.endPacket();
  Udp.stop();
}
 
Последнее редактирование:

DeGlucker

New member
Попробовал этот скетч на ESP8266-12.
Зависает на while (WiFi.status() != WL_CONNECTED), (status = 6).
Cвой скетч с библиотекой ESP8266WiFiMulti коннектится нормально,
в чем может быть проблема ?

Через некоторое время статус сменяется на 1 (WL_NO_SSID_AVAIL),
затем опять на 6 (WL_DISCONNECTED). В скетче #define SSID "TestServer"
В списке сетей сервера нет.

Когда статус = 1 в списке сетей появляется ThingDev-2D97, но подключиться к нему невозможно.
На другом таком-же модуле картина аналогичная, только в списке сетей не появляетсе и статус всегда 1. Сплошные глюки, хотя в режиме WiFiMult и AP и STA работают нормально.
 
Последнее редактирование:

AndrF

New member
Не понятно, а причем тут Blynk? Ведь в коде он совсем не используется.

Хотя с ним все было бы очень просто реализовать...
 

AndrF

New member
Этот я и не пробовал. Но с Blynk - работал. Потому и говорю что там проще...
 
. Данный пример позволяет включить комп отправив на ESP запрос в виде http://[IP ESP]/wol.
У меня нет внешнего IP и данный пример вместе с blynk, позволил мне включать комп даже вне домашней сети.
Добрый день, а скетч с Blynk можно посмотреть? В твоем коде же нет ничего про Blynk ;)
 
Сверху Снизу