• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Включение ПК с помощью ESP8266

rst

Member
А библиотеки для реализации HID-устройства не подскажите? Проще отправить меня гуглить, но теоретически хотелось бы прежде обсудить. На борту esp стоит max340, но работает она от эмулятора com порта в ПК. То есть как самостоятельное usb устройство она не работает.
Не знаю что такое MAX340.
Если Вы имели в виду чип USB-UART типа MAX232x или CP210x или PL2303 и т.п., то они как я писал, не подходят, так как реализуют CDC-профиль, а нужен HID-профиль.
Библиотеками никакими не пользуюсь, так что не подскажу. Но можно взять посмотреть примеры реализации HID-устройств для разных МК, которые идут в комплекте например с IAR. Взять какой-нить МК с USB, для такого обычно есть несколько примеров проектов с USB HID device. И остаётся в качестве нижнего уровня USB-стека (энумерация, дескрипторы, работа с эндпоинтами и т.п.) взять soft-USB-стек, а в качестве верхнего уровня (USB-профили) - из примера.
В той же MAX232 внутри реализован USB-стек и CDC-профиль. Убрать оттуда CDC и заменить на HID никак не получится.
 

view24

Member
А потом реле замыкающее контакты кнопки включения компьютера.
Спасибо за идею. Юрий, в анонсе темы я написал, что подружить NodeMcu c интернетом я смогу, но оказалось это не так, ибо интернет оказался за proxy squid, ибо это предприятие. Я думаю, что Вы знаете как организовать http get запрос от ESP8266 через proxy на сайт в интернете. Просьба подсказать, как это сделать с использованием Arduino IDE.
 

view24

Member
HTTP-proxy - это очень просто. Запрос через него мало отличается от запроса без прокси. Но товарищ-то спрашивает про какой-то proxy squid, не знаю что это такое.
А Вы много знаете реализаций proxy сервера на предприятии? Чтобы сотрудники не лазили в социальные сети и т.д.? Так вот SQUID это то же, что Windows для процессора intel - самый распространенный вариант. Но вернемся к теме, Вы написали 'мало чем отличается'. http заголовки это такая штука, что малейшая ошибка - и запрос приходит с кодом 4xx. Вопрос: Вы считаете, что достаточно просто перенаправить запрос на host и port proxy или есть еще подводные камни?
 

rst

Member
А Вы много знаете реализаций proxy сервера на предприятии?
Я вообще не знаю ни одной реализации proxy-сервера, так как я не админ и ими не занимаюсь. Да и вопрос тут вроде совсем в другом: Вам же надо не сервер свой написать, а просто работать через него?
И если это обычный HTTP-прокси, то нет никакой разницы чьего он производства, так как должен удовлетворять стандарту.
Я писал HTTP-клиент, работающий через HTTP-прокси совершенно не зная какой там у админов сервер стоит. Тоже для решения аналогичной задачи - нужно было чтобы моё ПО работало и в офисе, где тоже в инет ходили через HTTP-прокси.
Вы считаете, что достаточно просто перенаправить запрос на host и port proxy или есть еще подводные камни?
Недостаточно. Там сам запрос формируется по другому.
И я не считаю, я пару раз писал клиентов и оба работают до сих пор. Один - под винду, другой - на Cortex-M4.
Вот фрагмент виндового клиента, формирующего запрос (как видно - разница ничтожна):
Код:
  CInetConnection *socket = new CInetConnection();
  if (useProxy) f = socket->Open(proxyHost, atol(proxyPort));
  else f = socket->Open(srcHost, srcPort);
  if (f) { //Если не удалось соединиться - вываливаемся
    if (useProxy) {
      s = NULL;
      s2 = "";
      if (useProxyAuth && proxyLogin[0] && proxyPwd[0]) {
        i = vbuf1.sprintf("%s:%s", proxyLogin, proxyPwd);
        s = new char[i * 2 + 4 + 1];
        if (s1 = Base64Encode(s, i * 2 + 4, (char *)vbuf1, i)) {
          *s1 = 0;
          vbuf1.sprintf("Proxy-Authorization: Basic %s\r\n", s);
          s2 = (char *)vbuf1;
        }
      }
      i = vbuf.sprintf(
        "GET http://%s HTTP/1.0\r\n"
        "Accept: */*\r\n"
        "Host: %s:%d\r\n" "%s"
        "Pragma: no-cache\r\n"
        "Cache-Control: no-cache\r\n"
        "\r\n\0", srcURL, srcHost, srcPort, s2);
      if (s) delete s;
    } else i = vbuf.sprintf(
      "GET /%s HTTP/1.0\r\n"
      "Accept: */*\r\n"
      "Host: %s:%d\r\n"
      "\r\n\0", srcDocument, srcHost, srcPort);
 
Последнее редактирование:

vivalenta

New member
Да, спасибо, это я понял даже до Вашего замечания, и даже свой пост предыдущий отредактировал.
есть такая штука, пашет уже год, есть исходники. куда сбросить ?

использует:
1.) esp 8266-12E (NodeMCU)
2) реле 5В 1 канал
3) 4 резистора 68-220 КОм

умеет:
Онлайн счетчик
Включать/отключать/Жесткий сброс/Жесткая перезагрузка
отоброжать состояние (вкл/викл), и напругу (0-14В)

как оформить/ куда сбросить / нужно ?
 

shuraf

Member
есть такая штука, пашет уже год, есть исходники. куда сбросить ?

использует:
1.) esp 8266-12E (NodeMCU)
2) реле 5В 1 канал
3) 4 резистора 68-220 КОм

умеет:
Онлайн счетчик
Включать/отключать/Жесткий сброс/Жесткая перезагрузка
отоброжать состояние (вкл/викл), и напругу (0-14В)

как оформить/ куда сбросить / нужно ?
Все нужно. Кидай чего не жалко, все пригодится
 

vivalenta

New member
В архиве исходник, 2 фотки, и пини NodeMCU (esp8266-12e devkit)
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>


//const char *ssid = "ssid";
//const char *password = "passpass";
const char *ssid = "ssid";             // Сід Wi-Fi
const char *password = "passpass";    // Пасс Wi-Fi

ESP8266WebServer server ( 80 );
IPAddress ip;
char ipH[16];
const int led = 2;  // Синій світлодіод (D4)
const int rel = 0;  // Реле сидить на 0 (D3)
int curState = 0;
int digState = 0;
float voltage = 0.0;
char svoltage[5] = "";

void handleRoot() {
  curState = analogRead(A0);  // Знімаю значення з A0 (при моему поділювачеві 220-86 КОм та напрузі 12В значення 730)
  digState = digitalRead(4);  // Знімаю значення з gpio4 (D2) стан світлодіода PLED+ на материнці
  voltage = (float)curState * 12 / 730;
  dtostrf(voltage, 2, 1, svoltage);
  digitalWrite ( led, 0 );
  char temp[800];
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;
  snprintf ( temp, 800, "<meta http-equiv='refresh' content='5'>\
  <style>body { background-color: #000000; Color: #9ACD32; font-size: 300%; }a.kf {color: #fff;  background:#4BD438;  padding: .7em 1.5em;  outline: none; border-radius:5px;}a.k {color: #fff;  background:#D44B38;  padding: .7em 1.5em;  outline: none; border-radius:5px;}</style>\
  <h1>Online: %02d:%02d:%02d</h1>\
  <br><a href='/on' class='kf'>On</a><a href='/res' class='k'>Reset</a><a href='/off' class='k'>HardOff</a><br><br><p>State: %s V</p>\
  <embed src='%d.svg' width='512' height='512' type='image/svg+xml'>", hr , min % 60, sec % 60, svoltage, digState);
  server.send ( 800, "text/html", temp );
  delay(100);
  digitalWrite ( led, 1 );
}

void handleNotFound() {
  digitalWrite ( led, 0 );
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";

  for ( uint8_t i = 0; i < server.args(); i++ ) {
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
  }

  server.send ( 404, "text/plain", message );
  digitalWrite ( led, 1 );
}

void setup ( void ) {
  pinMode ( 4, INPUT );
  pinMode ( A0, INPUT );
  pinMode ( led, OUTPUT );
  pinMode ( rel, OUTPUT );
  digitalWrite ( led, 1);
  digitalWrite ( rel, 0 );
  WiFi.hostname("esp8266");
  WiFi.mode(WIFI_OFF);
  WiFi.begin ( ssid, password );

  while ( WiFi.status() != WL_CONNECTED ) {
    digitalWrite ( led, 0 );
    delay ( 450 );
    digitalWrite ( led, 1 );
    delay ( 50 );
  }
  if (!MDNS.begin("esp8266")) {
    while (10) {
      delay(100);
    }
  }

  MDNS.addService("http", "tcp", 80);
  ip = WiFi.localIP();
  sprintf(ipH, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  server.on ( "/", handleRoot );
  server.on ( "/on", []() {
    digitalWrite(rel, 1);
    delay(200);
    digitalWrite(rel, 0);
    String Message = "<meta http-equiv='refresh' content='5;url=http://";
    Message += ipH;
    Message += "'/><h1>On Done!</h1><br><p>";
    Message += "</p>";
    Message += "<embed src='ok.svg' width='300' height='300' type='image/svg+xml' >";
    server.send ( 200, "text/html", Message );
  } );
  server.on ( "/off", []() {
    String Message = "<meta http-equiv='refresh' content='5;url=http://";
    Message += ipH;
    Message += "'/><h1>Off Done!</h1><br><p>";
    Message += "</p>";
    Message += "<embed src='ok.svg' width='300' height='300' type='image/svg+xml' >";
    server.send ( 200, "text/html", Message );
    digitalWrite(rel, 1);
    delay(8000);
    digitalWrite(rel, 0);
  } );
  server.on ( "/res", []() {
    String Message = "<meta http-equiv='refresh' content='5;url=http://";
    Message += ipH;
    Message += "'/><h1>Reset Done!</h1><br><p>";
    Message += "</p>";
    Message += "<embed src='ok.svg' width='300' height='300' type='image/svg+xml' >";
    server.send ( 200, "text/html", Message );
    digitalWrite(rel, 1);
    delay(8000);
    digitalWrite(rel, 0);
    delay(3000);
    digitalWrite(rel, 1);
    delay(200);
    digitalWrite(rel, 0);
  } );

  server.on ( "/ok.svg", []() { server.send ( 200, "image/svg+xml", "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 300 300'><circle fill='#009D0D' cx='144' cy='144' r='144'/> <polygon fill='#FFFFFF' points='122.4,222.7 241,104 207,70.2 122.9,154.8 81,112.2 47,146.8'/>Not support inline SVG.</svg>");} );
  server.on ( "/1.svg", []() { server.send ( 500, "image/svg+xml", "<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 200 200'><circle cx='75' cy='75' r='65' fill='#4BD438'/><path d='M75 37a38 38 0 1 0 38 38A38 38 0 0 0 75 37Zm0 72.4A34.5 34.5 0 0 1 67.8 41.3l-3.5 38.4L75.7 76l-2 33.3 16.5-46-9.8 2.4 3.3-24A34.4 34.4 0 0 1 75 109.5Z' fill='#050'/></svg>");} );
  server.on ( "/0.svg", []() { server.send ( 500, "image/svg+xml", "<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 200 200'><circle cx='75' cy='75' r='65' fill='#D44B38'/><path d='M75 37a38 38 0 1 0 38 38A38 38 0 0 0 75 37Zm0 72.4A34.5 34.5 0 0 1 67.8 41.3l-3.5 38.4L75.7 76l-2 33.3 16.5-46-9.8 2.4 3.3-24A34.4 34.4 0 0 1 75 109.5Z' fill='#500'/></svg>");} );
  server.onNotFound ( handleNotFound );
  server.begin();
}

void loop ( void ) {
  server.handleClient();
}
в среднем пашет 600+ часов онлайн, 2-3 включения в день

upd. добавил "схему"
 

Вложения

Последнее редактирование:

zsp040

New member
blynk + WOL. Все удобно, белый ип не нужен, лишние провода тоже. Если нужен код - обращайтесь
 

safari

New member
Я свой ПК подлючал так.
nodemcu + blynk, стандартное ардуиское реле на 5В, замыкаем power на материнке. И включить и выключить можно через инет. Делал для удаленного запуска тимвьювера.
 
Сверху Снизу