- Impressum / Datenschutz / ...
- ESP8266 spezifisch
- Codebesprechung
- WiFi.mode für AP und STA richtig anwenden
WiFi.mode für AP und STA richtig anwenden
- VeryPrivat
- Autor
- Offline
- New Member
- ESP ist der Wahnsinn!
15 Feb 2017 09:51 #134
von VeryPrivat
Schade, mit etwas mehr Betreuung der admins könnte dies ein richtig geiles Forum sein...
VeryPrivat erstellte das Thema WiFi.mode für AP und STA richtig anwenden
Nachdem ich im
Raspberry Pi Forum
auf meinen Beitrag (noch?) keine Antwort erhalten habe, hoffe ich, dass mir hier geholfen werden kann:
Ich arbeite gerade daran eine WLAN Fernsteuerung für Funksteckdosen umzusetzen. Diese basiert auf den das Tutorial von alexbloggt.com . Inzwischen ist mein Projekt ziemlich gewachsen und ich bin auch ganz zufrieden. Im Gegensatz zu Alex brauche ich aber einen Access Point Modus und eine Einwahl im mein WLAN Netzwerk: Ich schalte mein Netzwerk per WLAN aus beim Ausloggen - zum Einschalten wähle ich mich in den Access Point ein und aktiviere das Netzwerk wieder. Funktioniert auch soweit aber nicht zuverlässig. Und wirklich verstehen tu' ich das auch nicht. Ich habe mal den relevanten Teil herauskopiert:Ich verstehe nicht, warum der AP überhaupt wie gewünscht funktioniert: Ich komme normalerweise gar nie in die if (WiFi.status() != WL_CONNECTED) Bedingung, da sich der ESP8266 brav ins WLAN einwählt - kann aber trotzdem auf AP zugreifen. Leider funktioniert dies (meist?) am nächsten Morgen, wenn WLAN aus ist nicht mehr . Ich habe die Debugausgaben nicht in den Code gegeben, um es möglichst übersichtlich zu gestalten...
Mir ist auch schon aufgefallen, dass der Modus wifi.mode(wifi_ap_sta) gar nicht gesetzt ist, ist scheinbar Standardeinstellung...
Bin für Hinweise für die richtige/zuverlässige Konfiguration von wifi_ap_sta Modus dankbar.
Ich arbeite gerade daran eine WLAN Fernsteuerung für Funksteckdosen umzusetzen. Diese basiert auf den das Tutorial von alexbloggt.com . Inzwischen ist mein Projekt ziemlich gewachsen und ich bin auch ganz zufrieden. Im Gegensatz zu Alex brauche ich aber einen Access Point Modus und eine Einwahl im mein WLAN Netzwerk: Ich schalte mein Netzwerk per WLAN aus beim Ausloggen - zum Einschalten wähle ich mich in den Access Point ein und aktiviere das Netzwerk wieder. Funktioniert auch soweit aber nicht zuverlässig. Und wirklich verstehen tu' ich das auch nicht. Ich habe mal den relevanten Teil herauskopiert:
MDNSResponder mdns;
ESP8266WebServer server(80);
const char* ssid = "MyWLan";
const char* password = "MyPassword";
const char* MDNSName="ESP8266";
String ssidAP="WebSchalter";
const char* MDNSName="ESP8266";
IPAddress apIP(192, 168, 1, 50); //Adresse im AP Modus (im WLAN weist Router zu)
char passwort[64] = "APPassword"; //Passwort im AP Modus
void setup(void){
WiFi.persistent(false); //Permanentes Schreiben im Flash abschalten http://www.forum-raspberrypi.de/Thread-esp8266-achtung-flash-speicher-schreibzugriff-bei-jedem-aufruf-von-u-a-wifi-begin
WiFi.begin(ssid, password); //Server SSID Und Passwort...
int intRetry = 0;
while ((WiFi.status() != WL_CONNECTED) && (intRetry < 50)){
intRetry++;
delay(500);
}
if (WiFi.status() != WL_CONNECTED)
{ //Eigenartigerweise muss dieser Teil nicht ausgeführt werden? AP funktioniert aber trotzdem, auch wenn WLAN Verbindung Erfolg hat!?
//Wird dieser Teil ausgeführt, funktioniert wLAN nicht mehr!?
//WiFi.mode(WIFI_AP); // access point modus
//WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); //AP konfigurieren: MyIPAdress, MyGateway, MySubnet
//WiFi.softAP(&ssidAP[0], &passwort[0]); //AP Name und Passwort des AP Wi-Fi Netzes
//AP = 1; //Access Point aktiv setzen...
}
/*
if (mdns.begin(MDNSName, WiFi.localIP())) {
//Sollte eigentlich anstatt der IP Adresse einen Namen (EPS8266.local) ermöglichen - funktioniert aber nicht...
Hier habe ich noch eine Debugausgabe, die auch ausgegeben wird...
}
...
}
void loop(void){
server.handleClient();
}
Mir ist auch schon aufgefallen, dass der Modus wifi.mode(wifi_ap_sta) gar nicht gesetzt ist, ist scheinbar Standardeinstellung...
Bin für Hinweise für die richtige/zuverlässige Konfiguration von wifi_ap_sta Modus dankbar.
Schade, mit etwas mehr Betreuung der admins könnte dies ein richtig geiles Forum sein...
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Maniac
- Offline
- New Member
Weniger
Mehr
- Beiträge: 14
- Karma: 1
- Dank erhalten: 3
29 Jul 2017 20:02 - 29 Jul 2017 20:08 #228
von Maniac
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
WiFi.mode für AP und STA richtig anwenden
STA_AP modus hat ein Firmeware bug!
Als nur STA Single Modus oder AP Modus!
Vielleicht hilft dir das weiter!
Ist noch nicht fertiger aber nutzt aber kannst es ja mal probieren!
Zu delay() in dein *.ino als es !!!
delay() block dir alles (ist viel ne Vollbremsung Autobahn von 160km/h auf 0km/h)!
sehe dir "ESP8266 BlinkWithoutDelay" so wie die Beispiele von "ESP8266*"
fallback.h
fallback.cpp
bsp.: *.ino
Als nur STA Single Modus oder AP Modus!
Vielleicht hilft dir das weiter!
Ist noch nicht fertiger aber nutzt aber kannst es ja mal probieren!
Zu delay() in dein *.ino als es !!!
delay() block dir alles (ist viel ne Vollbremsung Autobahn von 160km/h auf 0km/h)!
sehe dir "ESP8266 BlinkWithoutDelay" so wie die Beispiele von "ESP8266*"
fallback.h
#include <ESP8266WiFi.h>
class FallBack;
class FallBack {
private:
bool _STA = false;
bool _AP = false;
bool _scan_STA();
const char* _STA_ssid = "Eingeben";
const char* _STA_pass = "Eingeben";
const char* _AP_ssid = "";
const char* _AP_pass = "";
IPAddress _AP_ip;
IPAddress _AP_gateway;
IPAddress _AP_subnet;
int _AP_channel;
int _AP_ssid_hidden;
int _AP_max_connection;
IPAddress _STA_ip;
IPAddress _STA_dns1;
IPAddress _STA_dns2;
IPAddress _STA_gateway;
IPAddress _STA_subnet;
int32_t _STA_channel;
const uint8_t* _STA_bssid;
unsigned long STA_verrbingung_zeit;
int STA_COUNTER = 0;
unsigned long AP_verrbingung_zeit;
int STA();
int AP();
public:
FallBack();
bool Server_Run = false;
unsigned long STA_verrbingung_max_zeit = 10000;
unsigned long AP_verrbingung_max_zeit = 60000;
int STA_MAX_Versuche= 3;
int wifi_status();
bool set_softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0);
bool set_softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet);
void set_STA_config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2);
void set_STA_begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL);
void set_STA_begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL);
};
fallback.cpp
#include "fallback.h"
FallBack::FallBack() {
STA_verrbingung_zeit=360000;
AP_verrbingung_zeit =360000;
}
int FallBack::wifi_status() {
if (_STA == false && _AP == false)
{
Serial.println("Suche!");
if (_scan_STA()) _STA = true; else _AP = true;
}
if (_STA == true)
{
if (WiFi.status() != WL_CONNECTED)
{
if (Server_Run == true)
{
Server_Run = false;
}
if ( millis() - STA_verrbingung_zeit >= STA_verrbingung_max_zeit )
{
if (STA_COUNTER <= STA_MAX_Versuche)
{
Serial.print("STA Verbindungsversuch! :");
Serial.println(STA_COUNTER);
STA();
STA_verrbingung_zeit = millis();
STA_COUNTER++;
} else
{
_STA = false;
_AP = true;
STA_COUNTER = 0;
}
}
} else
{
if (Server_Run == false)
{
Serial.println("STA Verbunden!");
Serial.print("Start WebServer STA, IP : ");
Serial.println(WiFi.localIP());
Server_Run = true;
}
}
}
if (_AP == true)
{
if (WiFi.getMode() != WIFI_AP) WiFi.mode(WIFI_AP);
if (Server_Run == false)
{
AP();
Serial.println("AP gestart!");
Serial.print("Start WebServer AP, IP : ");
Serial.println(WiFi.softAPIP());
Server_Run=true;
}
if (Server_Run == true)
{
if ( millis() - AP_verrbingung_zeit >= AP_verrbingung_max_zeit )
{
Serial.println("Suche STA nach!");
WiFi.softAPdisconnect(true);
WiFi.disconnect(true);
Server_Run = false;
_STA = false;
_AP = false;
}
}
}
return -1;
}
int FallBack::AP() {
WiFi.disconnect(true);
WiFi.softAPdisconnect(true);
if (WiFi.getMode() != WIFI_AP) WiFi.mode(WIFI_AP);
WiFi.softAPConfig(_AP_ip, _AP_gateway, _AP_subnet);
WiFi.softAP(_AP_ssid, _AP_pass , _AP_channel , _AP_ssid_hidden );
AP_verrbingung_zeit = millis();
return -1;
}
int FallBack::STA() {
WiFi.disconnect(true);
WiFi.softAPdisconnect(true);
if (WiFi.getMode() != WIFI_STA) WiFi.mode(WIFI_STA);
WiFi.config(_STA_ip, _STA_gateway, _STA_subnet, _STA_dns1, _STA_dns2);
WiFi.begin ( _STA_ssid, _STA_pass, _STA_channel, _STA_bssid, true);
return -1;
}
bool FallBack::_scan_STA()
{
if (WiFi.getMode() != WIFI_STA) WiFi.mode(WIFI_STA);
int n = WiFi.scanNetworks();
if (n == 0) return false;
for (int i = 0; i < n; ++i)
if (WiFi.SSID(i).equals(_STA_ssid)) return true;
return false;
}
bool FallBack::set_softAP(const char* ssid, const char* passphrase , int channel , int ssid_hidden ) {
_AP_ssid = ssid;
_AP_pass = passphrase;
_AP_channel = channel;
_AP_ssid_hidden = ssid_hidden;
}
bool FallBack::set_softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet) {
_AP_ip = local_ip;
_AP_gateway = gateway;
_AP_subnet = subnet;
}
void FallBack::set_STA_begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid) {
_STA_ssid = ssid;
_STA_pass = passphrase;
_STA_channel = channel;
_STA_bssid = bssid;
}
void FallBack::set_STA_begin(char* ssid, char *passphrase, int32_t channel, const uint8_t* bssid) {
return set_STA_begin((const char*) ssid, (const char*) passphrase, channel, bssid);
}
void FallBack::set_STA_config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
{
_STA_ip = local_ip;
_STA_dns1 = dns1;
_STA_dns2 = dns2;
_STA_gateway = gateway;
_STA_subnet = subnet;
}
bsp.: *.ino
const char* STA_ssid = "MyWLan";
const char* STA_pass = "MyPassword";
const char* AP_ssid = "WebSchalter";
const char* AP_pass = "MyPassword";
IPAddress AP_ip(192, 168, 4, 1);
IPAddress AP_gateway(192, 168, 4, 1);
IPAddress AP_subnet(255, 255, 255, 0);
const char* MDNSName = "ESP8266";
FallBack fallback = FallBack();
bool runner = false;
void setup()
{
WiFi.softAPdisconnect(true); // AP sollte noch verbunden sein
WiFi.disconnect(true); // STA sollte noch verbunden sein
WiFi.mode(WIFI_STA); // zum scan nach STA mode WIFI_STA
} fallback.set_STA_begin(STA_ssid, STA_pass);
fallback.set_softAPConfig(AP_ip, AP_gateway, AP_subnet);
fallback.set_softAP(AP_ssid, AP_pass);
fallback.STA_verrbingung_max_zeit = 10000; //standart 10sec zum verbinden
fallback.STA_MAX_Versuche = 3; //standart max 3 versuche zum AP zuverbinden alle versuch fehlschlagen AP Modus
fallback.AP_verrbingung_max_zeit = 60000; //standart 60sec im AP modus
server.on ( "/", handleRoot );
if (mdns.begin(MDNSName)) Serial.println("Error setting up MDNS responder!");
mdns.addService("http", "tcp", 80);
}
void loop()
{
fallback.wifi_status(); // prüfe auf verbindung STA und AP jenach den Verbindet zum STA oder Start AP für bestimmte zeit
if (fallback.Server_Run == true && runner == false)
{
mdns.begin(MDNSName);
mdns.update();
server.begin(); // webserver Start
runner = true;
}
if (fallback.Server_Run == false && runner == true) {
server.close(); // webserver stop
runner = false;
}
if (runner)
server.handleClient();
}
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
Letzte Änderung: 29 Jul 2017 20:08 von Maniac. Begründung: delay() hinweiss
Folgende Benutzer bedankten sich: VeryPrivat
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Maniac
- Offline
- New Member
Weniger
Mehr
- Beiträge: 14
- Karma: 1
- Dank erhalten: 3
29 Jul 2017 20:36 #229
von Maniac
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
WiFi.mode für AP und STA richtig anwenden
aus der fallback.cpp
kannst alle Serial.print(*) und Serial.println(*); löschen!
war zum Debuggen für mich!
kannst alle Serial.print(*) und Serial.println(*); löschen!
war zum Debuggen für mich!
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- VeryPrivat
- Autor
- Offline
- New Member
- ESP ist der Wahnsinn!
30 Jul 2017 09:01 #231
von VeryPrivat
Schade, mit etwas mehr Betreuung der admins könnte dies ein richtig geiles Forum sein...
WiFi.mode für AP und STA richtig anwenden
Hallo Maniac,
Danke für die Hinweise! Das mit dem STA_AP Mode kann ich kaum glauben! Gibt es sonst "niemanden" der ein Problem damit hat? Hast Du noch weitere Infos dazu?
Würde Dein "work around" auch eine beliebige AP-IP Adresse zulassen? Du verwendest ja auch wieder IPAddress AP_ip(192, 168, 4, 1);
Das mit dem Delay überrascht mich: Immerhin wird im Hintergrund die Verbindung aufgebaut. Also bei 0 könnte er gar nichts tun. Und in dieser Phase (Verbindungsaufbau) ist ja auch sonst nichts anderes notwendig.
Du hast Recht - die verwendete Forumbreite ist extrem unübersichtlich! Zumal zum Rand auch links und rechts viel Platz mit Menüleiste, Icons, News vergeudet wird. Ein etwas längerer Satz braucht mehr vertikalen Platz wie horizontalen!
Danke für die Hinweise! Das mit dem STA_AP Mode kann ich kaum glauben! Gibt es sonst "niemanden" der ein Problem damit hat? Hast Du noch weitere Infos dazu?
Würde Dein "work around" auch eine beliebige AP-IP Adresse zulassen? Du verwendest ja auch wieder IPAddress AP_ip(192, 168, 4, 1);
Das mit dem Delay überrascht mich: Immerhin wird im Hintergrund die Verbindung aufgebaut. Also bei 0 könnte er gar nichts tun. Und in dieser Phase (Verbindungsaufbau) ist ja auch sonst nichts anderes notwendig.
Du hast Recht - die verwendete Forumbreite ist extrem unübersichtlich! Zumal zum Rand auch links und rechts viel Platz mit Menüleiste, Icons, News vergeudet wird. Ein etwas längerer Satz braucht mehr vertikalen Platz wie horizontalen!
Schade, mit etwas mehr Betreuung der admins könnte dies ein richtig geiles Forum sein...
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Maniac
- Offline
- New Member
Weniger
Mehr
- Beiträge: 14
- Karma: 1
- Dank erhalten: 3
30 Jul 2017 21:13 - 30 Jul 2017 21:14 #232
von Maniac
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
WiFi.mode für AP und STA richtig anwenden
siehe STA_AP Mode
github.com/esp8266/Arduino/issues
so wie unter Nodemcu elua
kannst du angeben wie du möchtest ja nach dem!!! Beachte aber siehe
de.wikipedia.org/wiki/Private_IP-Adresse
Kleine Erklärung:0. starte dein loop
2. bei intRetry setzt du auf 0
3. ab frage wenn Wifi keine Verbindung und intRetry kleiner ist als 50
4. erhöhe wert um 1
5. delay(500) 50 ms warte 500 ms oder 0,5 sec
das ganz läuft bis entweder Wifi verbunden ist oder intRetry wert 50 hat
so jetzt zu dem Problem mit Delay
intRetry = 50 heist 50 * delay(500)= 25000ms = 25 sec wo der ESP nur das mach Nix anders
So jetzt las z.b. ein oder mehrer Sensor ins spiel mit rein kommen,
kannst du im schlimmsten falle NUR alle 25 sec diese Sensoren abfragen!
sieht erst mal nach nicht ein Problem aus oder?
Jetzt übertrieben
du hast noch ne pumpen Steuerung die ein Pegel von X irgendwas hält
da können 25 sec verflucht lange sein
nach 25 sec. Sensor melde zuwenig pumpe erhöht Leistung um mehr Wasser ins Gefäße zu bringen
dann geht wieder 3. los -> keine Verbindung 25 sec
Sensor melde zu viel wasser -> pumpe senkt Leistung
dann geht wieder 3. los -> keine Verbindung 25 sec
Sensor melde zu wenig wasser -> pumpe erhöht Leistung
so besser:so hast du keine Vollbremsung 160 auf 0
IPAddress AP_ip(192, 168, 4, 1);
Das mit dem Delay überrascht mich: Immerhin wird im Hintergrund die Verbindung aufgebaut.
Kleine Erklärung:
0.void loop()
1.{
2. int intRetry = 0;
3. while ((WiFi.status() != WL_CONNECTED) && (intRetry < 50)){
4. intRetry++;
5. delay(500);
6. }
7.}
2. bei intRetry setzt du auf 0
3. ab frage wenn Wifi keine Verbindung und intRetry kleiner ist als 50
4. erhöhe wert um 1
5. delay(500) 50 ms warte 500 ms oder 0,5 sec
das ganz läuft bis entweder Wifi verbunden ist oder intRetry wert 50 hat
so jetzt zu dem Problem mit Delay
intRetry = 50 heist 50 * delay(500)= 25000ms = 25 sec wo der ESP nur das mach Nix anders
So jetzt las z.b. ein oder mehrer Sensor ins spiel mit rein kommen,
kannst du im schlimmsten falle NUR alle 25 sec diese Sensoren abfragen!
sieht erst mal nach nicht ein Problem aus oder?
Jetzt übertrieben
du hast noch ne pumpen Steuerung die ein Pegel von X irgendwas hält
da können 25 sec verflucht lange sein
nach 25 sec. Sensor melde zuwenig pumpe erhöht Leistung um mehr Wasser ins Gefäße zu bringen
dann geht wieder 3. los -> keine Verbindung 25 sec
Sensor melde zu viel wasser -> pumpe senkt Leistung
dann geht wieder 3. los -> keine Verbindung 25 sec
Sensor melde zu wenig wasser -> pumpe erhöht Leistung
so besser:
vor loop und setup;
unsigned long neuverbindung=0;
void loop(){
if (WiFi.status() != WL_CONNECTED ){ abfrage ob verbunden
if (intRetry>50){ abfrage ob intRetry grösser ist als 50
intRetry=0 setzt intRetry auf 0
WiFi.begin(ssid, password); neu verbinden!
neuverbindung =millis(); wann wurde Neuverbingungsversuch gestartet
}else
{
if (millis()-neuverbindung> 500){ wenn millis() zeit seid dem Start des ESP8266 MINUS neuverbindung ist der höher ist als 5000/0,5sec früher dein delay(500)
intRetry++; erhöhe um 1
}
//hier kann dann was anders gemacht werden
//Sensoren auslesen etwas ansteuere
//und wieder hoch zum loop anfang
}
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
Letzte Änderung: 30 Jul 2017 21:14 von Maniac.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Maniac
- Offline
- New Member
Weniger
Mehr
- Beiträge: 14
- Karma: 1
- Dank erhalten: 3
30 Jul 2017 21:37 #233
von Maniac
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
WiFi.mode für AP und STA richtig anwenden
wenn du möchtest kannst du ja mal deine *.ino Posten oder als Datenanhang!
ohne passwörter ect.
weil gerade mir etwas unklar mit Router und AP
ESP soll AP MODUS sein -> damit du den Router über Steckdose an machen kannst?
kommst nach Haus verbindest dich mit dem ESP->AP machst die Dose an Router an!
wenn du gehst soll über ESP-AP oder Router Netzwerk die Dose abgeschaltet werden?
An über AP wäre nicht das Problem
Aus über Router Netzwerk Problem! Router und ESP-AP keine Verbindung!
da du Raspberry Pi gepostet hast neheme ich mal du hast ein.
ein 2 ESP(2) an den Raspberry Pi dieser verbindet mit ESP(1)
PI bekommt über R-Neztwerk leite diese über GIOP/Serial weiter an ESP(2) dieser sendet es weiter an ESP(1) DOSE aus!
ohne passwörter ect.
weil gerade mir etwas unklar mit Router und AP
ESP soll AP MODUS sein -> damit du den Router über Steckdose an machen kannst?
kommst nach Haus verbindest dich mit dem ESP->AP machst die Dose an Router an!
wenn du gehst soll über ESP-AP oder Router Netzwerk die Dose abgeschaltet werden?
An über AP wäre nicht das Problem
Aus über Router Netzwerk Problem! Router und ESP-AP keine Verbindung!
da du Raspberry Pi gepostet hast neheme ich mal du hast ein.
ein 2 ESP(2) an den Raspberry Pi dieser verbindet mit ESP(1)
PI bekommt über R-Neztwerk leite diese über GIOP/Serial weiter an ESP(2) dieser sendet es weiter an ESP(1) DOSE aus!
Forum auf max breit 1050 ist doch Witz!
Bei einer Bildschirm breite von 1920 oder mehr!
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Aktuelle Seite:
- Startseite
- Impressum / Datenschutz / ...
- ESP8266 spezifisch
- Codebesprechung
- WiFi.mode für AP und STA richtig anwenden