Skip to content

Instantly share code, notes, and snippets.

@ArduinoBasics
Created September 16, 2018 15:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ArduinoBasics/7ef042ec2d7f3966a46302ed29972c24 to your computer and use it in GitHub Desktop.
Save ArduinoBasics/7ef042ec2d7f3966a46302ed29972c24 to your computer and use it in GitHub Desktop.
A sketch for the KEYES ESP-13 WiFi Shield to create a WiFi Scanner
/*==========================================================================
* Project: ArduinoBasics WiFi Scanner
* Author: Scott C
* Date created: 16 September 2018
* Arduino IDE version: 1.8.5
* Operating System: Windows 10 Pro
*
* Description:
* The ESP-13 WiFi shield will create an Access Point that you can connect to
* using your phone/tablet/PC. Once connected via WiFi, navigate your browser
* to the IP address displayed in the Serial monitor to see the list of Access Points in your area.
*
* Acknowledgements:
* Some of the code used within this sketch was inspired by or adapted from other notable sources.
* Webserver code: adapted from https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/server-examples.html
* WiFi scanner code adapted from tablatronix : https://gist.github.com/tablatronix/497f3b299e0f212fc171ac5662fa7b42
* HTTP/1.1 protocols: https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
*
* -------------------------------------------------------------------------
* LIBRARIES:
* Libraries used: ESP8266WiFi.h - installed with Boards Manager : https://github.com/esp8266/Arduino
* More information about ESP8266WiFi.h library :
* https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html
* https://arduino-esp8266.readthedocs.io/en/2.4.2/libraries.html#wifi-esp8266wifi-library
*
*
* GLOBAL VARIABLES:
* The SSID and Password for the Access point (AP) that will be created by the ESP-13 WiFi shield
* The WiFi server which will listen for Clients on Port 80 (eg. Web Browsers)
============================================================================ */
#include <ESP8266WiFi.h>
const char* ssid = "PinkFluffyUnicorn";
const char* password = "12345678";
WiFiServer server(80);
/* ==========================================================================
* SETUP:
* Begin Serial Communication using a Baud Rate of 115200
* Configure the ESP-13 WiFi shield into Access Point Mode
* Create an Access Point for devices to connect to.
* Display the Access Point (AP) IP address in the Serial monitor.
* Start the server if the Access Point has been created successfully
============================================================================ */
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
WiFi.mode(WIFI_AP);
boolean r = WiFi.softAP(ssid, password);
if (r) {
server.begin();
Serial.println("");
Serial.print("Please connect to the Access Point: ");
Serial.println(ssid);
Serial.printf("then open %s in a web browser\n", WiFi.softAPIP().toString().c_str());
Serial.println("");
} else {
Serial.println("FAILED to create Access Point");
while(1){}
}
}
/* ==========================================================================
* LOOP:
* Start listening for Clients
* Notify when a Client connects to the server using the Serial Monitor
* Then write any request messages from the client to the Serial Monitor
* Wait for the client to send through an empty line, then
* Serve the constructed HTML page to the client
* The delay gives the browser some time to receive the HTML page, before
* the server dicsonnects from the client.
* Notify when the client has been disconnected.
============================================================================ */
void loop() {
WiFiClient client = server.available();
if(client){
Serial.println("\n A Client just connected to the server");
while(client.connected()) {
if(client.available()){
String clientMessage = client.readStringUntil('\r');
Serial.print(clientMessage);
if(clientMessage.length() == 1 && clientMessage[0] =='\n') {
client.println(constructHTMLpage());
break;
}
}
}
delay(1000);
client.stop();
Serial.println("\n The server has disconnected the Client");
}
}
/* ==========================================================================
*constructHTMLpage:
*SCAN for available WiFi networks within range of the ESP-13 WiFi Shield
*Construct the necessary HTTP response and HTML to
* - display the SCAN results within a web browser (client).
* - automatically refresh the HTML page every 5 seconds.
*
*The HTML page will display the following information in a table:
* - SSID,
* - Signal Strength and
* - Encryption type.
============================================================================ */
String constructHTMLpage(){
int numSSID = WiFi.scanNetworks();
String HTMLpage = String("HTTP/1.1 200 OK\r\n") +
"Content-Type: text/html\r\n" +
"Connection: close\r\n" +
"Refresh: 5\r\n" +
"\r\n" +
"<!DOCTYPE HTML>" +
"<html><body>\r\n" +
"<h2>WIFI NETWORKS</h2>\r\n" +
"<table><tr><th>SSID</th><th>Signal Strength</th><th>Encryption type</th></tr>\r\n";
for(int i=0; i<numSSID; i++){
HTMLpage = HTMLpage + String("<tr><td>");
HTMLpage = HTMLpage + String(WiFi.SSID(i));
HTMLpage = HTMLpage + String("</td><td>");
HTMLpage = HTMLpage + String(WiFi.RSSI(i));
HTMLpage = HTMLpage + String("</td><td>");
HTMLpage = HTMLpage + String(encryptionTypeStr(WiFi.encryptionType(i)));
HTMLpage = HTMLpage + String(" [");
HTMLpage = HTMLpage + String(WiFi.encryptionType(i));
HTMLpage = HTMLpage + String("]");
HTMLpage = HTMLpage + String("</td></tr>");
}
HTMLpage = HTMLpage + String("</table></body></html>\r\n");
return HTMLpage;
}
/* ==========================================================================
*encryptionTypeStr:
*Will accept a WiFi.encryptionType() integer and convert it into a more
*meaningful string.
============================================================================ */
String encryptionTypeStr(uint8_t authmode) {
switch(authmode) {
case ENC_TYPE_NONE:
return "OPEN";
case ENC_TYPE_WEP:
return "WEP";
case ENC_TYPE_TKIP:
return "WPA_PSK";
case ENC_TYPE_CCMP:
return "WPA2_PSK";
case ENC_TYPE_AUTO:
return "WPA_WPA2_PSK";
default:
return "UNKOWN";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment