esp8266-sensor/wifi.ino
2019-03-29 20:41:00 +01:00

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(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;
}