#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() );
}
}
}
}