|  |  | @ -8,6 +8,7 @@ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #if defined(ESP8266) | 
			
		
	
		
			
				
					|  |  |  | #include <functional> | 
			
		
	
		
			
				
					|  |  |  | #include <list> | 
			
		
	
		
			
				
					|  |  |  | #include <WiFiUdp.h> | 
			
		
	
		
			
				
					|  |  |  | #include "AhoyNetwork.h" | 
			
		
	
		
			
				
					|  |  |  | #include "ESPAsyncWebServer.h" | 
			
		
	
	
		
			
				
					|  |  | @ -23,18 +24,15 @@ class AhoyWifi : public AhoyNetwork { | 
			
		
	
		
			
				
					|  |  |  |             }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             WiFi.setHostname(mConfig->sys.deviceName); | 
			
		
	
		
			
				
					|  |  |  |             #if !defined(AP_ONLY) | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINT(F("connect to network '")); Serial.flush(); | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINT(mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |             #endif | 
			
		
	
		
			
				
					|  |  |  |             mBSSIDList.clear(); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         void tickNetworkLoop() override { | 
			
		
	
		
			
				
					|  |  |  |             if(mAp.isEnabled()) | 
			
		
	
		
			
				
					|  |  |  |                 mAp.tickLoop(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             mCnt++; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             switch(mStatus) { | 
			
		
	
		
			
				
					|  |  |  |                 case NetworkState::DISCONNECTED: | 
			
		
	
		
			
				
					|  |  |  |                     if(mConnected) { | 
			
		
	
	
		
			
				
					|  |  | @ -46,6 +44,45 @@ class AhoyWifi : public AhoyNetwork { | 
			
		
	
		
			
				
					|  |  |  |                     if (WiFi.softAPgetStationNum() > 0) { | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINTLN(F("AP client connected")); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     #if !defined(AP_ONLY) | 
			
		
	
		
			
				
					|  |  |  |                     else if (!mScanActive) { | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINT(F("scanning APs with SSID ")); | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINTLN(String(mConfig->sys.stationSsid)); | 
			
		
	
		
			
				
					|  |  |  |                         mScanCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |                         mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |                         mScanActive = true; | 
			
		
	
		
			
				
					|  |  |  |                         WiFi.scanNetworks(true, true, 0U, ([this]() { | 
			
		
	
		
			
				
					|  |  |  |                             if (mConfig->sys.isHidden) | 
			
		
	
		
			
				
					|  |  |  |                                 return (uint8_t*)NULL; | 
			
		
	
		
			
				
					|  |  |  |                             return (uint8_t*)(mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |                         })()); | 
			
		
	
		
			
				
					|  |  |  |                     } else if(getBSSIDs()) { | 
			
		
	
		
			
				
					|  |  |  |                         mStatus = NetworkState::SCAN_READY; | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINT(F("connect to network '")); Serial.flush(); | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINTLN(mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     #endif | 
			
		
	
		
			
				
					|  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 case NetworkState::SCAN_READY: | 
			
		
	
		
			
				
					|  |  |  |                     mStatus = NetworkState::CONNECTING; | 
			
		
	
		
			
				
					|  |  |  |                     DBGPRINT(F("try to connect to BSSID:")); | 
			
		
	
		
			
				
					|  |  |  |                     uint8_t bssid[6]; | 
			
		
	
		
			
				
					|  |  |  |                     for (int j = 0; j < 6; j++) { | 
			
		
	
		
			
				
					|  |  |  |                         bssid[j] = mBSSIDList.front(); | 
			
		
	
		
			
				
					|  |  |  |                         mBSSIDList.pop_front(); | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINT(" "  + String(bssid[j], HEX)); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     DBGPRINTLN(""); | 
			
		
	
		
			
				
					|  |  |  |                     mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |                     WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd, 0, &bssid[0]); | 
			
		
	
		
			
				
					|  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 case NetworkState::CONNECTING: | 
			
		
	
		
			
				
					|  |  |  |                     if (isTimeout(TIMEOUT)) { | 
			
		
	
		
			
				
					|  |  |  |                         WiFi.disconnect(); | 
			
		
	
		
			
				
					|  |  |  |                         mStatus = mBSSIDList.empty() ? NetworkState::DISCONNECTED : NetworkState::SCAN_READY; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 case NetworkState::CONNECTED: | 
			
		
	
	
		
			
				
					|  |  | @ -104,8 +141,45 @@ class AhoyWifi : public AhoyNetwork { | 
			
		
	
		
			
				
					|  |  |  |                         std::swap(sort[i], sort[j]); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         bool getBSSIDs() { | 
			
		
	
		
			
				
					|  |  |  |             bool result = false; | 
			
		
	
		
			
				
					|  |  |  |             int n = WiFi.scanComplete(); | 
			
		
	
		
			
				
					|  |  |  |             if (n < 0) { | 
			
		
	
		
			
				
					|  |  |  |                 if (++mScanCnt < 20) | 
			
		
	
		
			
				
					|  |  |  |                     return false; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             if(n > 0) { | 
			
		
	
		
			
				
					|  |  |  |                 mBSSIDList.clear(); | 
			
		
	
		
			
				
					|  |  |  |                 int sort[n]; | 
			
		
	
		
			
				
					|  |  |  |                 sortRSSI(&sort[0], n); | 
			
		
	
		
			
				
					|  |  |  |                 for (int i = 0; i < n; i++) { | 
			
		
	
		
			
				
					|  |  |  |                     DBGPRINT("BSSID " + String(i) + ":"); | 
			
		
	
		
			
				
					|  |  |  |                     uint8_t *bssid = WiFi.BSSID(sort[i]); | 
			
		
	
		
			
				
					|  |  |  |                     for (int j = 0; j < 6; j++){ | 
			
		
	
		
			
				
					|  |  |  |                         DBGPRINT(" " + String(bssid[j], HEX)); | 
			
		
	
		
			
				
					|  |  |  |                         mBSSIDList.push_back(bssid[j]); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     DBGPRINTLN(""); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 result = true; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             mScanActive = false; | 
			
		
	
		
			
				
					|  |  |  |             WiFi.scanDelete(); | 
			
		
	
		
			
				
					|  |  |  |             return result; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         bool isTimeout(uint8_t timeout) { | 
			
		
	
		
			
				
					|  |  |  |             return ((mCnt % timeout) == 0); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     private: | 
			
		
	
		
			
				
					|  |  |  |         uint8_t mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |         uint8_t mScanCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |         bool mScanActive = false; | 
			
		
	
		
			
				
					|  |  |  |         bool mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |         std::list<uint8_t> mBSSIDList; | 
			
		
	
		
			
				
					|  |  |  |         static constexpr uint8_t TIMEOUT = 20; | 
			
		
	
		
			
				
					|  |  |  |         static constexpr uint8_t SCAN_TIMEOUT = 10; | 
			
		
	
		
			
				
					|  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #endif /*ESP8266*/ | 
			
		
	
	
		
			
				
					|  |  | 
 |