• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 нужно чтоб работала как точка доступа и как клиент, подключенный к роутеру.
Плюс после обрыва связи с роутером восстанавливать соединение.
 
Сверху Снизу