From 82adad474620ea2f521cd735f777e7c4ac42d89b Mon Sep 17 00:00:00 2001 From: "rjwats@gmail.com" Date: Tue, 6 Mar 2018 22:39:33 +0000 Subject: [PATCH] introduce captive portal, tidy up ap management code --- src/APSettingsService.cpp | 57 ++++++++++++++++++++++++++++++--------- src/APSettingsService.h | 14 ++++++++++ 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/APSettingsService.cpp b/src/APSettingsService.cpp index 1387e98..4aecb41 100644 --- a/src/APSettingsService.cpp +++ b/src/APSettingsService.cpp @@ -8,20 +8,53 @@ APSettingsService::~APSettingsService() {} void APSettingsService::loop() { unsigned long now = millis(); if (_manageAtMillis <= now){ - WiFiMode_t currentWiFiMode = WiFi.getMode(); - if (_provisionMode == AP_MODE_ALWAYS || (_provisionMode == AP_MODE_DISCONNECTED && WiFi.status() != WL_CONNECTED)) { - if (currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA){ - Serial.println("Starting software access point"); - WiFi.softAP(_ssid.c_str(), _password.c_str()); - } - } else { - if (currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA){ - Serial.println("Stopping software access point"); - WiFi.softAPdisconnect(true); - } - } + manageAP(); _manageAtMillis = now + MANAGE_NETWORK_DELAY; } + handleDNS(); +} + +void APSettingsService::manageAP() { + WiFiMode_t currentWiFiMode = WiFi.getMode(); + if (_provisionMode == AP_MODE_ALWAYS || (_provisionMode == AP_MODE_DISCONNECTED && WiFi.status() != WL_CONNECTED)) { + if (currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) { + startAP(); + } + } else { + if (currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA) { + stopAP(); + } + } +} + +void APSettingsService::startAP() { + Serial.println("Starting software access point"); + WiFi.softAP(_ssid.c_str(), _password.c_str()); + + if (!_dnsServer) { + IPAddress apIp = WiFi.softAPIP(); + Serial.print("Starting captive portal on "); + Serial.println(apIp); + _dnsServer = new DNSServer; + _dnsServer->start(DNS_PORT, "*", apIp); + } +} + +void APSettingsService::stopAP() { + if (_dnsServer) { + Serial.println("Stopping captive portal"); + _dnsServer->stop(); + delete _dnsServer; + _dnsServer = NULL; + } + Serial.println("Stopping software access point"); + WiFi.softAPdisconnect(true); +} + +void APSettingsService::handleDNS() { + if (_dnsServer) { + _dnsServer->processNextRequest(); + } } void APSettingsService::readFromJsonObject(JsonObject& root) { diff --git a/src/APSettingsService.h b/src/APSettingsService.h index f6a6576..d652d6b 100644 --- a/src/APSettingsService.h +++ b/src/APSettingsService.h @@ -1,6 +1,7 @@ #ifndef APSettingsConfig_h #define APSettingsConfig_h +#include #include #include @@ -10,6 +11,8 @@ #define AP_MODE_DISCONNECTED 1 #define AP_MODE_NEVER 2 +#define DNS_PORT 53 + #define AP_DEFAULT_SSID "ssid" #define AP_DEFAULT_PASSWORD "password" @@ -33,11 +36,22 @@ class APSettingsService : public SettingsService { private: + // access point settings int _provisionMode; String _ssid; String _password; + + // for the mangement delay loop unsigned long _manageAtMillis; + // for the captive portal + DNSServer *_dnsServer; + + void manageAP(); + void startAP(); + void stopAP(); + void handleDNS(); + }; #endif // end APSettingsConfig_h