149 lines
4.7 KiB
C++
149 lines
4.7 KiB
C++
/*
|
|
* Wifi and OTA related stuff
|
|
*/
|
|
|
|
#include <time.h>
|
|
#include <ESP8266WiFi.h>
|
|
#include <WiFiClientSecure.h>
|
|
#include <WiFiManager.h>
|
|
#include <ESP8266httpUpdate.h>
|
|
|
|
WiFiManager WifiManager;
|
|
WiFiClientSecure net;
|
|
|
|
//BearSSL::WiFiClientSecure net;
|
|
|
|
unsigned long ota_lastcheck = 0;
|
|
|
|
//
|
|
// If the WifiManager configuration portal is called, we can do stuff
|
|
//
|
|
//void WifiManagerCallback(WiFiManager *myWiFiManager) {
|
|
// PRINTLN_SERIAL("Entered AP config mode");
|
|
//}
|
|
|
|
void wifi_associate() {
|
|
char apname[80];
|
|
settings.name.toCharArray(apname, 80);
|
|
|
|
WifiManager.setConfigPortalTimeout(300); // If no configuration is done in 5 mins, exit/restart quietly
|
|
if (WifiManager.autoConnect(apname)) { // @@@FIXME@@@ we should really set a PSK for the AP (but in my brief testing it crashed the ESP, so what's up with that)
|
|
settings.ip = WiFi.localIP().toString();
|
|
PRINTLN_SERIAL("Figured out my network \\O/");
|
|
|
|
//wificlient.setFingerprint(WTR_SHA1);
|
|
net.setInsecure(); // Do not check fingerprint
|
|
net.setTimeout(15000); // 15 Seconds
|
|
|
|
PRINT_SERIAL("Setting time using SNTP");
|
|
configTime(-5 * 3600, 0, "pool.ntp.org", "time.nist.gov");
|
|
now = time(nullptr);
|
|
while (now < 1510592825) {
|
|
delay(500);
|
|
APPEND_SERIAL(".");
|
|
now = time(nullptr);
|
|
}
|
|
APPENDLN_SERIAL(" done!");
|
|
struct tm timeinfo;
|
|
gmtime_r(&now, &timeinfo);
|
|
PRINT_SERIAL("Current time: ");
|
|
APPENDLN_SERIAL(asctime(&timeinfo));
|
|
}
|
|
}
|
|
|
|
void wifi_checkin() {
|
|
// 'Native' in WiFiClient because we need to push the entire clientbuffer in the API
|
|
// As a result copying the buffer in to a new String for HTTPClient library use is highly inefficient
|
|
if (!net.connect(OTA_SERVER, OTA_PORT)) {
|
|
Serial.println("HTTPS connection failed");
|
|
} else {
|
|
Serial.println("HTTPS connection up");
|
|
|
|
// Check for firmware upgrades
|
|
String version = settings.name;
|
|
version.concat("-v");
|
|
version.concat(FW_VERSION);
|
|
|
|
String json = "{\"mac\":\"" + WiFi.macAddress() + "\",";
|
|
json.concat("\"version\":\"" + version + "\",");
|
|
json.concat("\"millis\":" + String(millis()) + "}");
|
|
|
|
// Send request to the server:
|
|
net.println("POST " OTA_CHECKIN " HTTP/1.1");
|
|
net.println("Host: " OTA_SERVER);
|
|
net.println("Accept: */*");
|
|
net.println("Content-Type: application/json");
|
|
net.print("Content-Length: ");
|
|
net.println(json.length());
|
|
net.println("Connection: close");
|
|
net.println();
|
|
// Construct the REST/JSON POST data
|
|
net.print(json);
|
|
Serial.println("POST sent");
|
|
|
|
while (net.connected()) {
|
|
String line = net.readStringUntil('\n');
|
|
if (line == "\r") {
|
|
Serial.println("Headers received");
|
|
break;
|
|
}
|
|
}
|
|
String line = net.readStringUntil('\n');
|
|
Serial.println("reply was:");
|
|
Serial.println("==========");
|
|
Serial.println(line);
|
|
Serial.println("==========");
|
|
Serial.println("closing connection");
|
|
net.stop(); // DISCONNECT FROM THE SERVER
|
|
}
|
|
}
|
|
|
|
void wifi_setup() {
|
|
// WifiManager.setAPCallback(WifiManagerCallback); // Enable WifiManager callback to clear the cache
|
|
wifi_associate();
|
|
}
|
|
|
|
void wifi_loop() {
|
|
|
|
if(WiFi.status() != WL_CONNECTED) {
|
|
PRINTLN_SERIAL("Wifi disconnected, trying to reconnect");
|
|
wifi_associate();
|
|
}
|
|
|
|
// OTA routine to be run once every X seconds
|
|
unsigned long ota_check = millis()/1000;
|
|
if((ota_lastcheck == 0) || ((ota_check - ota_lastcheck) > OTA_UPDATE_INTERVAL)) {
|
|
PRINTLN_SERIAL("Checking for OTA update");
|
|
|
|
// Check for firmware upgrades
|
|
String version = settings.name;
|
|
version.concat("-v");
|
|
version.concat(FW_VERSION);
|
|
PRINTLN_SERIAL("net.status: " + String(net.status()));
|
|
|
|
t_httpUpdate_return ret = ESPhttpUpdate.update(net, OTA_SERVER, OTA_PORT, OTA_URI, version);
|
|
PRINTLN_SERIAL("after httpupdate check net.status: " + String(net.status()));
|
|
|
|
switch(ret) {
|
|
case HTTP_UPDATE_FAILED: // HTTP 403, 404
|
|
PRINT_SERIAL("Connection error, update failed ");
|
|
APPEND_SERIAL("(ERR ");
|
|
APPEND_SERIAL(String(ESPhttpUpdate.getLastError()));
|
|
APPEND_SERIAL(") ");
|
|
APPENDLN_SERIAL(ESPhttpUpdate.getLastErrorString().c_str());
|
|
break;
|
|
case HTTP_UPDATE_NO_UPDATES: // HTTP 304
|
|
PRINTLN_SERIAL("No firmware upgrade available");
|
|
break;
|
|
case HTTP_UPDATE_OK: // HTTP 200
|
|
PRINTLN_SERIAL("Firmware upgrade available, upgraded ok."); // may not called we reboot the ESP
|
|
break;
|
|
}
|
|
ota_lastcheck = ota_check;
|
|
|
|
// Check in with IoT server
|
|
wifi_checkin();
|
|
}
|
|
|
|
}
|