/*********************Wifi Client init **************************************/ bool resolveHosts(bool rtcValid) { if (rtcValid && rtcData.mqttServer.isV4()) { mqttBroker = rtcData.mqttServer; } else { //DNS lookup if(WiFi.hostByName(MQTT_SERVER, mqttBroker)) { rtcData.mqttServer = mqttBroker; } else { return false; } } return true; } bool wifi_connect() { bool rtcValid = false; // Try to read WiFi settings from RTC memory if( ESP.rtcUserMemoryRead( WiFi_RTC, (uint32_t*)&rtcData, sizeof( rtcData ) ) ) { // Calculate the CRC of what we just read from RTC memory, but skip the first 4 bytes as that's the checksum itself. uint32_t crc = calculateCRC32( ((uint8_t*)&rtcData) + 4, sizeof( rtcData ) - 4 ); if( crc == rtcData.crc32 ) { rtcValid = true; } #ifdef SERIAL_DEBUG Serial.println("\trtcData.channel: \t\t" + String(rtcData.channel)); Serial.println("\trtcData.txPow: \t\t" + String(rtcData.txPow)); Serial.println("\trtcData.mqttServer:\t" + String(((IPAddress)rtcData.mqttServer).toString())); #endif } #ifdef OLED_OUTPUT display.clear(); display.drawStringMaxWidth(0, 0, 128, "WiFi init" ); display.display(); display.drawStringMaxWidth(0, 16, 128, "WiFi: " + String(WLAN_SSID)); display.display(); #endif #ifdef SERIAL_DEBUG Serial.println(); Serial.print("Connecting to "); Serial.println(WLAN_SSID); #endif WiFi.forceSleepWake(); delay(10); WiFi.mode(WIFI_STA); yield(); // Disable the WiFi persistence. The ESP8266 will not load and save WiFi settings in the flash memory. // http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-class.html#persistent WiFi.persistent (false); WiFi.hostname(name); //ToDo Change to correct value WiFi.config(ip, gateway, subnet, dns); // Connect to WiFi access point. if( rtcValid ) { // The RTC data was good, make a quick connection if (rtcData.txPow > 0 ) { rtcData.txPow=rtcData.txPow-1; WiFi.setOutputPower(rtcData.txPow); yield(); } WiFi.begin( WLAN_SSID, WLAN_PASS, rtcData.channel, rtcData.bssid, true ); #ifdef SERIAL_DEBUG Serial.println("RTC WiFi used"); Serial.println("\tCurrent Powerlevel: \t" + String(rtcData.txPow*4) + "dB"); #endif } else { //raise outputPower to max WiFi.setOutputPower(10); rtcData.txPow = 10; // The RTC data was not valid, so make a regular connection WiFi.begin( WLAN_SSID, WLAN_PASS ); yield(); delay(10); } #ifdef SERIAL_DEBUG Serial.print("WiFi started"); //WiFi.printDiag(Serial); #endif int i = 0; uint64_t sTime = millis(); while (WiFi.status() != WL_CONNECTED) { delay(200); i++; yield(); #ifdef SERIAL_DEBUG Serial.print("."); #endif if ((millis() - sTime) > WIFI_CONNECT_TIMEOUT * 1000) // wifi connection lasts too ling, retry { #ifdef SERIAL_DEBUG Serial.println("WiFi connect timeout!"); #endif //raise transmit power for next retry rtcData.txPow=rtcData.txPow+1; //make the crc invalid ESP.rtcUserMemoryWrite (WiFi_RTC, (uint32_t*)&rtcData , sizeof( rtcData ) ); return false; } //every two second raise the TX power if (i%4 == 0) { rtcData.txPow = rtcData.txPow+1; WiFi.setOutputPower(rtcData.txPow); yield(); #ifdef SERIAL_DEBUG Serial.println("\tWiFi TX Power raised: \t" + String(rtcData.txPow) + "counter"); #endif } yield(); } //ToDo stupid TX power correlation --needs improvement long rssi = WiFi.RSSI(); //rtcData.txPow = int((72+rssi)/4)+rtcData.txPow; if (rssi > -60 ) { rtcData.txPow = 0; } #ifdef SERIAL_DEBUG Serial.println("\n\r\tWiFi Connect Time: \t" + String(float((millis() - sTime)/1000)) + " s"); Serial.println("\tWiFi RSSI: \t\t" + String(rssi) + " dB"); Serial.println("\tWiFi next TX Power: \t" + String(rtcData.txPow) + " counter"); #endif // Write current connection info back to RTC resolveHosts( rtcValid ); rtcData.channel = WiFi.channel(); memcpy( rtcData.bssid, WiFi.BSSID(), 6 ); // Copy 6 bytes of BSSID (AP's MAC address) rtcData.crc32 = calculateCRC32( ((uint8_t*)&rtcData) + 4, sizeof( rtcData ) - 4 ); ESP.rtcUserMemoryWrite (WiFi_RTC, (uint32_t*)&rtcData , sizeof( rtcData ) ); #ifdef SERIAL_DEBUG Serial.println("\tIP address: \t\t" + WiFi.localIP().toString() ); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, "IP: " + WiFi.localIP().toString()); display.display(); #endif return true; } bool wifi_disconnect() { //exit gracefully from WiFi AP - delete credentials WiFi.disconnect(true); yield(); #ifdef SERIAL_DEBUG Serial.println("WiFi disconnected"); #endif //shutdown WiFi modul WiFi.mode(WIFI_OFF); // set WiFi to sleep WiFi.forceSleepBegin(); yield(); return true; }