From bc56f8af4a908437887bec95cc13159d50d8dc25 Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Tue, 3 Nov 2020 23:35:19 +0100 Subject: [PATCH 1/3] add ftp server, config still missing --- platformio.ini | 1 + src/LoRa_APRS_iGate.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/platformio.ini b/platformio.ini index 3fda3a6..83e69c4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,6 +15,7 @@ lib_deps = sandeepmistry/LoRa @ 0.7.2 peterus/APRS-Decoder-Lib @ 0.0.5 peterus/APRS-IS-Lib @ 0.0.7 + https://github.com/peterus/ESP-FTP-Server-Lib peterus/LoRa-APRS-Lib @ 0.0.5 check_tool = cppcheck check_flags = diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 6500eee..50e657a 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -6,6 +6,9 @@ #include #include #include +#include +#include +#include #include "LoRa_APRS.h" @@ -28,6 +31,7 @@ volatile uint secondsSinceDisplay = 0; WiFiMulti WiFiMulti; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, 60*60); +FTPServer ftpServer; Configuration Config; APRS_IS * aprs_is = 0; LoRa_APRS lora_aprs; @@ -43,6 +47,7 @@ void setup_lora(); void setup_ntp(); void setup_aprs_is(); void setup_timer(); +void setup_ftp(); std::map> lastMessages; @@ -77,6 +82,7 @@ void setup() setup_wifi(); setup_ota(); setup_ntp(); + setup_ftp(); } else { @@ -133,6 +139,19 @@ void loop() beacon_digi = true; } + ftpServer.handle(); + static bool configWasOpen = false; + if(configWasOpen && ftpServer.countConnections() == 0) + { + Serial.println("[WARN] Configuration maybe changed via FTP, will restart now..."); + Serial.println(); + ESP.restart(); + } + if(ftpServer.countConnections() > 0) + { + configWasOpen = true; + } + if(Config.wifi.active) ArduinoOTA.handle(); if(Config.wifi.active && WiFiMulti.run() != WL_CONNECTED) { @@ -424,6 +443,16 @@ void setup_timer() timerAlarmEnable(timer); } +void setup_ftp() +{ +#define FTP_USER "ftp" +#define FTP_PASSWORD "ftp" + ftpServer.addUser(FTP_USER, FTP_PASSWORD); + ftpServer.addFilesystem("SPIFFS", &SPIFFS); + ftpServer.begin(); + Serial.println("[INFO] FTP Server init done!"); +} + String create_lat_aprs(double lat) { char str[20]; From b4be3c5d6aa9802cd8d95035225e777f3f6e818e Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Wed, 4 Nov 2020 00:15:46 +0100 Subject: [PATCH 2/3] add ftp config --- data/is-cfg.json | 7 +++++++ src/LoRa_APRS_iGate.cpp | 36 +++++++++++++++++++++++------------- src/configuration.cpp | 32 +++++++++++++++++++++++++++----- src/configuration.h | 19 ++++++++++++++++++- 4 files changed, 75 insertions(+), 19 deletions(-) diff --git a/data/is-cfg.json b/data/is-cfg.json index 6072030..8c02d2b 100644 --- a/data/is-cfg.json +++ b/data/is-cfg.json @@ -47,5 +47,12 @@ "always_on": true, "timeout":10, "overwrite_pin":0 + }, + "ftp": + { + "active":false, + "user": [ + { "name":"ftp", "password":"ftp" } + ] } } diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 50e657a..ae175a8 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -139,17 +139,20 @@ void loop() beacon_digi = true; } - ftpServer.handle(); - static bool configWasOpen = false; - if(configWasOpen && ftpServer.countConnections() == 0) + if(Config.ftp.active) { - Serial.println("[WARN] Configuration maybe changed via FTP, will restart now..."); - Serial.println(); - ESP.restart(); - } - if(ftpServer.countConnections() > 0) - { - configWasOpen = true; + ftpServer.handle(); + static bool configWasOpen = false; + if(configWasOpen && ftpServer.countConnections() == 0) + { + Serial.println("[WARN] Maybe the config has been changed via FTP, lets restart now to get the new config..."); + Serial.println(); + ESP.restart(); + } + if(ftpServer.countConnections() > 0) + { + configWasOpen = true; + } } if(Config.wifi.active) ArduinoOTA.handle(); @@ -445,9 +448,16 @@ void setup_timer() void setup_ftp() { -#define FTP_USER "ftp" -#define FTP_PASSWORD "ftp" - ftpServer.addUser(FTP_USER, FTP_PASSWORD); + if(!Config.ftp.active) + { + return; + } + for(Configuration::Ftp::User user : Config.ftp.users) + { + Serial.print("[INFO] Adding user to FTP Server: "); + Serial.println(user.name); + ftpServer.addUser(user.name, user.password); + } ftpServer.addFilesystem("SPIFFS", &SPIFFS); ftpServer.begin(); Serial.println("[INFO] FTP Server init done!"); diff --git a/src/configuration.cpp b/src/configuration.cpp index 3d7d24e..30d117c 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -31,19 +31,21 @@ Configuration ConfigurationManagement::readConfiguration() Serial.println("Failed to open file for reading..."); return Configuration(); } - DynamicJsonDocument data(1024); + DynamicJsonDocument data(2048); deserializeJson(data, file); + //serializeJson(data, Serial); + //Serial.println(); file.close(); Configuration conf; conf.callsign = data["callsign"].as(); conf.wifi.active = data["wifi"]["active"]; - JsonArray aps = data["wifi"]["AP"].as(); + JsonArray aps = data["wifi"]["AP"].as(); for(JsonVariant v : aps) { Configuration::Wifi::AP ap; - ap.SSID = v["SSID"].as(); - ap.password = v["password"].as(); + ap.SSID = v["SSID"].as(); + ap.password = v["password"].as(); conf.wifi.APs.push_back(ap); } conf.beacon.message = data["beacon"]["message"].as(); @@ -75,6 +77,18 @@ Configuration ConfigurationManagement::readConfiguration() conf.lora.signalBandwidth = data["lora"]["signal_bandwidth"]; conf.lora.codingRate4 = data["lora"]["coding_rate4"]; } + if(data["version"] >= 4) + { + conf.ftp.active = data["ftp"]["active"]; + JsonArray users = data["ftp"]["user"].as(); + for(JsonVariant u : users) + { + Configuration::Ftp::User us; + us.name = u["name"].as(); + us.password = u["password"].as(); + conf.ftp.users.push_back(us); + } + } // update config in memory to get the new fields: writeConfiguration(conf); @@ -90,7 +104,7 @@ void ConfigurationManagement::writeConfiguration(Configuration conf) Serial.println("Failed to open file for writing..."); return; } - DynamicJsonDocument data(1024); + DynamicJsonDocument data(2048); data["version"] = conf.version; data["callsign"] = conf.callsign; @@ -124,6 +138,14 @@ void ConfigurationManagement::writeConfiguration(Configuration conf) data["display"]["always_on"] = conf.display.alwaysOn; data["display"]["timeout"] = conf.display.timeout; data["display"]["overwrite_pin"] = conf.display.overwritePin; + data["ftp"]["active"] = conf.ftp.active; + JsonArray users = data["ftp"].createNestedArray("user"); + for(Configuration::Ftp::User u : conf.ftp.users) + { + JsonObject v = users.createNestedObject(); + v["name"] = u.name; + v["password"] = u.password; + } serializeJson(data, file); //serializeJson(data, Serial); diff --git a/src/configuration.h b/src/configuration.h index 39cdd0d..c73f615 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -82,7 +82,23 @@ public: int overwritePin; }; - Configuration() : version(3), callsign("NOCALL-10") {}; + class Ftp + { + public: + class User + { + public: + String name; + String password; + }; + + Ftp() : active(false) {} + + bool active; + std::list users; + }; + + Configuration() : version(4), callsign("NOCALL-10") {}; int version; String callsign; @@ -92,6 +108,7 @@ public: Digi digi; LoRa lora; Display display; + Ftp ftp; }; class ConfigurationManagement From e8f8ae9fe407aed425e8fc9e737297b2b869fd8b Mon Sep 17 00:00:00 2001 From: Peter Buchegger Date: Wed, 4 Nov 2020 22:18:30 +0100 Subject: [PATCH 3/3] update FTP lib --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 83e69c4..0a43d7c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ lib_deps = sandeepmistry/LoRa @ 0.7.2 peterus/APRS-Decoder-Lib @ 0.0.5 peterus/APRS-IS-Lib @ 0.0.7 - https://github.com/peterus/ESP-FTP-Server-Lib + https://github.com/peterus/ESP-FTP-Server-Lib @ 0.9.3 peterus/LoRa-APRS-Lib @ 0.0.5 check_tool = cppcheck check_flags =