WiFi manager working
This commit is contained in:
@@ -17,3 +17,5 @@ lib_deps =
|
||||
me-no-dev/AsyncTCP@^1.1.1
|
||||
ayushsharma82/AsyncElegantOTA@^2.2.7
|
||||
arduino-libraries/Arduino_JSON@^0.1.0
|
||||
board_build.partitions = partitions.csv
|
||||
monitor_speed = 115200
|
||||
285
src/main.cpp
285
src/main.cpp
@@ -58,17 +58,296 @@ const long interval = 10000; // interval to wait for Wi-Fi connection (millisec
|
||||
String ledState;
|
||||
|
||||
|
||||
// function declarations
|
||||
|
||||
|
||||
// --------- function declarations --------------
|
||||
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len);
|
||||
void initSPIFFS();
|
||||
bool initWiFi();
|
||||
String getLEDState();
|
||||
// ----------------------------------------------
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
|
||||
//*****************************************
|
||||
//Init OTA
|
||||
AsyncElegantOTA.begin(&server); // Start AsyncElegantOTA
|
||||
|
||||
//*****************************************
|
||||
//Init SPIFFS
|
||||
MDNS.addService("http","tcp",80);
|
||||
initSPIFFS();
|
||||
ws.onEvent(onWsEvent);
|
||||
server.addHandler(&ws);
|
||||
|
||||
events.onConnect([](AsyncEventSourceClient *client){
|
||||
client->send("hello!",NULL,millis(),1000);
|
||||
});
|
||||
server.addHandler(&events);
|
||||
server.addHandler(new SPIFFSEditor(SPIFFS,http_username,http_password));
|
||||
|
||||
//*****************************************
|
||||
//Init webserver
|
||||
|
||||
// settings.begin("WiFi");
|
||||
// Load values saved in SPIFFS
|
||||
// ssid = readFile(SPIFFS, ssidPath);
|
||||
// ssid = settings.getString("ssid","");
|
||||
// pass = readFile(SPIFFS, passPath);
|
||||
// pass = settings.getString("pass","");
|
||||
// ip = readFile(SPIFFS, ipPath);
|
||||
// ip = settings.getString("ip","");
|
||||
// gateway = readFile (SPIFFS, gatewayPath);
|
||||
// gateway = settings.getString("gateway","");
|
||||
// settings.end();
|
||||
// Serial.println(ssid);
|
||||
// Serial.println(pass);
|
||||
// Serial.println(ip);
|
||||
// Serial.println(gateway);
|
||||
|
||||
// settings.begin("params");
|
||||
// Iim = settings.getFloat("Iim");
|
||||
// Imp = settings.getFloat("Imp");
|
||||
// Tu = settings.getFloat("Tu");
|
||||
// Tl = settings.getFloat("Tl");
|
||||
// settings.end();
|
||||
// Serial.printf("Iim:%.2f,",Iim);
|
||||
// Serial.printf("Imp:%.2f,",Imp);
|
||||
// Serial.printf("Tu:%.2f,",Tu);
|
||||
// Serial.printf("Tl:%.2f",Tl);
|
||||
// Serial.println();
|
||||
|
||||
|
||||
if(initWiFi()){
|
||||
//connected to known network
|
||||
|
||||
}else{
|
||||
//softAP
|
||||
|
||||
}
|
||||
|
||||
|
||||
server.on("/scanNetworks", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
String json = "[";
|
||||
int n = WiFi.scanComplete();
|
||||
if(n == -2){
|
||||
WiFi.scanNetworks(true);
|
||||
} else if(n){
|
||||
for (int i = 0; i < n; ++i){
|
||||
if(i) json += ",";
|
||||
json += "{";
|
||||
json += "\"rssi\":"+String(WiFi.RSSI(i));
|
||||
json += ",\"ssid\":\""+WiFi.SSID(i)+"\"";
|
||||
json += ",\"channel\":"+String(WiFi.channel(i));
|
||||
json += "}";
|
||||
}
|
||||
WiFi.scanDelete();
|
||||
if(WiFi.scanComplete() == -2){
|
||||
WiFi.scanNetworks(true);
|
||||
}
|
||||
}
|
||||
json += "]";
|
||||
request->send(200, "application/json", json);
|
||||
json = String();
|
||||
});
|
||||
|
||||
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm");
|
||||
server.onNotFound([](AsyncWebServerRequest *request){
|
||||
Serial.printf("NOT_FOUND: ");
|
||||
if(request->method() == HTTP_GET)
|
||||
Serial.printf("GET");
|
||||
else if(request->method() == HTTP_POST)
|
||||
Serial.printf("POST");
|
||||
else if(request->method() == HTTP_DELETE)
|
||||
Serial.printf("DELETE");
|
||||
else if(request->method() == HTTP_PUT)
|
||||
Serial.printf("PUT");
|
||||
else if(request->method() == HTTP_PATCH)
|
||||
Serial.printf("PATCH");
|
||||
else if(request->method() == HTTP_HEAD)
|
||||
Serial.printf("HEAD");
|
||||
else if(request->method() == HTTP_OPTIONS)
|
||||
Serial.printf("OPTIONS");
|
||||
else
|
||||
Serial.printf("UNKNOWN");
|
||||
Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
|
||||
|
||||
if(request->contentLength()){
|
||||
Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str());
|
||||
Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength());
|
||||
}
|
||||
|
||||
int headers = request->headers();
|
||||
int i;
|
||||
for(i=0;i<headers;i++){
|
||||
AsyncWebHeader* h = request->getHeader(i);
|
||||
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
|
||||
}
|
||||
|
||||
int params = request->params();
|
||||
for(i=0;i<params;i++){
|
||||
AsyncWebParameter* p = request->getParam(i);
|
||||
if(p->isFile()){
|
||||
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
|
||||
} else if(p->isPost()){
|
||||
Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
|
||||
} else {
|
||||
Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
request->send(404);
|
||||
});
|
||||
server.onFileUpload([](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){
|
||||
if(!index)
|
||||
Serial.printf("UploadStart: %s\n", filename.c_str());
|
||||
Serial.printf("%s", (const char*)data);
|
||||
if(final)
|
||||
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index+len);
|
||||
});
|
||||
server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){
|
||||
if(!index)
|
||||
Serial.printf("BodyStart: %u\n", total);
|
||||
Serial.printf("%s", (const char*)data);
|
||||
if(index + len == total)
|
||||
Serial.printf("BodyEnd: %u\n", total);
|
||||
});
|
||||
|
||||
server.on("/setWiFi", HTTP_POST, [](AsyncWebServerRequest *request) {
|
||||
int params = request->params();
|
||||
settings.begin("WiFi");
|
||||
if(params = 4){
|
||||
for(int i=0;i<params;i++){
|
||||
AsyncWebParameter* p = request->getParam(i);
|
||||
if(p->isPost()){
|
||||
// HTTP POST ssid value
|
||||
if (p->name() == "ssid") {
|
||||
ssid = p->value().c_str();
|
||||
Serial.print("SSID set to: ");
|
||||
Serial.println(ssid);
|
||||
// Write file to save value
|
||||
// writeFile(SPIFFS, ssidPath, ssid.c_str());
|
||||
// settings.putString("ssid",ssid);
|
||||
}
|
||||
// HTTP POST pass value
|
||||
if (p->name() == "pass") {
|
||||
pass = p->value().c_str();
|
||||
Serial.print("Password set to: ");
|
||||
Serial.println(pass);
|
||||
// Write file to save value
|
||||
// writeFile(SPIFFS, passPath, pass.c_str());
|
||||
// settings.putString("pass",pass);
|
||||
}
|
||||
// HTTP POST ip value
|
||||
if (p->name() == "ip") {
|
||||
ip = p->value().c_str();
|
||||
Serial.print("IP Address set to: ");
|
||||
Serial.println(ip);
|
||||
// Write file to save value
|
||||
// writeFile(SPIFFS, ipPath, ip.c_str());
|
||||
// settings.putString("ip",ip);
|
||||
}
|
||||
// HTTP POST gateway value
|
||||
if (p->name() == "gateway") {
|
||||
gateway = p->value().c_str();
|
||||
Serial.print("Gateway set to: ");
|
||||
Serial.println(gateway);
|
||||
// Write file to save value
|
||||
// writeFile(SPIFFS, gatewayPath, gateway.c_str());
|
||||
// settings.putString("gateway",gateway);
|
||||
}
|
||||
//Serial.printf("POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
|
||||
}
|
||||
}
|
||||
settings.putString(ssid.c_str(),(pass+","+ip+","+gateway+",1"));
|
||||
settings.end();
|
||||
request->send(200, "text/plain", "Done. ESP will restart, connect to your router and go to IP address: " + ip);
|
||||
delay(3000);
|
||||
ESP.restart();
|
||||
}
|
||||
});
|
||||
|
||||
server.begin();
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
||||
|
||||
// functions
|
||||
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
|
||||
if(type == WS_EVT_CONNECT){
|
||||
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
|
||||
client->printf("Hello Client %u :)", client->id());
|
||||
client->ping();
|
||||
} else if(type == WS_EVT_DISCONNECT){
|
||||
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id());
|
||||
} else if(type == WS_EVT_ERROR){
|
||||
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
|
||||
} else if(type == WS_EVT_PONG){
|
||||
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:"");
|
||||
} else if(type == WS_EVT_DATA){
|
||||
AwsFrameInfo * info = (AwsFrameInfo*)arg;
|
||||
String msg = "";
|
||||
if(info->final && info->index == 0 && info->len == len){
|
||||
//the whole message is in a single frame and we got all of it's data
|
||||
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len);
|
||||
|
||||
if(info->opcode == WS_TEXT){
|
||||
for(size_t i=0; i < info->len; i++) {
|
||||
msg += (char) data[i];
|
||||
}
|
||||
} else {
|
||||
char buff[3];
|
||||
for(size_t i=0; i < info->len; i++) {
|
||||
sprintf(buff, "%02x ", (uint8_t) data[i]);
|
||||
msg += buff ;
|
||||
}
|
||||
}
|
||||
Serial.printf("%s\n",msg.c_str());
|
||||
|
||||
if(info->opcode == WS_TEXT)
|
||||
client->text("I got your text message");
|
||||
else
|
||||
client->binary("I got your binary message");
|
||||
} else {
|
||||
//message is comprised of multiple frames or the frame is split into multiple packets
|
||||
if(info->index == 0){
|
||||
if(info->num == 0)
|
||||
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary");
|
||||
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len);
|
||||
}
|
||||
|
||||
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len);
|
||||
|
||||
if(info->opcode == WS_TEXT){
|
||||
for(size_t i=0; i < len; i++) {
|
||||
msg += (char) data[i];
|
||||
}
|
||||
} else {
|
||||
char buff[3];
|
||||
for(size_t i=0; i < len; i++) {
|
||||
sprintf(buff, "%02x ", (uint8_t) data[i]);
|
||||
msg += buff ;
|
||||
}
|
||||
}
|
||||
Serial.printf("%s\n",msg.c_str());
|
||||
|
||||
if((info->index + len) == info->len){
|
||||
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len);
|
||||
if(info->final){
|
||||
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary");
|
||||
if(info->message_opcode == WS_TEXT)
|
||||
client->text("I got your text message");
|
||||
else
|
||||
client->binary("I got your binary message");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize SPIFFS
|
||||
void initSPIFFS() {
|
||||
if (!SPIFFS.begin(true)) {
|
||||
|
||||
Reference in New Issue
Block a user