• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Прошу помочь передать переменную по wifi от одного esp8266 к другому

Alf123

New member
Есть 2 платы Wemos D1 mini с ESP8266. Задача, задать на одном ESP переменную, и передать ее на второй ESP напрямую, без облака и без роутера. Работаю в Arduino IDE (в LUA не разобрался).
Поработал с примерами, что получается:
Создать точку доступа. Получается создать клиента, получить LAN адрес (192.168.4.2) и подключиться к хосту (connected). Получается сделать web сервер, выводить изменения переменной на локальный адрес (192.168.4.1) и управлять выходами из браузера.
Не получается: объединить это и сделать просто передачу переменной от одного esp к другому.
Все примеры на разных библиотеках и мне их тяжело объединить.
Т.е. еще раз задача по типу нажал кнопку на одном, загорелся светодиод на другом.
Прошу кто по опытнее выложить 2 скетча (клиент, сервер) чтобы загрузить в IDE и протестить.
Спасибо!!!
 

inotrom

New member
Т.е. еще раз задача по типу нажал кнопку на одном, загорелся светодиод на другом.
На Soft Ap делаете TCP Socket Server , на клиенте делаете TCP Socket Client, Выбираете порт на сервере и слушаете его. При входящем коннекте к Soft Ap, отправляете на клиент обратно статус (это если нужно). Готово. При изменении на клиенте состояния пина (вашей переменной), отправяете Soft Ap ее значение. Профит. Можно вобще на мультикасте делать или на броад каст (но это udp потеряете), и тогда будет у вас соотношение многие к одному (много клиентов, управляют одной переменной).

ЗЫ. Советую не клянчить готовый код на форуме, а то заклеймят нищебродом обделенным умом (да впрочем и задача у вас не особо сложная)
 
Последнее редактирование:

Alf123

New member
inotrom, спасибо за ответ, буду разбираться, но что то тяжело у меня идёт с передачей данных. Пускай заклеймят, но я уперся в эту точку и не сдвинуться, уже очень много время потерял..в этом смысле скетч конечно нужен. А так все равно спасибо.
 

inotrom

New member
Добавлю, если вам необходимо передавать переменную из одного модуля на другой, который при этом имеет веб-морду, то:
1. между модулями сокеты
2. от модуля на веб морду AJAX
2. от модуля на веб морду так же сокеты.

Учитывая что АП, знает всех своих клиентов, вполне разумно, отдать на веб, клиентов, и в браузере уже непосредственно к ним коннектится (слушать) так наверное даже лучше.
 

Alf123

New member
1. между модулями сокеты
2. от модуля на веб морду AJAX
2. от модуля на веб морду так же сокеты.
Вот с правильной организацией сокетов и трудности.
Что касается AJAX это пока мне сложно, сначала разберусь с базовыми вещами..
"...Можно вобще на мультикасте делать или на броад каст (но это udp потеряете)..." - UDP как понимаю для скоростных процессов, мне пока не критично. Мультикаст и броад каст - что имеете ввиду? Давать команду сразу всем или по очереди? Планирую каждого во отдельности опрашивать.

В общем получилось как-то,через вэб протокол , криво пока правда..наоборот, клиент спрашивает, сервер отвечает..завтра переверну.
По итогу переменная My variable записанная строке в первом Esp читается через монитор порта второго Esp (скриншот во вложении).

Точка доступа :

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
void handleRoot() {server.send(200, "text/html", "<h1>I'm connected. My variable!</h1>");}

void setup() {
delay(1000);
Serial.begin(115200);
Serial.println("Configuring access point...");
WiFi.softAP("ALF1", "12345678");
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();
}



Клиент:
#include <ESP8266WiFi.h>
const char* host = "192.168.4.1";

void setup()
{ Serial.begin(115200);
Serial.println();Serial.println("Connecting to ALF1"); // Подключение к точке доступа
WiFi.begin("ALF1", "12345678");
while (WiFi.status() != WL_CONNECTED){delay(500); Serial.print(".");} // Подключено
Serial.println(" connected");}

void loop()
{ WiFiClient client;
Serial.printf("\n[Connecting to %s ... ", host); // Подключение к хосту (та же точка доступа 192.168.4.1)
if (client.connect(host, 80)) {
Serial.println("connected]");Serial.println("[Sending a request]");
client.print(String("GET /") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n");

Serial.println("[Response:]"); // "Ответ:"
while (client.connected())
{if (client.available()){ String line = client.readStringUntil('\n');Serial.println(line);}}
client.stop();Serial.println("\n[Disconnected]");} // "Отключаем на 5 секунд"
else{client.stop();Serial.println("connection failed!]");} // "подключиться не удалось!"
delay(5000);}
 

Вложения

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

Alf123

New member
Спасибо за подсказку, думаю, что это будет полезно.. По крайней мере название painlessMesh вселяет надежду. Хотя к легкому не готовлюсь - первый же скетч/пример с морганием светодиода (PlatformIO: An open source ecosystem for IoT development) с длиной кода на 146 строчек это как китайская грамота для человека, который только начинает осваивать esp. Но за ссылку спасибо, обязательно изучу!!
 

inotrom

New member
с длиной кода на 146 строчек это как китайская грамота для человека, который только начинает осваивать esp.
Вам надо не есп изучать, а технологии ip/tcp и понимать что вам нужно а что нет, в ардуино скетчах извините не разбираюсь, не из вредности а просто не работал с ними.

В sdk есть исчерпывающие функции для работы между модулями, поэтому надобности в ардуино не вижу. Единственно чего там нет - веб сервера, но его соорудить день времени под пивас (http тот же сокет только с определенным портом и заголовком)
 

kab

New member
Есть 2 платы Wemos D1 mini с ESP8266. Задача, задать на одном ESP переменную, и передать ее на второй ESP напрямую, без облака и без роутера. Работаю в Arduino IDE (в LUA не разобрался).
Поработал с примерами, что получается:
Создать точку доступа. Получается создать клиента, получить LAN адрес (192.168.4.2) и подключиться к хосту (connected). Получается сделать web сервер, выводить изменения переменной на локальный адрес (192.168.4.1) и управлять выходами из браузера.
Не получается: объединить это и сделать просто передачу переменной от одного esp к другому.
Все примеры на разных библиотеках и мне их тяжело объединить.
Т.е. еще раз задача по типу нажал кнопку на одном, загорелся светодиод на другом.
Прошу кто по опытнее выложить 2 скетча (клиент, сервер) чтобы загрузить в IDE и протестить.
Спасибо!!!
Здесь Вы написали, что с сервером Вы разобрались. Привожу пример для клиента:

Управление ногами ESP <-> ESP
 
Сверху Снизу