mirror of
				https://github.com/esp8266/Arduino.git
				synced 2025-10-31 15:50:55 +03:00 
			
		
		
		
	This example serves a "hello world" on a WLAN and a SoftAP at the same time. The SoftAP allow you to configure WLAN parameters at run time. They are not setup in the sketch but saved on EEPROM. This is a captive portal because through the softAP it will redirect any http request to http://192.168.4.1/, served by the ESP8266 itself
		
			
				
	
	
		
			136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <ESP8266WiFi.h>
 | |
| #include <WiFiClient.h> 
 | |
| #include <ESP8266WebServer.h>
 | |
| #include <DNSServer.h>
 | |
| #include <ESP8266mDNS.h>
 | |
| #include <EEPROM.h>
 | |
| 
 | |
| /*
 | |
|  * This example serves a "hello world" on a WLAN and a SoftAP at the same time.
 | |
|  * The SoftAP allow you to configure WLAN parameters at run time. They are not setup in the sketch but saved on EEPROM.
 | |
|  * 
 | |
|  * Connect your computer or cell phone to wifi network ESP_ap with password 12345678. A popup may appear and it allow you to go to WLAN config. If it does not then navigate to http://192.168.4.1/wifi and config it there.
 | |
|  * Then wait for the module to connect to your wifi and take note of the WLAN IP it got. Then you can disconnect from ESP_ap and return to your regular WLAN.
 | |
|  * 
 | |
|  * Now the ESP8266 is in your network. You can reach it through http://192.168.x.x/ (the IP you took note of) or maybe at http://esp8266.local too.
 | |
|  * 
 | |
|  * This is a captive portal because through the softAP it will redirect any http request to http://192.168.4.1/
 | |
|  */
 | |
| 
 | |
| /* Set these to your desired softAP credentials. They are not configurable at runtime */
 | |
| const char *softAP_ssid = "ESP_ap";
 | |
| const char *softAP_password = "12345678";
 | |
| 
 | |
| /* hostname for mDNS. Should work at least on windows. Try http://esp8266.local */
 | |
| const char *myHostname = "esp8266";
 | |
| 
 | |
| /* Don't set this wifi credentials. They are configurated at runtime and stored on EEPROM */
 | |
| char ssid[32] = "";
 | |
| char password[32] = "";
 | |
| 
 | |
| // DNS server
 | |
| const byte DNS_PORT = 53;
 | |
| DNSServer dnsServer;
 | |
| 
 | |
| // Web server
 | |
| ESP8266WebServer server(80);
 | |
| 
 | |
| /* Soft AP network parameters */
 | |
| IPAddress apIP(192, 168, 4, 1);
 | |
| IPAddress netMsk(255, 255, 255, 0);
 | |
| 
 | |
| 
 | |
| /** Should I connect to WLAN asap? */
 | |
| boolean connect;
 | |
| 
 | |
| /** Last time I tried to connect to WLAN */
 | |
| long lastConnectTry = 0;
 | |
| 
 | |
| /** Current WLAN status */
 | |
| int status = WL_IDLE_STATUS;
 | |
| 
 | |
| void setup() {
 | |
|   delay(1000);
 | |
|   Serial.begin(9600);
 | |
|   Serial.println();
 | |
|   Serial.print("Configuring access point...");
 | |
|   /* You can remove the password parameter if you want the AP to be open. */
 | |
|   WiFi.softAPConfig(apIP, apIP, netMsk);
 | |
|   WiFi.softAP(softAP_ssid, softAP_password);
 | |
|   delay(500); // Without delay I've seen the IP address blank
 | |
|   Serial.print("AP IP address: ");
 | |
|   Serial.println(WiFi.softAPIP());
 | |
| 
 | |
|   /* Setup the DNS server redirecting all the domains to the apIP */  
 | |
|   dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
 | |
|   dnsServer.start(DNS_PORT, "*", apIP);
 | |
| 
 | |
|   /* Setup web pages: root, wifi config pages, SO captive portal detectors and not found. */
 | |
|   server.on("/", handleRoot);
 | |
|   server.on("/wifi", handleWifi);
 | |
|   server.on("/wifisave", handleWifiSave);
 | |
|   server.on("/generate_204", handleRoot);  //Android captive portal. Maybe not needed. Might be handled by notFound handler.
 | |
|   server.on("/fwlink", handleRoot);  //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.
 | |
|   server.onNotFound ( handleNotFound );
 | |
|   server.begin(); // Web server start
 | |
|   Serial.println("HTTP server started");
 | |
|   loadCredentials(); // Load WLAN credentials from network
 | |
|   connect = strlen(ssid) > 0; // Request WLAN connect if there is a SSID
 | |
| }
 | |
| 
 | |
| void connectWifi() {
 | |
|   Serial.println("Connecting as wifi client...");
 | |
|   WiFi.disconnect();
 | |
|   WiFi.begin ( ssid, password );
 | |
|   int connRes = WiFi.waitForConnectResult();
 | |
|   Serial.print ( "connRes: " );
 | |
|   Serial.println ( connRes );
 | |
| }
 | |
| 
 | |
| void loop() {
 | |
|   if (connect) {
 | |
|     Serial.println ( "Connect requested" );
 | |
|     connect = false;
 | |
|     connectWifi();
 | |
|     lastConnectTry = millis();
 | |
|   }
 | |
|   {
 | |
|     int s = WiFi.status();
 | |
|     if (s == 0 && millis() > (lastConnectTry + 60000) ) {
 | |
|       /* If WLAN disconnected and idle try to connect */
 | |
|       /* Don't set retry time too low as retry interfere the softAP operation */
 | |
|       connect = true;
 | |
|     }
 | |
|     if (status != s) { // WLAN status change
 | |
|       Serial.print ( "Status: " );
 | |
|       Serial.println ( s );
 | |
|       status = s;
 | |
|       if (s == WL_CONNECTED) {
 | |
|         /* Just connected to WLAN */
 | |
|         Serial.println ( "" );
 | |
|         Serial.print ( "Connected to " );
 | |
|         Serial.println ( ssid );
 | |
|         Serial.print ( "IP address: " );
 | |
|         Serial.println ( WiFi.localIP() );
 | |
| 
 | |
|         // Setup MDNS responder
 | |
|         if (!MDNS.begin(myHostname)) {
 | |
|           Serial.println("Error setting up MDNS responder!");
 | |
|         } else {
 | |
|           Serial.println("mDNS responder started");
 | |
|           // Add service to MDNS-SD
 | |
|           MDNS.addService("http", "tcp", 80);
 | |
|         }
 | |
|       } else if (s == WL_NO_SSID_AVAIL) {
 | |
|         WiFi.disconnect();
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   // Do work:
 | |
|   //DNS
 | |
|   dnsServer.processNextRequest();
 | |
|   //HTTP
 | |
|   server.handleClient();
 | |
| }
 | |
| 
 |