157 lines
4.8 KiB
C++
157 lines
4.8 KiB
C++
/*********************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("bathroom"); //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;
|
|
}
|