ESP8266 - AP_STA mód fagyás(?)

ESP8266, ESP32 chipek és az ESP-xx modulok. Programozási nyelvek, trükkök, hardware tippek.
japeti10
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2017. február 18. szombat, 1:37

ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: japeti10 »

Sziasztok!
Segítségeteket, ötleteiteket várnám..
Egy ESP8266-12E -vel küzdök, Arduino alól. A wifi móddal kapcsolattal ütköztem egy problémába.
Sima AP, vagy STA módban semmi gondom, megy gyönyörűen. Ugyanez van, AP+STA módban is, HA tud
csatlakozni a routerhez.

De ha nem tud (pl kikapcsolom, vagy szándékosan rossz felhasználónévvel próbálom bejelentkeztetni) akkor
az AP módja is lefagy (?), hol elérhető, hol nem. Vagy elkezdi küldeni az indexoldalt, felénél abbahagyja.
Vagy simán megszakad a kapcsolat, de egy frissítésre már megint jó..
Mihelyt visszaáll a kapcsolat a routerrel, rendbe jön minden magától.
2 egységem is van, mindkettő ezt produkálja.
Ötlet ?

Köszönöm előre is.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: SanyiSay »

Üdv.
Egy ötlet:
Természetesen a kódodban vagy az ESP modulra általad rászerelt alkatrészekben van a hiba, .
Én ezzel a módszerrel váltogatok AP-STA és STA módok között.
https://sanyisay.gitbooks.io/esp8266/co ... p-sta.html
WiFi.getMode()
WiFi.status()
Ennek a kettőnek az állapotát figyeli és ahhoz képest állítja be az AP-STA vagy AP módot. Ha nézed ezek állapotát és közben teszteled a router leállást és egyéb problémalehetőségeket szépen látszik hogy ebből mit érzékel az ESP, és hol kell beavatkoznod. Így akár több STA pont közül is tudsz választani ha ez szükséges. Abban az esetben ha túl gyakran ellenőrzöd ezeket az állapotokat akkor nem működik a módszer mert nincs ideje átváltani az ESPnek és ugyanaz a hiba áll be amit te leírtál. Ez úgy alakulhat ki ha mondjuk loop ciklusba tesszük a wifi álapot ellenőrzést delay nélkül.

Persze delay használata kerülendő ezért inkább
https://github.com/esp8266/Arduino/tree ... ies/Ticker
amivel wifimód ellenőrzés, ledvillogtatás és egyéb feladatok időzítét megoldom.
Jó esetben ha mindenből az aszinkron lehetőséget választod, és amit írsz az is ebben a szellemben készül akkor a loop() üresen marad. :)

https://github.com/me-no-dev/ESPAsyncWebServer
https://github.com/me-no-dev/ESPAsyncTCP
https://github.com/alanswx/ESPAsyncWiFiManager

Ezek közül egyébként az utolsó lehet jó neked, igaz én nem használtam sokat nem tudok róla.

Így minden futó kódnak van ideje mindenre amellett, hogy nem veszi el a többiek elől a processzort.
ESP sajnos erre elég érzékeny, így akár egy led villogtatással is le tudod fagyasztani.

Persze valószínű hogy ennél egyszerűbben is megoldható a problémád, mert ha nem szeretnéd kikapcsolni az AP módot, akkor magától váltogat az ESP csak legyen bekapcsolva WiFi.setAutoConnect(true);
Mert enélkül STA megszakadása esetén nem kapcsolódik újra a routerhez.

Én mondjuk nem szeretem fixen használni az AP-STA módot semmilyen készüléken, ha már sikeresen csatlakozott egy STA hálózathoz, ezért nincs ilyen mintakódom sem.

Ugyanez röviden.
Írj egy teszt kódot ahol csak a wifi csatlakozási módokat teszteled problémás körülmények között, nézd a WiFi.getMode(), WiFi.status() állapotokat.(router leálás, áramszünet, IP ütközések, hibás ssid, jelszó, stb) Aztán ha az stabil akkor tegyél hozzá mindenfélét vagy illeszd a kész kódodba, mert lehet hogy a kód többi részén van a hiba.
Vagy egyszerűen kicsi a táp, és vagy zavarszűrő, felhúzó hiány, és e miatt instabil az egész.
Sajnos még mindig sokan hisznek abban hogy ESP működtetéséhez elég kb 3.3V, 0mA, alap modult vesznek ESP01-13 és lespórolják a stabil működéshez szükséges alkatrészeket :) A kontakt hiba is gyakori. Minden vezeték megmozgat és már megy is hibátlanul.
japeti10
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2017. február 18. szombat, 1:37

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: japeti10 »

Szia !

Köszönöm a több mint kimerítő választ.
Valóban loop-ban ellenőrzöm a kapcsolat státuszát, ha csatlakozott akkor dyndns.hu-hoz kapcsolódok.
Itt lesz lehet a kutya elásva. Kiveszem próbaképp loop-ból.
Van egy 1 perces Timer-em is, itt hőmérsékletet olvasok.
Kipróbálom majd azt is, hogy ide teszem be ezt az ellenőrzést.
Nem tudom, lehet e esetleg az "OnConnect"-ra valami megszakítást/eseményt ráhúzni.
(2 hete foglalkozok Arduino-val)

A WiFi.setAutoConnect nekem false-ra van állítva, nem akarom, hogy maga döntsön, az user
beállításainak megfelelő módban indul az eszköz. De ezt is bekapcsolom, meglátom hogy reagál.

A táp 5V@2A-os, zavarszűrő,100n+100uF tantál, 1117-3.3v, 100n+100uF tantál.
Ennek az eszköznek szerintem ez elégséges. 120mA-ert mérek nyugalmi állapotban,
310mA volt a csúcs. A mérés nem tökéletes, mert 1117 előtt mértem.
Esetleg 1117 után ráteszek még 2200uF-ot, és megmérem mennyire esik le a táp adáskor.

Mindenképp visszajelzek, mi lett.
Köszönöm.
japeti10
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2017. február 18. szombat, 1:37

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: japeti10 »

Szia !
No' kiszedtem loop-ból az "állapotlekérdezést" de a jelenség megmaradt :(
Ha még esetleg segítenél..Készítettem egy egyszerűbb programot, ime:

Kód: Egész kijelölése

#include <ESP8266WiFi.h>
#include <Ticker.h>
Ticker flipper;
String Statuses[] = { "WL_IDLE_STATUS=0", "WL_NO_SSID_AVAIL=1", "WL_SCAN_COMPLETED=2", "WL_CONNECTED=3", "WL_CONNECT_FAILED=4", "WL_CONNECTION_LOST=5", "WL_DISCONNECTED=6"};
String Modes[] = {"WIFI_OFF=0", "WIFI_STA=1", "WIFI_AP=2", "WIFI_AP_STA=3"};
const char* SSID = "x";
const char* PASS = "y";

void getstate(){
Serial.println("");
Serial.println( Modes[WiFi.getMode()]);
Serial.println(Statuses[WiFi.status()]);
Serial.println("Local IP: " + WiFi.localIP().toString()); 
Serial.println("AP IP: " + WiFi.softAPIP().toString());
}

void setup() {
 Serial.begin(115200);  while (!Serial) {}
 WiFi.setAutoConnect(true);
 WiFi.mode(WIFI_AP_STA);
 WiFi.begin( SSID, PASS);
 flipper.attach(5, getstate);
 getstate();
}
Valóban szépen látni a getmode, és a local IP-n, hogy megy tönkre a kapcsolat a routerrel.
Először DISCONNECT, majd NOAVAIL, és 0.0.0.0 lesz az IP. Viszakapcsoláskor FAIL, COMPLETE, majd kapok IP-t.
Ez így frankó, tudom mikor "esünk össze".

Viszont hogy oldjam meg, hogy lehetőleg mindig visszaáljon AP+STA-ba ?
Mondjuk 1 percenként megnézem van e kapcsolat és IP cím, ha nincs átkapcsolom AP módba. Ez eddig OK.
És vissza hogyan? Ahhoz megint be kellene kapcsolnom AP+STA-ba, és megnéznem csatlakozik e, kap e IP-t.
De ettől megint lemerevedik. Vagy teljesen rossz a megközelítésem ?

Köszönöm.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: SanyiSay »

Akkor most neked az kell ha jól értem, sikertelen STA kapcsolat esetén álljon át AP módra, és néha próbálja az STA módot?
Hu ez jó nagy katyvasznak hangzik. Erre nem lenne elég simán az AP-STA mód? Arra az időre kár kikapcsolni az STA módot ameddig AP módban tud csak csatlakozni. Aztán meg visszakapcsolgatni mikor ezt megteszi helyetted az ESP automatikusan.
Ha nem szeretnéd hogy STA módban csatlakozzon csak ki kell kapcsolni a AutoConnect-et.

Amúgy sima AP módról STA módba váltásnál ki kell kapcsolni az AP módot mert különben nem vált át AP-STA vagy STA módba.
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_OFF);
WiFi.disconnect();
Ezekkel lehet.

Minta kódodban csak az ellenőrzéseket vettél ki a loop ból azoknak mindegy, csak ha beavatkozol a wifikapcsolatba akkor nem mindegy hogy mikor teszed.

AP-STA mód használata ahogy én látom:
- mindkét mód paramtéreinek beállítása
- kicsit nem árt várakozni hogy sikeres e a csatlakozás

Ez a minta nálam stabilan tartja az AP kapcsolatot ha hibás STA jelszót adok neki.

Kód: Egész kijelölése

#include <ESP8266WiFi.h>

#define STA_SSID  "xxxx"
#define STA_PASS  "xxxxxxxx"
#define AP_SSID  "esp"
#define AP_PASS  "12345678"

void WifiData();


void setup() {
	Serial.begin(115200);
	delay(10);
	Serial.print(F("\n\n"));
	Serial.print(F("ESP STA teszt\n\n"));
	Serial.print(F("Wifi csatlakozás: ->"));

	// előzőleg esetleg beragadt AP mód törlése
	WiFi.mode(WIFI_OFF);
	WiFi.disconnect();
	// automatikus STA csatlakozás bekapcsolása
	WiFi.setAutoConnect(true);
	delay(100);
	
	WiFi.softAP(AP_SSID, AP_PASS, 4, 0);
	WiFi.begin(STA_SSID, STA_PASS);
	WiFi.mode(WIFI_AP_STA);

	// Csatlakozásra várás. 
	byte b = 0;
	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
		b++;
		if (b > 10) {
			Serial.println(F("Sikertelen STA csatlakozás"));
			break;
		}
	}

	WifiData();
}

void loop() {
	delay(0);
}


void WifiData() {
	Serial.print(F("\n\n"));
	Serial.print(F("\n* Wifi Data ***********************\n"));
	Serial.println(F("* "));
	Serial.print(F("* wifi MODE: "));   // STA = 1 ,  AP = 2, AP_STA = 3
	Serial.println(WiFi.getMode());
	Serial.print(F("* wifi Status: "));   // STA = 3 ,  AP = 6, AP_STA = 5
	Serial.println(WiFi.status());
	Serial.print(F("* Host Name: "));
	Serial.println(WiFi.hostname());
	Serial.print(F("* AutoConnect: "));
	Serial.println(WiFi.getAutoConnect());
	Serial.print(F("* SleepMode: "));
	Serial.println(WiFi.getSleepMode());
	Serial.println(F("* "));
	Serial.print(F("* STA MAC: "));
	Serial.println(WiFi.macAddress());
	Serial.print(F("* STA IP: "));
	Serial.println(WiFi.localIP());
	Serial.print(F("* STA SSID: "));
	Serial.println(WiFi.SSID());
	Serial.print(F("* STA password: "));
	Serial.println(WiFi.psk());
	Serial.print(F("* STA RSSI: ")); // WIFI jel rősség
	Serial.println(WiFi.RSSI());
	Serial.print(F("* STA channel: "));
	Serial.println(WiFi.channel());
	Serial.println(F("* "));
	Serial.print(F("* AP MAC: "));
	Serial.println(WiFi.softAPmacAddress());
	Serial.print(F("* AP localIP: "));
	Serial.println(WiFi.softAPIP());
	Serial.print(F("**********************************\n"));
	WiFi.printDiag(Serial);
}
japeti10
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2017. február 18. szombat, 1:37

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: japeti10 »

Nem jutok előbbre..
Én "csak" annyit szeretnék elérni, hogyha AP_STA módban van az ESP és akármiért megszűnik a kapcsolat a routerrel:
1. Ne faggyon ki az AP oldal.
2. Ha helyreáll a kapcsolat a routerrel, csatlakozzon is vissza hozzá
Jelenleg ez nem működik, AP oldal vagy lehal, vagy belassul, vagy épp semmi gondja.

Átgyúrtam az előző példarészletemet. "Szerencsére" így is ledöglik, tesztelhető. Ha esetleg érzel affinitást a problémával... :wink:
Először próbáld meg helyes ssid/pass-al. Nyist meg a localIP és a 198.168.4.1 címen is valamivel. (én PC-n tesztelem)
Ha a böngésző mindkét ablakában 100x lenyomod F5-öt, akkor 200x helyesen fog működni.
Ha kikapcsolod a routert, vagy rossz pass-ot adsz meg, akkor az AP-s címen 5X működni fog, 5X nagyon lassan, 5X timeout.

Kód: Egész kijelölése

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Ticker.h>
Ticker flipper;
String Statuses[] = { "WL_IDLE_STATUS=0", "WL_NO_SSID_AVAIL=1", "WL_SCAN_COMPLETED=2", "WL_CONNECTED=3", "WL_CONNECT_FAILED=4", "WL_CONNECTION_LOST=5", "WL_DISCONNECTED=6"};
String Modes[] = {"WIFI_OFF=0", "WIFI_STA=1", "WIFI_AP=2", "WIFI_AP_STA=3"};
const char* SSID = "x";
const char* PASS = "y";
ESP8266WebServer server(80);

void getstate() {
  Serial.println("");
  Serial.println( Modes[WiFi.getMode()]);
  Serial.println(Statuses[WiFi.status()]);
  Serial.println("Local IP: " + WiFi.localIP().toString());
  Serial.println("AP IP: " + WiFi.softAPIP().toString());
}

void indexhtml() {
  if (server.uri() == "/" ) {
    server.send(200, "text/html", "<!DOCTYPE html><html><head><title>Fejléc</title></head><body>Bla Bla..</body></html>");
    Serial.println("Send index page");
  }
}

void setup() {
  Serial.begin(115200);  while (!Serial) {}
  WiFi.setAutoConnect(true);
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin( SSID, PASS);
  flipper.attach(10, getstate);
  server.on("/", indexhtml);
  server.begin();
//getstate();
}

void loop() {
  server.handleClient();
}
Sajnos nem én vagyok az egyedüli ezzel, ezeket találtam:
https://github.com/esp8266/Arduino/issues/1615
http://bbs.espressif.com/viewtopic.php?t=671
https://github.com/esp8266/Arduino/issues/1624
Nem tudom belinkelni, de leírva láttam, hogy ilyen, nincs megoldása.
(Mondjuk nehezen hiszem)
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: SanyiSay »

Az én kódom teszteltem mert abban van pár dolog amit te kihagytál, de beletettem a szervered. Csatlakoztam egy böngészővel routeren keresztül, és egy másikkal ESP AP -n keresztül.
Miután megszakadt az STA kapcsolat (router kikapcs madj bekapcs) nem szakította meg az AP kapcsolatot az ESP. És amikor visszaállt akkor sem. Legalább is 2x teszteltem abban nem volt hiba.
Nálam annyi volt a probléma hogy router kikapcsolása után az AP-n elért weboldal sűrű frissítgetése közben WDT resetet hozott össze, de ez egyéb probléma.

Te kódodban az AP mód paraméterei hiányoznak, és a mód törlése és újra beállítása.

Kód: Egész kijelölése

   // előzőleg esetleg beragadt AP mód törlése
   WiFi.mode(WIFI_OFF);
   WiFi.disconnect();
   // automatikus STA csatlakozás bekapcsolása
   WiFi.setAutoConnect(true);
   delay(100);
   
   WiFi.softAP(AP_SSID, AP_PASS, 4, 0);
   WiFi.begin(STA_SSID, STA_PASS);
   WiFi.mode(WIFI_AP_STA);
Ami nekem fura, mert ugyan elmenti az ESP ezeket de felül is írhatja és ez is okozhat gubancot talán. Legalább is én jobban szeretem az elején beállítani a dolgokat és nem az automatikára bízni. Persze aztán lehet ennek semmi hatása nincs az egészre, de egy próbát megér.

Szerencsére AP módot nem igen használom max STA kapcsolat beállításra így ez a probléma nem igen merült fel eddig.
japeti10
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2017. február 18. szombat, 1:37

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: japeti10 »

(köszönöm, hogy kínlódsz..)
A kapcsolat nem szakad meg egyszer sem, félreérjük egymást. WiFi listában is ott az eszköz mindig.
Kikapcsolt routernél az AP oldalra "nem jön át" az index oldal (vagy hogy írjam ezt..)
Lehet már pofátlanság - de az én kódommal teszteld, látni fogod.
A 192.168.4.1 átlagos ping ideje is megnő rendesen ~20ms helyett ~170ms.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: SanyiSay »

Ha az én kódomban megvan az Index oldal AP és STA módban is, AP módban akkor is ha épp elveszett az STA kapcsolat. Akkor miért kellene a te kódodat tesztelni?
japeti10
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2017. február 18. szombat, 1:37

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: japeti10 »

OK, jó így. Nagyon köszönöm a segítségedet !!!
Jegelem a dolgot, alszok rá párat. Vagy megoldom - nem lesz AP_STA mód a kütyün :(
q1900dc
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2017. február 2. csütörtök, 18:26

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: q1900dc »

SanyiSay írta:Akkor most neked az kell ha jól értem, sikertelen STA kapcsolat esetén álljon át AP módra, és néha próbálja az STA módot?
Hu ez jó nagy katyvasznak hangzik. Erre nem lenne elég simán az AP-STA mód? Arra az időre kár kikapcsolni az STA módot ameddig AP módban tud csak csatlakozni. Aztán meg visszakapcsolgatni mikor ezt megteszi helyetted az ESP automatikusan.
Ha nem szeretnéd hogy STA módban csatlakozzon csak ki kell kapcsolni a AutoConnect-et.

Amúgy sima AP módról STA módba váltásnál ki kell kapcsolni az AP módot mert különben nem vált át AP-STA vagy STA módba.
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_OFF);
WiFi.disconnect();
Ezekkel lehet.

Minta kódodban csak az ellenőrzéseket vettél ki a loop ból azoknak mindegy, csak ha beavatkozol a wifikapcsolatba akkor nem mindegy hogy mikor teszed.

AP-STA mód használata ahogy én látom:
- mindkét mód paramtéreinek beállítása
- kicsit nem árt várakozni hogy sikeres e a csatlakozás

Ez a minta nálam stabilan tartja az AP kapcsolatot ha hibás STA jelszót adok neki.

Kód: Egész kijelölése

#include <ESP8266WiFi.h>

#define STA_SSID  "xxxx"
#define STA_PASS  "xxxxxxxx"
#define AP_SSID  "esp"
#define AP_PASS  "12345678"

void WifiData();


void setup() {
	Serial.begin(115200);
	delay(10);
	Serial.print(F("\n\n"));
	Serial.print(F("ESP STA teszt\n\n"));
	Serial.print(F("Wifi csatlakozás: ->"));

	// előzőleg esetleg beragadt AP mód törlése
	WiFi.mode(WIFI_OFF);
	WiFi.disconnect();
	// automatikus STA csatlakozás bekapcsolása
	WiFi.setAutoConnect(true);
	delay(100);
	
	WiFi.softAP(AP_SSID, AP_PASS, 4, 0);
	WiFi.begin(STA_SSID, STA_PASS);
	WiFi.mode(WIFI_AP_STA);

	// Csatlakozásra várás. 
	byte b = 0;
	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
		b++;
		if (b > 10) {
			Serial.println(F("Sikertelen STA csatlakozás"));
			break;
		}
	}

	WifiData();
}

void loop() {
	delay(0);
}


void WifiData() {
	Serial.print(F("\n\n"));
	Serial.print(F("\n* Wifi Data ***********************\n"));
	Serial.println(F("* "));
	Serial.print(F("* wifi MODE: "));   // STA = 1 ,  AP = 2, AP_STA = 3
	Serial.println(WiFi.getMode());
	Serial.print(F("* wifi Status: "));   // STA = 3 ,  AP = 6, AP_STA = 5
	Serial.println(WiFi.status());
	Serial.print(F("* Host Name: "));
	Serial.println(WiFi.hostname());
	Serial.print(F("* AutoConnect: "));
	Serial.println(WiFi.getAutoConnect());
	Serial.print(F("* SleepMode: "));
	Serial.println(WiFi.getSleepMode());
	Serial.println(F("* "));
	Serial.print(F("* STA MAC: "));
	Serial.println(WiFi.macAddress());
	Serial.print(F("* STA IP: "));
	Serial.println(WiFi.localIP());
	Serial.print(F("* STA SSID: "));
	Serial.println(WiFi.SSID());
	Serial.print(F("* STA password: "));
	Serial.println(WiFi.psk());
	Serial.print(F("* STA RSSI: ")); // WIFI jel rősség
	Serial.println(WiFi.RSSI());
	Serial.print(F("* STA channel: "));
	Serial.println(WiFi.channel());
	Serial.println(F("* "));
	Serial.print(F("* AP MAC: "));
	Serial.println(WiFi.softAPmacAddress());
	Serial.print(F("* AP localIP: "));
	Serial.println(WiFi.softAPIP());
	Serial.print(F("**********************************\n"));
	WiFi.printDiag(Serial);
}
Szia!

AP módban nem működik a TCP mitől lehet?
STA módban minden szépen megy!

Kód: Egész kijelölése

#include <ESP8266WiFi.h> 
#define MAX_SRV_CLIENTS 1
 
const char* STA_SSID = "TEST"; 
const char* STA_PASS = "12345678"; 
 
IPAddress local_ip = { 192, 168, 1, 20 }; 
IPAddress gateway = { 192, 168, 1, 1 }; 
IPAddress subnet = { 255, 255, 255, 0 }; 
const char* AP_SSID = "TEST2"; 
const char* AP_PASS = "87654321"; 
byte AP_CHANNEL = 10; 

WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];
 
//void WifiData(); 
void STA_AP_STA(); 
void STA_AP_STA_begin(const char* sta_ssid, const char* sta_psk, const char* ap_ssid, const char* ap_psk, byte* ap_channel, IPAddress local_ip, IPAddress *gateway, IPAddress *subnet); 
 //void STA_AP_STA_begin(const char* sta_ssid, const char* sta_psk, const char* ap_ssid, const char* ap_psk, byte* ap_channel); 
 
void setup() { 
Serial1.begin(115200);
  WiFi.begin(STA_SSID,STA_PASS);
  Serial1.print("\nConnecting to "); 
  Serial1.println(STA_SSID);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(STA_SSID);
    while(1) delay(500);
  }
  //start UART and the server
  Serial.begin(115200);
  server.begin();
  server.setNoDelay(true);
  
  Serial1.print("Ready! Use 'telnet ");
  Serial1.print(WiFi.localIP());
  Serial1.println(" 23' to connect");
delay(10); 
//Serial.println("\n\n"); 
//Serial.println("STA AP STA teszt\n\n"); 
// STA_AP_STA_begin(STA_SSID, STA_PASS, AP_SSID, AP_PASS, &AP_CHANNEL, local_ip, &gateway, &subnet); 

  STA_AP_STA_begin(STA_SSID, STA_PASS, AP_SSID, AP_PASS, &AP_CHANNEL); 
} 
 
void loop() { 
STA_AP_STA(); 
//WifiData(); 
delay(3000); 

 uint8_t i;
  //check if there are any new clients
  if (server.hasClient()){
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      //find free/disconnected spot
      if (!serverClients[i] || !serverClients[i].connected()){
        if(serverClients[i]) serverClients[i].stop();
        serverClients[i] = server.available();
        Serial1.print("New client: "); Serial1.print(i);
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //check clients for data
  for(i = 0; i < MAX_SRV_CLIENTS; i++){
    if (serverClients[i] && serverClients[i].connected()){
      if(serverClients[i].available()){
        //get data from the telnet client and push it to the UART
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
      }
    }
  }
  //check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}
 
 
void STA_AP_STA() { 
 // WiFi MODE 
// 
// WIFI_OFF = 0 
// WIFI_STA = 1 
// WIFI_AP = 2 
// WIFI_AP_STA = 3 
 // �tv�lt STA m�dba 
if (WiFi.getMode() == 3 and (WiFi.status() == 3)) { 
  Serial.println("STA M�dra v�lt�s"); 
  WiFi.softAPdisconnect(true); 
  return; 
} 
 // WL_IDLE_STATUS = 0 
// WL_NO_SSID_AVAIL = 1 
// WL_CONNECTED = 3 
// WL_CONNECT_FAILED = 4, 
// WL_DISCONNECTED = 6 
// �tv�lt STA m�dba 
 // STA megszakad�sa eset�n �tv�lt AP-STA m�dba 
if (WiFi.getMode() == 1 and (WiFi.status() == 1)) { 
  Serial.println("AP-STA M�dra v�lt�s"); 
  WiFi.mode(WIFI_AP_STA); 
  return; 
} 
// STA megszakad�sa eset�n �tv�lt AP-STA m�dba 
if ((WiFi.status() == 0)) { 
  Serial.println("AP-STA M�dra v�lt�s"); 
  WiFi.mode(WIFI_AP_STA); 
  return; 
} 
 
} 
 
// wifi csatlakoz�si atatok be�ll�t�sa 
void STA_AP_STA_begin(const char *sta_ssid, const char* sta_psk, const char* ap_ssid, const char* ap_psk, byte* ap_channel)  



//void STA_AP_STA_begin(const char *sta_ssid, const char* sta_psk, const char* ap_ssid, const char* ap_psk, byte* ap_channel, IPAddress local_ip, IPAddress *gateway, IPAddress *subnet) 
{ 
 WiFi.mode(WIFI_OFF); 
WiFi.disconnect(); 
delay(100); 
WiFi.softAP(ap_ssid, ap_psk, *ap_channel, 0); 
WiFi.begin(sta_ssid, sta_psk); 
 // ha 0 a kapott IP akkor marad a dhcp �ltal kiosztott 
if (local_ip[3] != 0) { 
 // WiFi.config(local_ip, *gateway, *subnet); 
//    WiFi.config();
} 
 WiFi.mode(WIFI_STA); 
byte b = 0; 
while (WiFi.status() != WL_CONNECTED) { 
  delay(500); 
  Serial.print("."); 
  // 10 x pr�b�l meg csatlakozni STA m�dba 
  b++; 
  if (b > 10) { 
   Serial.println(F("Sikertelen STA csatlakoz�s")); 
   return; 
  } 
} 
} 
 
void WifiData() { 

  /*
 Serial.print(F("\n\n")); 
Serial.print(F("\n* Wifi Data ***********************\n")); 
 Serial.println(F("* ")); 
 Serial.println(); 
 Serial.println(F("* ")); 
 Serial.print(F("* wifi MODE: ")); 
// WIFI_OFF = 0 
// WIFI_STA = 1 
// WIFI_AP = 2 
// WIFI_AP_STA = 3 
Serial.println(WiFi.getMode()); 
 Serial.print(F("* wifi Status: ")); 
// WL_IDLE_STATUS = 0 
// WL_NO_SSID_AVAIL = 1 
// WL_CONNECTED = 3 
// WL_CONNECT_FAILED = 4, 
// WL_DISCONNECTED = 6 
Serial.println(WiFi.status()); 
 Serial.print(F("* Host Name: ")); 
Serial.println(WiFi.hostname()); 
 Serial.print(F("* AutoConnect: ")); 
Serial.println(WiFi.getAutoConnect()); 
 Serial.print(F("* SleepMode: ")); 
Serial.println(WiFi.getSleepMode()); 
 Serial.println(F("* ")); 
 Serial.print(F("* STA MAC: ")); 
Serial.println(WiFi.macAddress()); 
 Serial.print(F("* AutoConnect(): ")); 
Serial.println(WiFi.getAutoConnect()); 
 Serial.print(F("* STA IP: ")); 
Serial.println(WiFi.localIP()); 
 Serial.print(F("* STA SSID: ")); 
Serial.println(WiFi.SSID()); 
 Serial.print(F("* STA password: ")); 
Serial.println(WiFi.psk()); 
 Serial.print(F("* STA RSSI: ")); // WIFI jel r�ss�g 
Serial.println(WiFi.RSSI()); 
 Serial.print(F("* STA channel: ")); 
Serial.println(WiFi.channel()); 
 Serial.println(F("* ")); 
 Serial.print(F("* AP MAC: ")); 
Serial.println(WiFi.softAPmacAddress()); 
 Serial.print(F("* AP localIP: ")); 
Serial.println(WiFi.softAPIP()); 
 Serial.print(F("**********************************\n")); 
 */
WiFi.printDiag(Serial); 
} 
 



q1900dc
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2017. február 2. csütörtök, 18:26

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: q1900dc »

japeti10 írta:Sziasztok!
Segítségeteket, ötleteiteket várnám..
Egy ESP8266-12E -vel küzdök, Arduino alól. A wifi móddal kapcsolattal ütköztem egy problémába.
Sima AP, vagy STA módban semmi gondom, megy gyönyörűen. Ugyanez van, AP+STA módban is, HA tud
csatlakozni a routerhez.

De ha nem tud (pl kikapcsolom, vagy szándékosan rossz felhasználónévvel próbálom bejelentkeztetni) akkor
az AP módja is lefagy (?), hol elérhető, hol nem. Vagy elkezdi küldeni az indexoldalt, felénél abbahagyja.
Vagy simán megszakad a kapcsolat, de egy frissítésre már megint jó..
Mihelyt visszaáll a kapcsolat a routerrel, rendbe jön minden magától.
2 egységem is van, mindkettő ezt produkálja.
Ötlet ?

Köszönöm előre is.
Milyen flash verziót használsz eben milyen modulok vannak bekapcsolva?

https://nodemcu-build.com

Min javasolt alap módulok; bit, file, GPIO, net, node, timer, UART, WiFi.

módok: master, debug
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: SanyiSay »

q1900dc írta: Milyen flash verziót használsz eben milyen modulok vannak bekapcsolva?
https://github.com/esp8266/Arduino

Mi ebből építkezünk.
Arduino nem Lua.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: SanyiSay »

AP módban nem működik a TCP mitől lehet?
STA módban minden szépen megy!
Látod lehet csak sorokat is idézni. :)

Hát próbáltam életre kelteni a kódod de az az igazság hogy TCP kapcsolatot így nem használom. Erről nem tudok mit mondani.
Már ezt a szervert sem használom nagyon régóta így még ez az irány sincs meg.
A kódban amit betettél és módosítottál viszont vannak érdekességek felesleges dolgok.

Setup ba betetted ezt ami felesleges.

Kód: Egész kijelölése

  WiFi.begin(STA_SSID,STA_PASS);
  Serial1.print("\nConnecting to "); 
  Serial1.println(STA_SSID);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(STA_SSID);
    while(1) delay(500);
  }
mert ott van ez

Kód: Egész kijelölése

STA_AP_STA_begin()
valamint ez

Kód: Egész kijelölése

STA_AP_STA();
Ami gond lehet tippem szerint, hogy mivel a szerver Loop ban van, és ott pedig benne csücsül a delay(3000) ami nagyon nem szerencsés.
Ezt lehet kiváltani Ticker.h használatával. de eleinte elég ha kiveszed, lehet nem is fagy le. vagy csak ritkán de teszteléshez megfelelő.
mindezek után tesztelni hogy mindez fut e az általad használt TCP kapcsolattal.
q1900dc
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2017. február 2. csütörtök, 18:26

Re: ESP8266 - AP_STA mód fagyás(?)

Hozzászólás Szerző: q1900dc »

SanyiSay írta:
AP módban nem működik a TCP mitől lehet?
STA módban minden szépen megy!
Látod lehet csak sorokat is idézni. :)

Hát próbáltam életre kelteni a kódod de az az igazság hogy TCP kapcsolatot így nem használom. Erről nem tudok mit mondani.
Már ezt a szervert sem használom nagyon régóta így még ez az irány sincs meg.
A kódban amit betettél és módosítottál viszont vannak érdekességek felesleges dolgok.

Setup ba betetted ezt ami felesleges.

Kód: Egész kijelölése

  WiFi.begin(STA_SSID,STA_PASS);
  Serial1.print("\nConnecting to "); 
  Serial1.println(STA_SSID);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(STA_SSID);
    while(1) delay(500);
  }
mert ott van ez

Kód: Egész kijelölése

STA_AP_STA_begin()
valamint ez

Kód: Egész kijelölése

STA_AP_STA();
Ami gond lehet tippem szerint, hogy mivel a szerver Loop ban van, és ott pedig benne csücsül a delay(3000) ami nagyon nem szerencsés.
Ezt lehet kiváltani Ticker.h használatával. de eleinte elég ha kiveszed, lehet nem is fagy le. vagy csak ritkán de teszteléshez megfelelő.
mindezek után tesztelni hogy mindez fut e az általad használt TCP kapcsolattal.
Szia!
Szeretném használni amit nagyon jól kigondoltál sta/ap automatikus váltás!
A tcp rész ami csak ap módban nem működik:
https://github.com/esp8266/Arduino/blob ... Serial.ino
Csak AP modban TCP nem megy!

Kód: Egész kijelölése


#include <ESP8266WiFi.h> 

#define MAX_SRV_CLIENTS 1

const char* AP_SSID = "ESP_Test"; 
const char* AP_PASS = "87654321"; 
WiFiServer server(502);
WiFiClient serverClients[MAX_SRV_CLIENTS];
 
//byte AP_CHANNEL = 10; 

//void WifiData(); 

void setup() { 

  Serial1.begin(115200);
  WiFi.begin(AP_SSID, AP_PASS);

Serial1.begin(115200);
 
  Serial1.print("\nConnecting to ");
  Serial1.println(AP_SSID);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial1.print("Could not connect to"); Serial1.println(AP_SSID);
    while(1) delay(500);
  }
  //start UART and the server
  Serial.begin(19200);
  server.begin();
  server.setNoDelay(true);
  
  Serial1.print("Ready! Use 'telnet ");
  Serial1.print(WiFi.localIP());
  Serial1.println(" 23' to connect");
    

  
 
delay(10); 
Serial.println(F("\n\n")); 
Serial.println(F("ESP AP SSID v�lt�s teszt\n\n")); 

 
// El�z�leg csatlakoztatott AP m�d felf�ggeszt�se 
WiFi.mode(WIFI_OFF); 
WiFi.disconnect(); 
delay(100); 
 //  WIFI APm�d be�ll�t�sa 
WiFi.mode(WIFI_AP); 
//WiFi.softAP(AP_SSID, AP_PASS, 4); 

WiFi.softAP(AP_SSID, AP_PASS); 

 // wifi adatok ki�r�sa 
//WifiData(); 
 Serial.println(F("\n\n")); 
Serial.println(F("Serialon k�ld�tt string lesz az �j ESP AP SSID")); 
} 
void loop() { 

  uint8_t i;
  //check if there are any new clients
  if (server.hasClient()){
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      //find free/disconnected spot
      if (!serverClients[i] || !serverClients[i].connected()){
        if(serverClients[i]) serverClients[i].stop();
        serverClients[i] = server.available();
        Serial1.print("New client: "); Serial1.print(i);
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //check clients for data
  for(i = 0; i < MAX_SRV_CLIENTS; i++){
    if (serverClients[i] && serverClients[i].connected()){
      if(serverClients[i].available()){
        //get data from the telnet client and push it to the UART
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
      }
    }
  }
  //check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }

  
 // soros porton �rkez� string lekezel�se 
if (Serial.available()) { 
  String s = Serial.readString(); 
  Serial.flush(); 
  Serial.println(s); 
  WiFi.mode(WIFI_OFF); 
  WiFi.disconnect(); 
  delay(100); 
  // �j SSID be�ll�t�sa 
  WiFi.mode(WIFI_AP); 
  WiFi.softAP(s.c_str(), AP_PASS); 
 // WiFi.softAP(s.c_str(), AP_PASS, AP_CHANNEL);
  // wifi adatok ki�r�sa 
 // WifiData(); 
} 
}
Válasz küldése