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

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

Paul_B

Member
WiFi.softAPConfig(IPAddress(192, 168, 10, 1), IPAddress(192, 168, 10, 1), IPAddress(255, 255, 255, 0));
Это и так очевидно, вы уверены, что DHCP будет следующие по списку 5 адресов? А если 2-й отключится, а новый подключится, то ему присвоется освободившийся 2-й адрес или новый шестой?
 

Paul_B

Member
в нем часть нужного вам уже сделана - АП+DHCP+HTTP_server (только переписать под себя).
Просмотрел весь файл - ни намека как задать диапазон адресов DHCP для точки доступа.
Идеология такова.
Если нет сети ESP-0, то она создается с адресом 192.168.10.0 и диапазон адресов 192.168.10.1-5. Если есть такая, то станции подключаются к ней. 5-му подключившемуся сообщают, что он должен создать точку доступа ESP-1 с адресом 192.168.10.10 и диапазоном адресов 192.168.10.11-15 и так далее.
 

kab

New member
Ответа от автора, мной процитированного сообщения, не было. Было рассуждение на тему, но не ответ ...
Фёдор, давайте быть добрее друг к другу - ну написал человек что-то не очень подумавши. Что же теперь - вызывать его на "партсобрание" и заставлять прилюдно каятся во всех грехах? А мы сами без греха? И ни когда не ошибаемся в своих постах? Да бог с ним. На ошибку ему указали, а дальше его личное дело...
 

Slacky

Member
Фёдор, давайте быть добрее друг к другу - ну написал человек что-то не очень подумавши. Что же теперь - вызывать его на "партсобрание" и заставлять прилюдно каятся во всех грехах? А мы сами без греха? И ни когда не ошибаемся в своих постах? Да бог с ним. На ошибку ему указали, а дальше его личное дело...
Да я на самом деле без всяких подколок спросил. Ну вдруг есть что-то такое, чего я не знаю. А прочитал всего-лишь рассуждения на эту тему, причем не автора ...
 

gerkimuyda

New member
Просмотрел весь файл - ни намека как задать диапазон адресов DHCP для точки доступа.
Идеология такова.
Если нет сети ESP-0, то она создается с адресом 192.168.10.0 и диапазон адресов 192.168.10.1-5. Если есть такая, то станции подключаются к ней. 5-му подключившемуся сообщают, что он должен создать точку доступа ESP-1 с адресом 192.168.10.10 и диапазоном адресов 192.168.10.11-15 и так далее.
Вы что-то перемудрили. Вам еще надо понять принцип действия tcp/ip сети и маршрутизацию в ней.
По первому вопросу - из ESP8266WiFiAP.cpp мы видим, что диапазон нашего DHCP будет от [inline] ip[3] += 99;[/inline] до [inline]ip[3] += 100;[/inline] Т.е. наш АП имеет ИП 192.168.10.1, остальные модули 192.168.10.100 - 192.168.100.200. (что из этого сеть, а что ip-ишники вы, надеюсь, знаете? (задается маской))
А попытку создать отдельную вайфай сеть, с такими-же ип адресами (вы пишите от 5 до 10, но можно даже такие-же самые, как уже есть) приведут к тому, что у вас будет абсолютно отдельная сеть, никак не связанная с текущей. Делайте в ней что хотите, все-равно пакеты между ними ходить не будут. И помните, что маршрутизировать пакеты ESP не умеют.

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

пс2: ip-адрес не может быть 192.168.10.0 - только от 192.168.10.1 до 192.168.10.254. Значения 192.168.10.0 и 192.168.10.255 в данном случае зарезервированы.
Маска подсети — Википедия

---
Учите матчасть. И любые претензии оставьте пожалуйста при себе. Тут уже был недавно человек, которые требовал готовую прошивку по его хотелкам и нуждам, не пытаясь разобраться сам. После предложения согласовать способ передачи денежных средств за платное исполнение - обиделся и ушел копать видео Третьякова ;) (зы: я не занимаюсь платными проектами для esp8266)
 
Последнее редактирование:

Paul_B

Member
Чем отличаются

WiFiServer server(80); - используется в примере WebServera при подключении к домашней сети

server.begin();
от

ESP8266WebServer server(80); - используется в примере создания точки доступа
server.begin()
 

Paul_B

Member
Учите матчасть. И любые претензии оставьте пожалуйста при себе
Я не высказываю никакие претензии. Задаю вопрос - что не понятно, либо как сделать. Если кто-то знает, хорошо. Вот только не надо меня учить жить и я не скажу куда надо пойти (с).
 

gerkimuyda

New member
Чем отличаются
WiFiServer server(80); - используется в примере WebServera при подключении к домашней сети
от
ESP8266WebServer server(80); - используется в примере создания точки доступа
...hardware\esp8266\2.4.0-rc2\libraries\ESP8266WebServer\src\ESP8266WebServer.cpp
...hardware\esp8266\2.4.0-rc2\libraries\ESP8266WiFi\src\WiFiServer.cpp
https://github.com/esp8266/Arduino/releases/download/2.4.0-rc2/package_esp8266com_index.json
 

Paul_B

Member
...hardware\esp8266\2.4.0-rc2\libraries\ESP8266WebServer\src\ESP8266WebServer.cpp
...hardware\esp8266\2.4.0-rc2\libraries\ESP8266WiFi\src\WiFiServer.cpp
Я, наверное, лаю, что меня не понимают.
Вопрос был - какую лучше использовать библиотеку и в чем отличия конкретных реализаций серверов.
То что это TCP и HTTP тоже не надо говорить. Можно более приземленные сравнения. Мне нужно передачу между IP-адресами в лучшем случае пару цифр
 

kab

New member
Чем отличаются

WiFiServer server(80); - используется в примере WebServera при подключении к домашней сети

server.begin();
от

ESP8266WebServer server(80); - используется в примере создания точки доступа
server.begin()
На этом сайте всё ищется :) Может быть - инфа несколько устарела:

Библиотека WiFi ESP8266 (ESP8266WiFi)
Функции библиотеки WiFi ESP8266 очень схожи с функциями библиотеки для обычного WiFi шилда.

Список отличий:

  • WiFi.mode(m): выбрать режим WIFI_AP (точка доступа), WIFI_STA (клиент), или WIFI_AP_STA (оба режима одновременно).
  • WiFi.softAP(ssid) создает открытую точку доступа
  • WiFi.softAP(ssid, password) создает точку доступа с WPA2-PSK шифрованием, пароль должен быть не менее 8 символов
  • WiFi.macAddress(mac) позволяет получить MAC адрес в режиме клиента
  • WiFi.softAPmacAddress(mac) позволяет получить MAC адрес в режиме точки доступа
  • WiFi.localIP() позволяет получить IP адрес в режиме клиента
  • WiFi.softAPIP() позволяет получить IP адрес в режиме точки доступа
  • WiFi.RSSI() пока не реализована
  • WiFi.printDiag(Serial); выводит диагностическую информацию
  • Класс WiFiUDP поддерживает прием и передачу multicast пакетов в режиме клиента. Для передачи multicast пакета используйте вместо udp.beginPacket(addr, port)функцию udp.beginPacketMulticast(addr, port, WiFi.localIP()). Когда вы ожидаете multicast пакеты, используйте вместо udp.begin(port) функцию udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port). Вы можете использовать udp.destinationIP() для определения того, был ли пакет отправлен на multicast адрес или предназначался именно вам. Multicast функции не поддерживаются в режиме точки доступа.
WiFiServer, WiFiClient, и WiFiUDP работаю точно так же, как и с библиотекой обычного WiFi шилда. Четыре примера идет в комплекте с этой библиотекой.
Это на:
https://esp8266.ru/arduino-ide-esp8266/
 

Сергей_Ф

Moderator
Команда форума
не вам меня учить, я свой первый компьютер спаял на коленке в 1991 году - Пентагон-48,
Вы меня удивить хотите? Про РК-86 слышали? Пентагон и Ленинград у меня уже после были ;)
Если умный такой
Вроде, я с вами на брудершафт не пил.

Не советую продолжать в том же духе. Это уже как модератор говорю.
 

Paul_B

Member
Итак, поэкспериментировал. Пока только с одной ESP.
Может работать одновременно в режиме точки доступа - тогда при подключении к точке доступа через ноутбук и/или телефона все прекрасно управляется через адрес точки доступа (в моем случае 192.168.10.1 - путем подачи управляющего запроса http://192.168.10.1/gpio/5/1) и в режиме сервера в домашней сети - тогда тоже прекрасно управляется через ноутбук в домашней сети через адрес 192.168.1.73 путем отсылания команды вида http://192.168.73.1/gpio/5/1
Причем если ноутбук сразу может "стрелять с двух рук", т.е. отправлять команды по двум IP-адресам, поскольку по LAN сидит в домашней сети, а по WiFi - к дочке доступа ESP, то телефону надо переподключаться между WiFi сетями.
Причем вначале не работало в домашней сети, т.к. выставлял параметр для точки доступа WiFi.mode(WIFI_AP), а для домашней сети WiFi.mode(WIFI_STA). Выставил WiFi.mode(WIFI_AP_STA); и все заработало.

Осталось разобраться как слать команды между разными ESP.
 
Последнее редактирование:

Paul_B

Member
Тут идея пришла. Раз каждый модуль может управляться как через "отца", т.е. к кому от подключен, так и от "сына", т.е. кто к нему подключен, то при условии разброса модулей по большой площади организовать связь так, чтобы сеть покрывала всю площадь и каждый мог общаться с каждым...
Никто не думал в этом направлении?
 

Сергей_Ф

Moderator
Команда форума
@Paul_B отлично. Теперь осталось вернуться на пару страниц назад и прочитать, что вам уже советовали.

Ключевое слово mesh.
 
Последнее редактирование:

Paul_B

Member
Дурацкий вопрос задам...
Есть две ESP, одна - точка доступа, вторая - станция на этой точке доступа. На обоих установлены серверы. Понятно, что каждая из них знает свой адрес через функции WiFi.localIP() для станции и WiFi.softAPIP () для точки доступа.
Предположим я не задаю статического адреса для точки доступа и не знаю какой он. Как станции узнать IP адрес точки доступа (он же шлюз для станции), а точке доступа IP адрес подключенной станции, чтобы начать двустороннее общение?
 

gerkimuyda

New member
...знает свой адрес через функции WiFi.localIP()
для станции...
Как станции узнать IP адрес точки доступа (он же шлюз для станции)
Наверное WiFi.gatewayIP(); ?

Раньше я учил вас ковыряться в файлах библиотек.
Сейчас опять надо это сделать с файлом user_interface.h - найдите его и изучите все функции, имя которых начинается на wifi_softap_

И зачем вам выданные ИП, подключенные к АП ? Не всё, что подключено к АП - есть модули ESP!!!
Учите нужные модули самим регистрироваться на сервере (а сервер - помнить, кто у него в подопечных), а на не нужные подключения - не обращайте внимание (среди них - ваш телефон). И по ИП подключенного модуля вы не определите, что он умеет и какую функцию выполняет. Все уже было подробно описано для вас ранее, перечитайте еще раз тему.

А пока - вы в том файле как раз найдете еще одни строчки, которые вас очень интересуют:
Код:
struct softap_config {
    uint8 ssid[32];
    uint8 password[64];
    uint8 ssid_len;    // Note: Recommend to set it according to your ssid
    uint8 channel;    // Note: support 1 ~ 13
    AUTH_MODE authmode;    // Note: Don't support AUTH_WEP in softAP mode.
    uint8 ssid_hidden;    // Note: default 0
    uint8 max_connection;    // Note: default 4, max 4
    uint16 beacon_interval;    // Note: support 100 ~ 60000 ms, default 100
};

bool wifi_softap_set_config(struct softap_config *config);

struct dhcps_lease {
    bool enable;
    struct ip_addr start_ip;
    struct ip_addr end_ip;
};

uint8 wifi_softap_get_station_num(void);
bool wifi_softap_dhcps_start(void);
bool wifi_softap_dhcps_stop(void);
bool wifi_softap_set_dhcps_lease(struct dhcps_lease *please);
 
Последнее редактирование:

Paul_B

Member
Учите нужные модули самим регистрироваться на сервере (а сервер - помнить, кто у него в подопечных), а на не нужные подключения - не обращайте внимание (среди них - ваш телефон)
Модуль понятно как подключается к AP (он знает имя, к которому надо подключиться). Я-то, конечно, знаю IP адрес точки, но не хочу его явно прописывать при отправке сообщения от станции на сервер, который реализован на точке доступа. Можно пример (без ковыряния *.h файлов, в коих я пока не очень много понимаю) какое сообщение послать серверу на AP со станции при регистрации? Или как AP автоматом направить сообщение на сервер станции при подключении к AP.
 

Paul_B

Member
Опять прошу помощи уважаемых Гуру. Почему-то некорректно работают фрагменты кодов из примеров. Есть точка доступа, на ней запущен TCP-сервер, к серверу подключается клиент и отсылает на сервер свой IP адрес и ChipID, это до сервера доходит, на что в ответ сервер посылает свой ChipID и и вот этот ответ до клиента не доходит.
Вот как реализована посылка от клиента к серверу и обработка ожидания ответа:
Код:
........
 IPAddress UP_ip; 
 WiFi.mode(WIFI_STA);
//подключение к точке доступа
 WiFi.begin(S_ssid, S_password);

while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
Serial.println("WiFi connected");
         
// после подключения в точке доступа на станции тоже организуем сервер
server.begin();
STA_ip=WiFi.localIP();
UP_ip=WiFi.gatewayIP(); 
//посылаем на точку доступа свой IP и ChipID
Send(UP_ip, 80, "ip_id/"+Print_IP(STA_ip)+"/"+String(ChipID));
 .........
     
String Send(IPAddress ip, int port, String Subj)
{
     WiFiClient client;
     if (client.connect(ip, port))
       {
         Serial.println(Subj);
         client.print(Subj+"\r");
         client.flush();
         unsigned long timeout = millis();
         while (client.available() == 0)
           {
           if (millis() - timeout > 5000)
              {
               Serial.println(">>> Client Timeout !");
               client.stop();
               return("");
              }
           }  
          while(client.available())
            {
              String line = client.readStringUntil('\r');
              Serial.print(line);
              return(line);
             }

       }    
     else {
           Serial.println("connection failed");
           return("");
           }
}
А вот как реализовано на точке доступа обработка запроса и ответ

Код:
// фрагмент из loop
 WiFiClient client = server.available();
  if (!client) { 
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  if (req.indexOf("ip_id/") != -1)
    {
     Serial.print("ip/"+Print_IP(AP_ip)+"/id/"+String(ChipID));
     client.print("ip/"+Print_IP(AP_ip)+"/id/"+String(ChipID)+"\r");
     delay(1000);
     client.flush();
     client.stop();
    }
так вот, на точке доступа печатается

new client
ip_id/192.168.10.100/13706470 <--- это то что пришло от клиента
ip/192.168.10.1/id/982175 <--- это то что отправляется в ответ клиенту

А вот на клиенте печатается
ip_id/192.168.10.100/13706470 <---то что отправили на точку доступа
>>> Client Timeout ! <---т.е. ответ от точки доступа не поступает
 
Сверху Снизу