26.02.2017ESP8266 - ESPBasics Library
ESPBasics
Knihovna starající se o základní služby. Přijímá příkazy přes serial, umožňuje nastavit více AP, mezi kterýma pak zařízení přepíná, nastavuje FTP a webserver. Config ukládá na filesystem. Umožňuje rozšířit handlované Serial commandy.
Jako první po nastartování napište do serialu "<help>" pro zobrazení dostupných příkazů.
Ke stažení:
espbasicsdemo.zip
espbasicslibrary.zip
Použití:
espbasicsdemo.ino
/// ESP Basics module /// #include "ESPBasics.h" using namespace ESPBasics; ////// namespace Webserver { void Root() { server.send(200, "text/plain", "Non default handle"); } } void serialCommandHandler(String command, String value) { if(command == "whatever"){ Serial.println("Whatever command called with value: " + value); } } void setup(void){ /* Uncomment if you want to define your own 404 page WifiBasics::Settings::noDefault404 = true; */ /* Uncomment if you dont't want to init FTP server WifiBasics::Settings::noFTP = true; */ /* Uncomment if you dont't want to init HTTP server WifiBasics::Settings::noHTTP = true; */ // You can set custom Serial Command handler. ESPBasics::setSerialCommandHandler(serialCommandHandler); ESPBasics::setupStart(); // your setup code Serial.println("- Define URI listeners -"); server.on("/", Webserver::Root); // end of your setup code ESPBasics::setupEnd(); } void loop(void){ ESPBasics::loop(); // your loop code // end of your loop code }
Knihovna:
espbasics.h
/* * WifiBasics Library * ------------------ * version 1.1 * * FTP server * HTTP server * Multiple APs * Configurable over Serial or over FTP (config files are saved in filesystem) * * Use <help> in serial to get information about available commands */ #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <ESP8266WebServer.h> #include "ESP8266FtpServer.h" namespace ESPBasics { namespace Settings { String ftpConfig = "/.ftpconf"; String wifiConfig = "/.wificonf"; bool noDefault404 = false; bool noFTP = false; bool noHTTP = false; } namespace Tools { void fileCreate(String name) { File f = SPIFFS.open(name, "a"); if (!f) { Serial.print("File creation/opening failed: "); Serial.println(name); return; } f.close(); } void fileAppend(String name, String str) { File f = SPIFFS.open(name, "a"); if (!f) { Serial.print("File creation/opening failed: "); Serial.println(name); return; } f.println(str); f.close(); } void fileWrite(String name, String str) { File f = SPIFFS.open(name, "w"); if (!f) { Serial.print("File creation/opening failed: "); Serial.println(name); return; } f.println(str); f.close(); } String readFirstLine(String filename) { File f = SPIFFS.open(filename, "r"); if (!f) { Serial.print("File opening failed: "); Serial.println(filename); return ""; } while (f.available()) { String line = f.readStringUntil('\n'); line.replace('\r', '\0'); return line; } f.close(); } String getNthPart(String str, int n, char separator = ';') { int len = str.length(); int count = 0; int state = (n == 0 ? 1 : 0); char c; String result = ""; for (int i = 0; i < len; i++) { c = str[i]; switch (state) { case 0: if (c == separator) { count++; if (count == n) { state = 1; } } break; case 1: if (c == separator || c == 13 || c == 10) { return result; } else { result += c; } break; } } return result; } } namespace Command { void removeWifi(String ssid, bool silent = false) { if(!silent) Serial.println("- Remove Wifi -"); File f = SPIFFS.open(Settings::wifiConfig, "r"); if (f) { File tmp = SPIFFS.open(Settings::wifiConfig + ".tmp", "w"); if (tmp) { while (f.available()) { String line = f.readStringUntil('\n'); line.trim(); if(Tools::getNthPart(line, 0) != ssid){ tmp.println(line); } else if(silent) { Serial.println("- AP config will be replaced"); } } tmp.close(); f.close(); SPIFFS.remove(Settings::wifiConfig); SPIFFS.rename(Settings::wifiConfig + ".tmp", Settings::wifiConfig); if(!silent) Serial.println("- Wifi AP removed"); } else { Serial.println("! Cannot create temp file !"); } if(f){ f.close(); } } else { Serial.println("! Cannot read config file !"); } if(!silent) { Serial.println("-- Done"); Serial.println(); } } void addWifi(String value) { Serial.println("- Add Wifi -"); String line = ""; removeWifi(Tools::getNthPart(value, 0), true); line += Tools::getNthPart(value, 0); line += ";"; line += Tools::getNthPart(value, 1); line += ";"; Tools::fileAppend(Settings::wifiConfig, line); Serial.println("-- Done"); Serial.println(); } void wifiList() { Serial.println("- List of wifi APs -"); Tools::fileCreate(Settings::wifiConfig); File f = SPIFFS.open(Settings::wifiConfig, "r"); if (f) { while (f.available()) { String line = f.readStringUntil('\n'); const char * ssid; const char * password; String str_ssid = Tools::getNthPart(line, 0); String str_password = Tools::getNthPart(line, 1); ssid = str_ssid.c_str(); password = str_password.c_str(); Serial.print("SSID: "); Serial.print(ssid); Serial.print(" / Password: "); Serial.println(password); } f.close(); } else { Serial.println("! Cannot read config file !"); } Serial.println("-- Done"); Serial.println(); } void setFTP(String value) { Serial.println("- Set FTP -"); String line = ""; line += Tools::getNthPart(value, 0); line += ";"; line += Tools::getNthPart(value, 1); line += ";"; Tools::fileWrite(Settings::ftpConfig, line); Serial.println("-- Done"); Serial.println(); } void activeConnection() { Serial.println("- Active Connection -"); Serial.print("IP: "); Serial.println(WiFi.localIP()); Serial.print("SSID: "); Serial.println(WiFi.SSID()); Serial.println(); } } ///////////////// ///////////////// ///////////////// FtpServer ftpSrv; ESP8266WebServer server(80); ESP8266WiFiMulti wifiMulti; void (*serialCommandCallback)(String, String); const char* ssid = "Airlive"; const char* password = "abecedaabcd"; void setSerialCommandHandler(void (*cb)(String, String)) { serialCommandCallback = cb; } void defaultHandleNotFound() { String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } void handleSerialCommand(String command, String value) { Serial.println(); if(serialCommandCallback){ Serial.println("- Custom serial command handler prepared -"); serialCommandCallback(command, value); } if (command == "addwifi") { Command::addWifi(value); wifiMulti.addAP(Tools::getNthPart(value, 0).c_str(), Tools::getNthPart(value, 1).c_str()); } else if (command == "wifilist") { Command::wifiList(); } else if (command == "removewifi") { Command::removeWifi(value); } else if(command == "connection") { Command::activeConnection(); } else if (command == "setftp") { if(!Settings::noFTP) { Command::setFTP(value); Serial.println("- Init FTP -"); ftpSrv.begin(Tools::getNthPart(value, 0), Tools::getNthPart(value, 1)); } else { Serial.println("! FTP is turned off in firmware !"); } } else if (command == "help") { Serial.println(); Serial.println("- Help -"); Serial.println("--------"); Serial.println("<help> - This help"); Serial.println("<addwifi:SSID;PASSWORD> - Add Wifi AP. Device will connect to the more powerfull AP available. If the AP was defined, it's password is rewritten."); Serial.println("<removewifi:SSID> - Removes wifi AP if found in config file."); Serial.println("<wifilist> - Prints list of all APs device have defined."); if(!Settings::noFTP) { Serial.println("<setftp:USERNAME;PASSWORD> - Set username and password for FTP. Only one user can be defined. Set will overwrite previous setting."); } Serial.println("--------"); Serial.println(); } } int state = 0; String command = ""; String value = ""; void readCommandFromSerial() { if (Serial.available() > 0) { while (Serial.available() > 0) { char c = Serial.read(); //gets one byte from serial buffer switch (state) { case 0: if (c == '<') { state = 1; } break; case 1: if (c == ':' || c == '>' || c == 10) { if (c == '>' || c == 10) { handleSerialCommand(command, value); state = 0; } else { state = 2; } } else { command += c; } break; case 2: if (c == '>' || c == 10) { state = 0; handleSerialCommand(command, value); } else { value += c; } break; } if (state == 0) { command = ""; value = ""; } } } } void reconnect() { Serial.println(""); Serial.println("- Connecting -"); int i = 0; while (wifiMulti.run() != WL_CONNECTED) { if (i == 40) { Serial.println(); i = 0; } i++; Serial.print("."); delay(500); // Handle Serial commands readCommandFromSerial(); } Serial.println(""); Serial.println(""); Serial.println("- WiFi connected -"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print("SSID: "); Serial.println(WiFi.SSID()); Serial.println(""); delay(100); } char* string2char(String command){ if(command.length()!=0){ char *p = const_cast<char*>(command.c_str()); return p; } } void addAPs() { Serial.println("- Add Wifi APs from config -"); int count = 0; Tools::fileCreate(Settings::wifiConfig); File f = SPIFFS.open(Settings::wifiConfig, "r"); if (f) { while (f.available()) { count++; String line = f.readStringUntil('\n'); const char * ssid; const char * password; String str_ssid = Tools::getNthPart(line, 0); String str_password = Tools::getNthPart(line, 1); ssid = str_ssid.c_str(); password = str_password.c_str(); Serial.print("SSID: "); Serial.println(ssid); wifiMulti.addAP(ssid, password); } if(count == 0) { Serial.println("! Config empty. No APs used. !"); Serial.println("Add AP to connect to and reboot the device."); Serial.println("Use command: <addwifi:SSID;PASSWORD>"); } f.close(); } else { Serial.println("! Cannot read config file !"); } Serial.println(); } void setupStart() { // Init serial Serial.begin(115200); delay(10); Serial.println(); Serial.println(); Serial.println("-------------------------------"); Serial.println("-- Initialize basic services --"); Serial.println("-------------------------------"); Serial.println(); if (SPIFFS.begin()) { Serial.println("- Filesystem ready -"); } addAPs(); reconnect(); // Init HTTP server if(!Settings::noDefault404 && !Settings::noHTTP) server.onNotFound(defaultHandleNotFound); } void setupEnd() { if(!Settings::noHTTP) { server.begin(); Serial.println("- HTTP server started -"); } // Init FTP server if(!Settings::noFTP) { String ftpCredentials = Tools::readFirstLine(Settings::ftpConfig); ftpSrv.begin(Tools::getNthPart(ftpCredentials, 0), Tools::getNthPart(ftpCredentials, 1)); Serial.println("- FTP server started -"); } Serial.println(); Serial.println("---------------------------------"); Serial.println("---- Initialization finished ----"); Serial.println("---------------------------------"); Serial.println(); } void loop() { // Handle Serial commands readCommandFromSerial(); // Handle FTP server if(!Settings::noFTP) { ftpSrv.handleFTP(); } // Handle webserver server.handleClient(); // Hancle Wifi connection if (wifiMulti.run() != WL_CONNECTED) { Serial.println("WiFi disconnected!"); reconnect(); } } }
comments powered by Disqus