ESP8266 Arduino - szerver újraindítás vagy ön Reset

ESP8266, ESP32 chipek és az ESP-xx modulok. Programozási nyelvek, trükkök, hardware tippek.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Hogy egy kicsit a AP név váltásra is visszatérjek.
Ez a forma is működik.

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

WiFi.softAPdisconnect(true);
delay(100);
WiFi.mode(WIFI_AP);
WiFi.softAP(s.c_str(), AP_PASS, 4);
kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Szép kis gyűjtemény, köszi.
kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Sziasztok!
Két esp között próbálok kapcsolatot létrehozni egyenlőre sikertelenül.
AZ egyik AP a másik STA.
Az STA látja az AP-t, wifi kapcsolat létre is ön, de mint szerver kliens kapcsolat nem jön össze.
Viszont ha az egyszer AP-nak beállított modul tápot kap rögtön sugározni kezd, hiába fut rajta csak egy led villogtató program.
Ez a modul már nem tud a ruteremhez sem csatlakozni olyan kóddal ami az elött simán ment.
Van olyan megoldás hogy minden újra programozáskor tiszta lappal induljon, és ne legyenek benne a korábbi beállítások?
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Ha szerver megvan és eléred webes böngészőről, és az ott futtatott oldalon mondjuk ajaxal tudsz lekérni adatot az ESP-ről akkor már csak egy hasonló kliens kell az ESP-re.

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

void client_read(IPAddress *ip, String *send_text) {

	WiFiClient client;
	if (!client.connect(*ip, 80)) {
		//Serial.println("connection failed");
		*send_text = "failed";
		return;
	}
	client.print(
			String("GET ") + *send_text + " HTTP/1.1\r\n" + "Host: " + "\r\n"
					+ "Connection: close\r\n\r\n");
	unsigned long timeout = millis();
	while (client.available() == 0) {
		if (millis() - timeout > 5000) {
			//Serial.println(">>> Client Timeout !");
			client.stop();
			*send_text = "failed";
			return;
		}
	}
	while (client.available()) {
		*send_text = client.readStringUntil('\r');
		//Serial.print(line);
	}
}

Meghívása

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

IPAddress ip = { 192, 168, x, x }; // szerver ESP címe
String send_text = F("/set_k?k=0"); // üzenet
client_read(&ip, &send_text); // &send_text = szerver válasz üzenete ebben jön vissza
Serial.print(send_text);
ESP rögzíti az előző kapcsolódási módot azt törölni kell ha nem szeretnéd használni.
Ezt pedig pont kicsit lejjebb tettem közzé, hogy lehet az AP módot kikapcsolni.

Következő kód azt csinálja magpróbál STA kapcsolatot felvennia routerrel ha ne jön össze akkor AP-STA (ilyenkor be lehet állítani a wifi csatlakozási adatokat akár) közben ha mégis sikerül STA mód akkor kikapcsolja az AP-STA módot és csak STA lesz még meg nem szakad megint.
Simán ezt teszem a loop ciklusba pár másodpercenként meghívva.
Itt kb látszik a Wifi mód váltogatás.
Régen azt tréfált meg hogy a egy új ESP modul beállítása WiFi.setAutoConnect(false); volt és nem csatlakozott. Pontosabban akkor még nem tudtam hogy van ilyen csak azt láttam hogy ha egyszer elveszti a kapcolatot többé nem kapcsolódik a routerhez.

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

/**
 *
 * const char* sta_ssid
 * const char* sta_psk
 * byte* sta_ip
 * const char* ap_ssid
 * const char* ap_psk
 * byte* ap_channel              Sikertelen STA csatlakozás esetén érvényes,
 *                               minden más esetben az STA kapcsolat catornája
 *                               lesz az AP csatorna száma is.
 *
 * ha még nem volt STA csatlakozás
 * WiFi.status -> 6
 * WiFi.Mode -> 3
 */

void STA_AP_STA(const char* sta_ssid, const char* sta_psk, byte* sta_ip,
		const char* ap_ssid, const char* ap_psk, byte* ap_channel) {
	IPAddress f_ip = WiFi.localIP();

//	Serial.print("WiFi.status -> ");
//	Serial.println(WiFi.status());
//	Serial.print("WiFi.Mode -> ");
//	Serial.println(WiFi.getMode());
//	Serial.println();

// ha STA módban van IP ellenőrzés
	if (WiFi.status() == 3) { // ha STA módban van
		// ha nem fix IP cím és nem 0 akkor beállítja a fix IP címet
		if (f_ip[3] != *sta_ip and *sta_ip != 0) {
			f_ip[3] = *sta_ip;
			WiFi.config(f_ip, WiFi.gatewayIP(), WiFi.subnetMask());
//			WifiData();

		}
		//Serial.println("STA OK");
		if (WiFi.getMode()!= 3) {
			WiFi.softAPdisconnect(true);
			WiFi.mode(WIFI_STA);
			return;
		}
	} else { // ha megszűnt az STA kapsolat
		// AP-STA  mód beállítása ha még nincs beállítva
		if (WiFi.getMode() != WIFI_AP_STA) {
			WiFi.mode(WIFI_AP_STA);
			WiFi.softAP(ap_ssid, ap_psk, *ap_channel, 0);
		}
	}
	// ha 1 a status akkor már próbált csatlakozni de nem sikerült.
	// innen már magától csatlakozik 	WiFi.setAutoConnect(true); miatt nem kell nekünk
	if (WiFi.status() == 1) {
		return;
	}

	// STA csatlakozás indítása, beállítása
	WiFi.softAPdisconnect(true);
	WiFi.mode(WIFI_STA);
	WiFi.setAutoConnect(true);
	WiFi.begin(sta_ssid, sta_psk);
	byte b = 0;
	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
		// 10 x próbál meg csatlakozni AP_STA módba lép
		b++;
		if (b > 10) {
			WiFi.mode(WIFI_AP_STA);
			return;
		}
	}
	// fix IP cím beállítása ha nem 0
	if (*sta_ip != 0) {
		f_ip = WiFi.localIP();
		f_ip[3] = *sta_ip;
		WiFi.config(f_ip, WiFi.gatewayIP(), WiFi.subnetMask());
	}
}


Estig nem vagyok addig remélem sikerül az infókból gazdálkodni. :)
kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Köszi Sanyi!
Átnézem ezeket, majd írom mire mentem.
Az előbb sikerült a kapcsolat, a hiba okát még nem értem, de sikerült megkerülni.
Köszi Szabolcs
kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Sziasztok!
Újabb kérdésem lenne,
Ha az esp modult AP módba állítom, van e arra lehetőség hogy én határozzam meg mi legyen a modul ip címe?
Köszi Szabolcs.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

A modul címe AP-re kötött. Nem átírható.
kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Találtam egy ilyen megoldást:
IPAddress ip(192, 168, 2, 10);
IPAddress SubnetMask(255, 255, 255, 0);

WiFi.softAPConfig(ip, ip, SubnetMask);
WiFi.softAP(AP_SSID, AP_PASS);

Ezen az ip-n elérem másik esp ről vagy laptopról is.
Ez így jó lehet, vagy félreértek valamit?
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Vagy ha mégis akkor pld. így. :)

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

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

char ap_ssid[] = "ESP";
char ap_pass[] = "12345678";
IPAddress ap_ip(192, 168, 4, 12);
IPAddress ap_sub(255, 255, 255, 0);
int ap_channel = 4;

ESP8266WebServer server(80);

void get_wifi() {
	Serial.print(F("**********************************\n"));
	Serial.print(F("* STA MAC: "));
	Serial.println(WiFi.macAddress()); // ESP  MAC címmét adja vissza
	Serial.print(F("* STA localIP: "));
	Serial.println(WiFi.localIP()); // STA IP cím
	Serial.print(F("* AP MAC: "));
	Serial.println(WiFi.softAPmacAddress()); // ESP  MAC címmét adja vissza
	Serial.print(F("* AP localIP: "));
	Serial.println(WiFi.softAPIP()); // IP cím
	Serial.print(F("* wifi Status: "));
	Serial.println(WiFi.status());
	Serial.print(F("* wifi STA SSID: "));
	Serial.println(WiFi.SSID());
	Serial.print(F("* wifi STA psk: "));
	Serial.println(WiFi.psk());
	Serial.print(F("* wifi STA RSSI: "));
	Serial.println(WiFi.RSSI());
	Serial.print(F("* wifi getAutoConnect(): "));
	Serial.println(WiFi.getAutoConnect());
	Serial.print(F("* wifi waitForConnectResult(): "));
	Serial.println(WiFi.waitForConnectResult());
	Serial.print(F("* wifi Mode: "));
	Serial.println(WiFi.getMode()); // Wifi mode  WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3

	Serial.print(F("*********\n"));
	WiFi.printDiag(Serial);
	Serial.print(F("**********************************\n"));
}

/***************************/
void setup(void) {
	Serial.begin(115200);
	delay(10);
	Serial.println();

	WiFi.disconnect();
	WiFi.mode(WIFI_AP);
	WiFi.softAPConfig(ap_ip, ap_ip, ap_sub);
	WiFi.softAP(ap_ssid, ap_pass, ap_channel);

	get_wifi();

	server.on("/", []() { // ip cím hez tartozó html oldal megrajzolása
				server.send ( 200, "text/plain", "Sikeres AP kapcsolat teszt oldal" );
			});
	server.begin();  
}

/***************************/
void loop(void) {
	server.handleClient();  
}
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Jól érted, és gyorsabb is voltál.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Ezzel nem azt írhtod át, amivel a helyi hálózaton lehet?
Amikor önálló (router nélküli), akkor nem kötött?
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Nem kötött.
STA módban amikor routerhez csatlakozol akkor ezt kell használni

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

  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet); 
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());

Itt nem mindegy mikor adod meg az IP címet mert ha jól emlékezem akkor pld a gmail levelező nem működik ha ebben a formában kap egyedi IP címet az ESP, de ha a routerhez csatlakozás után kap fix IP címet akkor szépen működik.

ami a következő képen alakul

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

  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  WiFi.config(ip, gateway, subnet); 

  Serial.println("");
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());

kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Nekem mindkét változatra szükségem van.
Az az esp amin a szerver fut AP_STA módban van. A DHCP-től kér fix IP-t. Ehhez csatlakozik a többi kliensként a ruteren keresztül.
Ha a ruter megszűnik akkor direkt kapcsolódnak, majd lehetőség szerint vissza. Ugyanerre akarom állítani az AP mód IP címét hogy kliens-szerver kapcsolatnál ne kelljen külön kezelni. Hogy ez okoz e ütközést, az még tesztelésre vár.
Most azon vesződők hogy kliens oldalon az autóconnekt mindig az elsődleges (ruter) kapcsolat irányába menjen.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

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

Hajdanán nekem is volt efféle elképzelésem hogy ugyanazt a ssid és IP címet kapja az esp mint a router és ha nincs router akkor az esp veszi át a szerepét. Aztán erre nem volt akkora szükség mégsem és így már halva született, nem lett kidogozva.

Az hogy ide oda váltogat STA és AP-STA mód között a router elérhetőségtől függően, arra már közzé tettem az én megoldásom nemrég. Csak ott az AP maradt a gyári IP címen.
Válasz küldése