ESP8266: система домашней автоматизации на основе клиент-сервера

Я работаю над проектом домашней автоматизации, в котором пытаюсь использовать звездообразную топологию, где один esp8266 действует как сервер, и к нему можно получить доступ из веб-браузера для получения команд от пользователя, а два или более esp8266 действуют как клиенты. которые подключены к реле. По запросу пользователя сервер esp8266 отправляет команду соответствующему клиенту для запуска реле, и клиент esp8266 отвечает текущим статусом реле.

С подключением проблем нет, поэтому я оставляю эти вопросы в стороне. До сих пор

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char *ssid = "AndroidAP";
const char *password = "qvdo2440";

ESP8266WebServer server(80);
String webPage = "";

void handleRoot() {
  server.send(200, "text/html", webPage);
}

void setup() {
  webPage += "<h1>ESP8266 Web Server</h1>";
  webPage += "<p>Socket #2 <a href=\"socket2On\"><button>ON</button>
</a>&nbsp;<a href=\"socket2Off\"><button>OFF</button></a></p>";

  delay(1000);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println();
  while (WiFi.status() != WL_CONNECTED) {
   delay(500);
    Serial.print(".");
  }
  Serial.print("Configuring access point...");
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

Это код для серверной части. Я не могу придумать, как программировать для клиентской стороны. Любая помощь будет ценна.

И да. Я прочитал много статей, попробовал много вещей, которые я нашел в Интернете. Но ничто не могло мне помочь. Так что я здесь для еще нескольких предложений с лучшей проработкой.

, 👍1

Обсуждение

Японял твою точку зрения. N это кажется абсолютно подходящим для моего типа проекта. Могу ли я сделать то же самое на своем веб-хостинге вместо того, чтобы создавать сервер на своем компьютере? И было бы очень полезно, если бы вы могли поделиться некоторыми ссылками на то же самое., @Rohit Mathur

Точки доступа ESP8266 могут обрабатывать только 4 входящих клиентов, поэтому они не являются хорошими автономными серверами., @dandavis

dandavis --> каким должен быть мой подход к завершению моего проекта. Надеюсь, видение моего проекта ясно. Не будет. узлов, @Rohit Mathur

Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что ОП действительно просто хочет, чтобы кто-то написал для него код., @Code Gorilla


2 ответа


1

Я согласен с большей частью комментария Look Alterno. Итак, здесь это объясняется более подробно.

На каждом ESP работает веб-сервер. Каждый ESP будет обрабатывать

  • ПОЛУЧИТЬ /root/status
  • POST /root/change?device=x,state=y

Когда клиент запрашивает /root/status, будет отображаться информация о каждом ретрансляторе, управляемом устройством. Для спутниковых ESP это будет означать отображение данных в реальном времени, а для центрального — отображение последнего известного состояния (в это время он также может запросить обновление). Если вы используете массив, представить эту информацию будет довольно просто.

Когда клиент публикует изменения на устройстве, спутниковые ESP изменяют состояние ретрансляции, а центральный ESP пересылает сообщение на спутник. Возможно, он также должен запросить обновление статуса, чтобы убедиться, что изменение произошло.

Если вы избегаете жесткого кодирования и используете массивы, а не переменную1, переменную2, переменную3, вы сможете сделать это расширяемым. Самая большая проблема, с которой вы столкнетесь, — это регистрация спутников на центральном устройстве, но пока вы можете обойти это, добавив страницу настройки с HTML-формой, которая позволяла вам ввести IP-адрес центрального устройства и ввести имя спутник и название вещей, связанных с реле.

Лично я бы не стал использовать веб-сервер для ПК, да, он дает вам больше вычислительной мощности, но я не думаю, что вам это действительно нужно для этого, я был удивлен, насколько они хороши. Если у вас есть проблемы, попробуйте использовать ESP32 вместо ESP8266 для центрального узла.

Надеюсь, это поможет

,

не могли бы вы поделиться некоторыми ссылками, чтобы я мог узнать, как этого добиться? Мне всего 14. Я мало что знаю о программировании, @Rohit Mathur

www.w3schools.com/html будет лучшим местом для начала. Вы уже знаете, как преобразовать html-файл в строку, вы уже сделали это. Посмотрите на формы для публикации примеров, и GET — это значение по умолчанию, которое вы знаете, как это сделать., @Code Gorilla

Code Gorilla --> я выучил html. Я знаю о методе GET & POST для html-формы. Но я не могу сделать вывод, чтобы реализовать эту вещь в моем проекте., @Rohit Mathur

Смотри, Alterno --> Я изучаю MQTT с того времени, как ты предложил. Кажется, это здорово. Надеюсь, это приведет меня к решению, которого я жду. Любые соответствующие ссылки или учебные пособия будут высоко оценены, @Rohit Mathur

Также я нашел отличный визуальный инструмент "Node-Red". Я считаю, что Node-Red, MQTT, Esp8266 удовлетворят мои потребности. Поправьте меня, если я ошибаюсь, @Rohit Mathur

Посмотрите Alterno --> MQTT - отличная вещь, но становится необходимым использовать стороннего брокера. Так что это определенно не моя чашка чая. Я хочу построить систему без участия третьих лиц, @Rohit Mathur

@RohitMathur - вы уже реализовали обработчик GET в коде, который вы разместили выше. Обработчик для POST очень похож, и существует множество примеров. Или вы просите меня сделать это для вас?, @Code Gorilla

@CodeGorilla --> это было бы приятно: P, помогите мне с кодом, пожалуйста. я никуда не иду, чтобы реализовать эти методы., @Rohit Mathur

Это то, на что ты меня направлял? HTTP-клиент http; http.begin("IP клиента ESP"); http.addHeader("Content-Type", "text/plain"); int httpCode = http.POST("Сообщение от esp8266"); Полезная нагрузка строки = http.getString(); http.конец();, @Rohit Mathur


-1
#include<ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
String i;
long newvar;
String httpurl;
String TheHiddenAnswerOfClient;
HTTPClient http;
String SendWithAnswer(String IPcache, String monmessagecache)
{
  httpurl = "http://";
  httpurl += IPcache;
  httpurl += monmessagecache;
  http.begin(httpurl);
  http.GET();
  TheHiddenAnswerOfClient = (http.getString());
  http.end();
  return TheHiddenAnswerOfClient;
}


void setup() {
  // поместите сюда код установки для однократного запуска:
  i = "";
  newvar = 0;
  Serial.begin(9600);
  WiFi.disconnect();
  delay(3000);
  Serial.println("START");
  WiFi.begin("electromodule", "electromodule@456");
  while ((!(WiFi.status() == WL_CONNECTED)))
  {
    delay(300);
    Serial.print("..");
  }
  Serial.println("Connected");
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  i = (SendWithAnswer("192.168.0.2", "YES"));
  Serial.println("Before Clear");
  Serial.println(i);
  i.remove(0, 25);
  i.remove(i.length() - 11, 11);
  Serial.println("After clear");
  Serial.println(i);
  newvar = i.toInt();
  Serial.println((2000 + newvar));
}
,

Это код для стороны клиента. IP-адрес сервера будет указан в коде, чтобы сервер и клиент были подключены. Также включите файл заголовка клиента в программу., @shubhangi agarwal