Заливаем скетчи в ESP8266, управляем каналами по Wi-Fi, создаем свои сети.

kab

New member
Как всегда бывает, мы задаем направление, чтобы человек дальше сам копал ("отсюда и до обеда"(с)анекдот), но людям не это надо! Им надо сразу готовый код! И чтобы даже пароли уже были подставлены от их сети... :D

зы: mesh ведь вроде не позволит параллельно держать связь с домашней сеткой (домашним вайфаем)
Тсссс! Теперь главное не вспугнуть ТС, чтобы он повёлся на этот меш - и мы узнаем много нового и интересного:)
Как анекдот : бабка, подай провод! Ну вот, я же говорил ноль, а все: фаза, фаза !
 

Paul_B

New member
Начнем с этого ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi — Онлайн справочник
Потом это - ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс точки доступа — Онлайн справочник
Кстати, в рассматриваемом примере
Код:
#include <ESP8266WiFi.h>
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.print("Setting soft-AP configuration ... ");
           //  "Задаем настройки программной точки доступа ... "
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
           //  "Готово" : "Задать настройки не удалось"
  Serial.print("Setting soft-AP ... ");
           //  "Настройка программной точки доступа ... "
  Serial.println(WiFi.softAP("ESPsoftAP_01") ? "Ready" : "Failed!");
           //  "Готово" : "Настройка не удалась"
  Serial.print("Soft-AP IP address = ");
           //  "IP-адрес программной точки доступа = "
  Serial.println(WiFi.softAPIP());
}
void loop() {}
у точки доступа ее IP адрес и шлюза разный

IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);

Это как так...? А что выступает в качестве шлюза? Домашняя сеть с адресами 192.168.4.* ?
А как быть, если я хочу чтобы адресация была абсолютно жруой и не пересекалась с домашней. И только ESP, на которой реализована AP изредка входила в домашнюю сеть и давала данные. Кстати, как домашняя сеть будет понимать, что подключилась ESP - через имя DNS периодически опрашивать через HTTP?
 
Последнее редактирование:

gerkimuyda

New member
У вас две сети - ваша домашняя, в которой ESP (одна - главная) будет обычным клиентом (ей будет выдавать ИП ваш роутер.)
И вторая сеть - ваши модули (где ваша главная должна иметь статический ИП и поднять свой DHCP)

Так, давайте не спешить и все по порядку делать. С начала напишите из примеров (в ардуине есть пункт меню examples, где есть примеры для ESP) и прошейте отдельно разные модули:
1. модуль обычного клиента для домашней сети с подключением в сеть.
2. модуль, который выступит в роли SoftAP с поднятым DHCP. Который будет иметь свой ИП (например 192.168.10.1) а раздавать другим будет 192.169.10.11-192.168.10.99 маска 255.255.255.0 gw - свой ип (192.168.10.1)
3. модуль, который будет искать главную AP и подключаться к ней, получать с нее настройки!
4. дописать модуль №2, чтобы поднять на нем http-сервер, обслуживающий входящие запросы. Для начала - просто запросы от других модулей (типа "get /check?from=<chip_id>" или "get /online?from=<chip_id>" или "/register?from=<chip_id>") chip_id вносите сразу, по ним вы потом будете разбираться между модулями, где какой, т.к. ip-адреса у них будут меняться. Можете (если надо) также добавить параметр, чтобы модуль сообщал свою роль (пример "get /register?from=C3E4F2&type=Relay4 (модуль с релюшками на 4 канала)
5. дописать модуль №3, чтобы он регистрировался на главном, с передачей нужных параметров, и чтобы периодически сообщал свой онлайн-статус. Можно схитрить, брать из настроек Gataway и считать его ИП-адресом сервера (впоследствии можно будет легко отделить сервер от главной АП, если понадобится)

когда по отдельности все отработаете и разберетесь - тогда можно объединять ваши наработки в один главный модуль (№1 + №2) и чуть позже добавлять к нему №3 учетом алгоритма создания главной АП, если таковой не найдено.
Потом уже спокойно дальше будете наращивать функционал. Маленькими шажочками. На отдельном модуле обкатываете код, потом его интегрируете в ваш основной на другом модуле.

--
- Помните, из домашней сети вы не будете иметь доступа к сети модулей (ихнему вайфаю). Если надо на период отладки - подключайтесь компом к ихнему вайфаю.
- Из домашней сети можно получить доступ только к главной АП, когда она подключится к вашей сети (и то, если вы http-серверу разрешите следить за всеми запросами, а не ограничите его запросами только из сети 192.168.10.*)
- Маршрутизации между интерфейсами вашего главного модуля не будет! Поэтому шлюз для модулей внутренней сети не нужен, т.к. не будет работать, но через него можно передать "на какой ип слать запросы к серверу"
 
Последнее редактирование:

tretyakov_sa

Moderator
Команда форума
Вы бы начали с постановки задачи. Потому как, через сотню сообщений вы поймете, что это вам не подходит.
ESP может работать в режиме точки доступа и клиента сети.
Для режима AP свои настройки IP, для клиента свои. Причем к AP ESP вы подключите только 5 клиентов, и эти клиенты не могут общаться между собой как клиенты подключенные к роутеру. ESP не может выступить в роли роутера. Так же сети созданные AP и клиентским подключением тоже не могут взаимодействовать между собой.
 

gerkimuyda

New member
Кроме выше написанного, начните с главного - проектировке и обдумыванию всей системы.
Продумайте:
- сколько (с запасом) всего модулей у вас будет
- какие роли у них будут (реле, датчик температуры, управление светодиодом, шаговый двигатель, пищалка)
- как они будут взаимодействовать с сервером (команды)
- как вы ими планируете управлять
- какой будет интерфейс

Вот, посмотрите, как человек подошел к этому вопросу еще на стадии задумки, и постарался все продумать: Описание протокола "Умный дом" - Форум обсуждения оборудования "Умный дом"
 
Последнее редактирование:

Paul_B

New member
У меня нет никакой конкретики. Просто стало интересно реализовать то, что написал. В принципе, понял куда копать.

Чтобы идентифицировать модули буду использовать мас адрес. На том, что реализует АП функции WiFi.macAddress и WiFi.softAPmacAddress дадут одинаковые значения или мас адрес как-то программно присваивается? Или он зашит железно в чипе?
 

gerkimuyda

New member
мак адрес клиента (в вашей домашней сети, режим - STA) формируется из 60:01:94: + CHIP_ID:

Код:
extern "C" {
#include "user_interface.h"
}
  Serial.print( String(system_get_chip_id(), HEX) );
Поэтому я и предлагал по chip_id привязки делать. В режиме SoftAP мак-адрес будет 62:01:94: + CHIP_ID
Получить можно по функции [inline]ESP8266WiFiAPClass::softAPmacAddress();[/inline] и [inline]ESP8266WiFiSTAClass::macAddress();[/inline]
Код:
uint8_t mac[6];
wifi_get_macaddr(SOFTAP_IF, mac);
wifi_get_macaddr(STATION_IF, mac);
Вот пример:
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
extern "C" {
#include "user_interface.h"
}

void setup() {
    Serial.begin(115200);
  Serial.setDebugOutput(true);

Serial.println("Config AP");
WiFi.softAP("ESP_DEMO", "secure");

Serial.println("Set to STA mode");
WiFi.mode(WIFI_STA);

Serial.println("Wifi begin");
WiFi.begin("MYAP", "********");

    uint8_t mac[6];
    char macStr[18] = { 0 };

    wifi_get_macaddr(SOFTAP_IF, mac);
    sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    Serial.println( String("SoftAP mac: ") + macStr );

    wifi_get_macaddr(STATION_IF, mac);
    sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    Serial.println( String("STA mac: ") + macStr );
}

void loop() {
}
 
Последнее редактирование:

nikolz

Well-known member
Информация к размышлению.
Если домашняя сеть на eSP не связана с интернет, то зачем использовать роутер?
Более того, с роутером сеть может быть построена лишь вокруг роутера. т е нельзя удаляться от роутера далеко.
А если роутер кирдык, то и сеть кирдык. Да и установление связи с роутером -процесс не быстрый.
Есть ли принципиально другое решение на ESP без этих недостатков?
Есть!!! Протокол ESP-NOW и сеть на его основе.
 

Paul_B

New member
  • Serial.println("Config AP");
  • WiFi.softAP("ESP_DEMO", "secure");
  • Serial.println("Set to STA mode");
  • WiFi.mode(WIFI_STA);
  • Serial.println("Wifi begin");
  • WiFi.begin("MYAP", "********");
Делается точка доступа, а Myap это что такое?
И как задать диапазон для DHCP для точки доступа. Есть идея как реализовать при количестве станций более 5. скажем, первая точка доступа формируется с параметрами "Esp-A" ее ip 192.168.10.0 диапазон DHCP 192.168.10.1-5. если к точке подключается sta и ее локальный адрес 192.168.1.5 то она создает точку "Esp-B" с адресом 192.168.10.10 и диапазоном DHCP 192.168.10.11_15.
 

Сергей_Ф

Moderator
Команда форума
это не муар, это название точки доступа, My AP - в переводе Моя Точка Доступа.
Дружеский совет, возьмите, а лучше, купите готовое решение. Вам делать (с вашим уровнем подготовки), то что вы хотите, лет 5. Оно вам надо. Не обижайтесь.
Пс. А звёздочки после муара, это не звёздочки, а ваш пароль для доступа в сеть точки доступа.
 

Paul_B

New member
Дружеский совет, возьмите, а лучше, купите готовое решение. Вам делать (с вашим уровнем подготовки), то что вы хотите, лет 5. Оно вам надо.
Мне интересно это сделать. Везде, где в примерах обсуждается точка доступа пишут так:
Код:
if(WiFi.softAP(ESP_ssid, ESP_password) == true)
        {
         ESP_AP=true;
         Serial.println("myESPsoftAP Ready");
                   //  "Готово"
         uint8_t macAddr[6];
         WiFi.softAPmacAddress(macAddr);
         Serial.printf("MAC address = %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);      
         
        }
      else
        {
         ESP_AP=false;
         Serial.println("Failed do AP!");
                   //  "Настроить точку доступа не удалось"
        }
И никаких муаров с вай-фай.моде нет, поэтому я и спросил
Вы уже задали точку доступа этим:
Код:
Serial.println("Config AP");
WiFi.softAP("ESP_DEMO", "secure")
Зачем еще писать это:
Код:
Serial.println("Wifi begin");
WiFi.begin("MYAP", "********");
И лучше бы ответили по существу вопроса, не вам меня учить, я свой первый компьютер спаял на коленке в 1991 году - Пентагон-48, потом было еще куча всего, писал на ассемблере программы по 10000 операторов, а сейчас это хобби. Если умный такой - скажи про диапазоны DHCP
 
Последнее редактирование:

Алексей.

Active member
Есть ли принципиально другое решение на ESP без этих недостатков?
Есть!!! Протокол ESP-NOW и сеть на его основе.
У есп-нау есть свои недостатки (ограничения), пайлоад не более 250 байт, широковещательные сообщения не поддерживаются, разрешенное количество пиров не очень большое.
Если решите использовать, это надо учитывать.
 

gerkimuyda

New member
Если домашняя сеть на eSP не связана с интернет, то зачем использовать роутер?
У ТС домашняя сеть на роутере - это вторая сеть (которая в поле может не иметь подключения, а дома так - для удобства).
И ее статус не будет влиять на доступность основной сети (вайфай между модулями, где один из модулей в режиме АП)

Вы уже задали точку доступа этим:
Код:
Serial.println("Config AP");
WiFi.softAP("ESP_DEMO", "secure")
Зачем еще писать это:
Код:
Serial.println("Wifi begin");
WiFi.begin("MYAP", "********");
Первое - это сеть между модулями (где текущий модуль поднимает АП), второе - это клиент к существующей сети (вашей домашней, где MYAP и **** вам надо заменить на ваш SSID и ваш пароль)
Для АП соответственно ESP_DEMO - это SSID, а secure - пароль, с которым другие модули могут подключаться к нему. Я код не всего скетча привел, а просто набросал пример для проверки МАК-адреса. Естественно DHCP надо отдельно поднимать: How to configure the DHCP server settings? - Everything ESP8266

Код:
void dhcps_lease_test(void) {
   struct dhcps_lease dhcp_lease;
   IP4_ADDR(&dhcp_lease.start_ip, 192, 168, 10, 10);
   IP4_ADDR(&dhcp_lease.end_ip, 192, 168, 10, 15);
   wifi_softap_set_dhcps_lease(&dhcp_lease);
}

void user_init(void) {
   struct ip_info info;
   wifi_set_opmode(STATIONAP_MODE); //Set softAP + station mode
   wifi_softap_dhcps_stop();
   IP4_ADDR(&info.ip, 192, 168, 10, 1);
   IP4_ADDR(&info.gw, 192, 168, 10, 1);
   IP4_ADDR(&info.netmask, 255, 255, 255, 0);
   wifi_set_ip_info(SOFTAP_IF, &info);
   dhcps_lease_test();
   wifi_softap_dhcps_start();
}
Я вам говорил - разбейте общую задачу на маленькие отдельные кусочки, реализуйте их и отладьте, а потом будете собирать потихоньку все в один код. Так будет легче, чем сразу все.
(пс: проверки на подключения (как в коде, который вам чаще попадается в инете) - это отдельные моменты, которые тоже надо добавить как вам надо, проверить и обкатать. Имейте ввиду, часто такие проверки в инете приводятся в неправильном виде - блокирующие всю работу модуля. Вам надо избегать всяких продолжительный delay и циклов while (! connect){}. Для этого надо переработать структуру программы.)
 
Последнее редактирование:

Paul_B

New member
Я вам говорил - разбейте общую задачу на маленькие отдельные кусочки, реализуйте их и отладьте, а потом будете собирать потихоньку все в один код. Так будет легче, чем сразу все.
(пс: проверки на подключения (как в коде, который вам чаще попадается в инете) - это отдельные задачи, которые тоже надо добавить как вам надо и обкатать)
Спасибо, я так и делаю, сейчас хочу нарыть сначала задачки, чтоб потом отлаживать.
Есть 2 ESP-07 и еще 10 в пути.
 

gerkimuyda

New member
Возьмите парочку NodeMCU devboard - легче будет отлаживать на них.
Еще - покапайте OTA и ESPhttpUpdate - чтобы облегчить себе жизнь с обновлениями (если не на данном этапе, так в будущем).
На первое время можете поднять себе на компе http-сервер, к которому будут обращаться модули. На нем обкатать их запросы и ответы для них. Заодно на нем реализовать обновление прошивок.
Когда все будет готово - тогда можно написать сервер уже на модуле, по имеющемуся алгоритму с компа (правда без обновлений).
 

kab

New member
Если умный такой
Я даже удивлялся не раз, какие модераторы терпеливые на этом форуме. Но, всё равно, грубить в доме его хозяину - это очень непредусмотрительно:)
А @Сергей_Ф абсолютно ничего обидного Вам не сказал. Абсолютно тактичный товарищ. Кстати, в 1991 году многие из здесь присутствующих уже занимались интересными и полезными делами - на это давить не надо, ни к лицу...
 

Paul_B

New member
  • void dhcps_lease_test(void) {
  • struct dhcps_lease dhcp_lease;
  • IP4_ADDR(&dhcp_lease.start_ip, 192, 168, 10, 10);
  • IP4_ADDR(&dhcp_lease.end_ip, 192, 168, 10, 15);
  • wifi_softap_set_dhcps_lease(&dhcp_lease);
  • }
  • void user_init(void) {
  • struct ip_info info;
  • wifi_set_opmode(STATIONAP_MODE); //Set softAP + station mode
  • wifi_softap_dhcps_stop();
  • IP4_ADDR(&info.ip, 192, 168, 10, 1);
  • IP4_ADDR(&info.gw, 192, 168, 10, 1);
  • IP4_ADDR(&info.netmask, 255, 255, 255, 0);
  • wifi_set_ip_info(SOFTAP_IF, &info);
  • dhcps_lease_test();
  • wifi_softap_dhcps_start();
  • }
Может надо какую библиотеку подключить? Пишет ошибка компиляции

Arduino: 1.8.5 (Windows 7), Плата:"Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None"

P:\WWW_Server\WWW_Server.ino: In function 'void dhcps_lease_test()':

WWW_Server:301: error: aggregate 'dhcps_lease_test()::dhcps_lease dhcp_lease' has incomplete type and cannot be defined

struct dhcps_lease dhcp_lease;

^

WWW_Server:302: error: 'IP4_ADDR' was not declared in this scope

IP4_ADDR(&dhcp_lease.start_ip, 192, 168, 10, 10);

^

WWW_Server:304: error: 'wifi_softap_set_dhcps_lease' was not declared in this scope

wifi_softap_set_dhcps_lease(&dhcp_lease);

^

P:\WWW_Server\WWW_Server.ino: In function 'void user_init()':

WWW_Server:308: error: aggregate 'user_init()::ip_info info' has incomplete type and cannot be defined

struct ip_info info;

^

WWW_Server:309: error: 'STATIONAP_MODE' was not declared in this scope

wifi_set_opmode(STATIONAP_MODE); //Set softAP + station mode

^

WWW_Server:309: error: 'wifi_set_opmode' was not declared in this scope

wifi_set_opmode(STATIONAP_MODE); //Set softAP + station mode

^

WWW_Server:310: error: 'wifi_softap_dhcps_stop' was not declared in this scope

wifi_softap_dhcps_stop();

^

WWW_Server:311: error: 'IP4_ADDR' was not declared in this scope

IP4_ADDR(&info.ip, 192, 168, 10, 1);

^

WWW_Server:314: error: 'SOFTAP_IF' was not declared in this scope

wifi_set_ip_info(SOFTAP_IF, &info);

^

WWW_Server:314: error: 'wifi_set_ip_info' was not declared in this scope

wifi_set_ip_info(SOFTAP_IF, &info);

^

WWW_Server:316: error: 'wifi_softap_dhcps_start' was not declared in this scope

wifi_softap_dhcps_start();

^

exit status 1
aggregate 'dhcps_lease_test()::dhcps_lease dhcp_lease' has incomplete type and cannot be defined

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

gerkimuyda

New member
Может надо какую библиотеку подключить? Пишет ошибка компиляции
Это был код для SDK, а не для Arduino IDE.
В Ардуине используйте так:
Код:
/**
* set new mode
* @param m WiFiMode_t
*/
  WiFi.mode(WIFI_AP);

/**
* Configure access point
* @param local_ip      access point IP
* @param gateway       gateway IP
* @param subnet        subnet mask
*/
  WiFi.softAPConfig(IPAddress(192, 168, 10, 1),  IPAddress(192, 168, 10, 1),  IPAddress(255, 255, 255, 0));

/**
* Set up an access point
* @param ssid          Pointer to the SSID (max 63 char).
* @param passphrase    (for WPA2 min 8 char, for open use NULL)
* @param channel       WiFi channel number, 1 - 13.
* @param ssid_hidden   Network cloaking (0 = broadcast SSID, 1 = hide SSID)
*/
  WiFi.softAP("SSID","psw");
Вот и пришло время научится вам самому разбираться в нужных функциях! Делаем так:
1.Заходим в подкаталог C:\Users\"имя вашего пользователя в винде"\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\
2.Там делаем поиск файлов содержащих строку "softAPConfig(" и смотрим внутрь этих файлов, чтобы узнать, что данная функция делает, что проверяет, с какими переменными работает.
3.Если надо узнать еще что-то или непонятна некая функция - переходим к пункту №2.

Давайте проверим, попробуйте найти и посмотреть код файла CaptivePortalAdvanced.ino - в нем часть нужного вам уже сделана - АП+DHCP+HTTP_server (только переписать под себя).
 
Сверху Снизу