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

Режим WIFI_AP_STA. Поделитесь работающим примером!

Vovka

Member
Доброго времени суток!
Зада такая: ESP12F нужно чтоб работала как точка доступа и как клиент, подключенный к роутеру.
Плюс после обрыва связи с роутером восстанавливать соединение.
Наверное я уже все варианты перепробывал, что есть в интернете!
В голове уже каша...
Пожалуйста, кто может - помогите рабочим кодом! Желающие пофлудить - найдите другую тему...
 

Vovka

Member
Бесплатно делюсь тем, что у меня получилось и работает:

Код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

IPAddress IP (192,168,100,98);
IPAddress IPG(192,168,100,1);

#define AP_SSID    "Test_AP_ESP"
#define AP_PASSW    ""
#define AP_CHANNEL    3

#define STA_LOGIN    "TP-Link\0"
#define STA_PASSW    "12345678\0"

ESP8266WebServer server(80);
bool bSTA = false;

String s;
IPAddress ipAP;

int countC = 0;
bool b1s;
static os_timer_t timer1s;
void timer1s_func()
{
    b1s = true;
}

// как вариант поиска сети
bool findSSID( String name )
{
  Serial.printf("findSSID(%s)", name.c_str() );

    name.toUpperCase();

  int n = WiFi.scanNetworks();
  if ( !n ) {
    Serial.println("no networks found");
    return false;
  }
    Serial.printf("%d networks found\r\n", n);
    String nnn;
    for (int i = 0; i < n; ++i ) {
        nnn = WiFi.SSID(i);
        nnn.toUpperCase();
        Serial.println(nnn);
        if (nnn == name) {
            Serial.printf("%s network found, RSSI: %s\r\n", name.c_str(), WiFi.RSSI(i) );
            return true;
        }
  }
  return false;

}

void setup()
{
    int a;
    Serial.begin(115200);    while (!Serial) delay(10); Serial.println(".");
    for( a=0; a<5; a++ ) { Serial.print("."); delay(1000); }
    Serial.println("\r\nSETUP ");

    // мне больше нравится таймер...
    os_timer_disarm(&timer1s);
    os_timer_setfn(&timer1s, (os_timer_func_t *)&timer1s_func, NULL);
    os_timer_arm(&timer1s, 1000, 1);    // 1000 миллисекунд=1cек, 1 - многократно. 0 -однократно.

    WiFi.disconnect(true);
  WiFi.persistent(false);
  WiFi.setPhyMode(WIFI_PHY_MODE_11G);
  delay(500);

    WiFi.mode(WIFI_AP);

//    uint8_t mac[WL_MAC_ADDR_LENGTH];
 // WiFi.softAPmacAddress(mac);

    WiFi.softAP(AP_SSID, AP_PASSW, AP_CHANNEL );

    ipAP = WiFi.softAPIP();
    s = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' + String(ipAP[3]);
    Serial.printf("AP IP: %s\r\n", s.c_str() );

    server.on("/", []() {
        s = "<!DOCTYPE HTML>\r\n<html><head><meta charset=\"utf-8\"><title>Test_AP_ESP</Title></head>";
        s += "</html>\r\n\r\n -----------";
        server.send(200, "text/html", s);
    });
    server.on("/1", []() {
        s = "<!DOCTYPE HTML>\r\n<html><head><meta charset=\"utf-8\"><title>Test_AP_ESP</Title></head>";
        s += "</html>\r\n\r\n 111111111";
        server.send(200, "text/html", s);
    });
    server.on("/2", []() {
        s = "<!DOCTYPE HTML>\r\n<html><head><meta charset=\"utf-8\"><title>Test_AP_ESP</Title></head>";
        s += "</html>\r\n\r\n 222222";
        server.send(200, "text/html", s);
    });
    server.onNotFound([]() {
        server.send(404, "text/plain", "Not Found\n\n");
  });

    server.begin();

}

void loop()
{
  server.handleClient();

    if( b1s ) { b1s = false;    // прошла 1 секунда
        if( ++countC > 10 ) {    countC = 0;
            if( !bSTA ) {
                WiFi.begin(STA_LOGIN, STA_PASSW);
                if( WiFi.waitForConnectResult() == WL_CONNECTED ) {
                    bSTA = true;
                    WiFi.mode(WIFI_AP_STA); //Dual mode works fine if it is connected to WiFi
//                    WiFi.config( IP, IPG, IPAddress(255, 255, 255, 0));
                    ipAP = WiFi.localIP();
                    s = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' + String(ipAP[3]);
                    Serial.printf("STA connected IP: %s\r\n", s.c_str() );
                }
                else {
                    WiFi.mode(WIFI_AP);
                    wifi_set_channel( AP_CHANNEL );    // не возвращается на канал
                    ipAP = WiFi.softAPIP();
                    s = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' + String(ipAP[3]);
                    Serial.printf("AP connected IP: %s\r\n", s.c_str() );
                }
            }
            else {
                if( WiFi.status() != WL_CONNECTED ) bSTA = false;
                switch( WiFi.status() ) {
                    case WL_IDLE_STATUS:            s="WL_IDLE_STATUS";            break;    //    временный статус. Он возвращается, когда функция WiFi.begin() вызвана и остается активной. Если количество попыток подключения будет исчерпано, этот статус меняется на WL_CONNECT_FAILED, а если соединение будет успешно установлено, то на WL_CONNECTED
                    case WL_NO_SSID_AVAIL:        s="WL_NO_SSID_AVAIL";        break;    //    нет доступных SSID
                    case WL_SCAN_COMPLETED:        s="WL_SCAN_COMPLETED";    break;    //    когда завершено сканирование сетей
                    case WL_CONNECTED:                s="WL_CONNECTED";                break;    //    если соединение с WiFi-сетью успешно установлено
                    case WL_CONNECT_FAILED:        s="WL_CONNECT_FAILED";    break;    //    когда все попытки подключения заканчиваются неуспешно
                    case WL_CONNECTION_LOST:    s="WL_CONNECTION_LOST"; break;    //    если соединение прервано
                    case WL_DISCONNECTED:            s="WL_DISCONNECTED";        break;    //    при отключении от сети
                    default:                                    s="WL_NO_SHIELD";                break;    //    если не подключен WiFi-модуль
                }
                Serial.printf( "Status: %s\r\n", s.c_str() );
            }
        }
    }

}
 

Vovka

Member
Посмотрел...
Код:
// first, connect to STA so we can get a proper local DNS server
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
:unsure:(n)
 

tretyakov_sa

Moderator
Команда форума
Посмотрел...
Код:
// first, connect to STA so we can get a proper local DNS server
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
:unsure:(n)
В примере RangeExtender-NAPT у тебя весь код фактически роутер. С одной стороны есть сеть к которой ты подключаешься. С другой стороны ты организуешm точку доступа.
Добавь к коду то, что тебе нужно веб-сервер датчик или что-то еще и получишь именно то что тебе нужно! Это будет выглядеть так, как будто ты на роутере сделал свое устройство.
Это точный ответ на задачу:
ESP12F нужно чтоб работала как точка доступа и как клиент, подключенный к роутеру.
Плюс после обрыва связи с роутером восстанавливать соединение.
 
Сверху Снизу