#include "AutoOTA.h" #include #include #include void AutoOTAClass::setServer(String server) { _server = server; } void AutoOTAClass::setModel(String model) { _model = model; } void AutoOTAClass::setVersion(String version) { _version = version; } void AutoOTAClass::onMessage(TMessageFunction fn) { _callback = fn; } String AutoOTAClass::getNewVersion() { return _newVersion; } String AutoOTAClass::getNewFirmware() { return _newFirmware; } String AutoOTAClass::getNewFileSystem() { return _newFileSystem; } int AutoOTAClass::getErrorNumber() { return _errorNumber; } String AutoOTAClass::getErrorString() { return _errorString; } String AutoOTAClass::_getPayload() { HTTPClient http; char url[100]; String payload = ""; _callback(AUTO_OTA_START); sprintf(url, "%s/%s/%s", _server.c_str(), _model.c_str(), _version.c_str()); http.begin(url); int httpCode = http.GET(); if (httpCode > 0) payload = http.getString(); http.end(); return payload; } bool AutoOTAClass::_checkUpdates() { String payload = _getPayload(); if (payload.length() == 0) { _callback(AUTO_OTA_NO_RESPONSE_ERROR); return false; } StaticJsonBuffer<500> jsonBuffer; JsonObject& response = jsonBuffer.parseObject(payload); if (!response.success()) { _callback(AUTO_OTA_PARSE_ERROR); return false; } if (response.size() == 0) { _callback(AUTO_OTA_UPTODATE); return false; } _newVersion = response.get("version"); _newFileSystem = response.get("spiffs"); _newFirmware = response.get("firmware"); _callback(AUTO_OTA_UPDATING); return true; } void AutoOTAClass::_doUpdate() { char url[100]; bool error = false; uint8_t updates = 0; if (_newFileSystem.length() > 0) { // Update SPIFFS sprintf(url, "%s/%s", _server.c_str(), _newFileSystem.c_str()); t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(url); if (ret == HTTP_UPDATE_FAILED) { error = true; _errorNumber = ESPhttpUpdate.getLastError(); _errorString = ESPhttpUpdate.getLastErrorString(); _callback(AUTO_OTA_FILESYSTEM_UPDATE_ERROR); } else if (ret == HTTP_UPDATE_OK) { updates++; _callback(AUTO_OTA_FILESYSTEM_UPDATED); } } if (!error && (_newFirmware.length() > 0)) { // Update binary sprintf(url, "%s%s", _server.c_str(), _newFirmware.c_str()); t_httpUpdate_return ret = ESPhttpUpdate.update(url); if (ret == HTTP_UPDATE_FAILED) { error = true; _errorNumber = ESPhttpUpdate.getLastError(); _errorString = ESPhttpUpdate.getLastErrorString(); _callback(AUTO_OTA_FIRMWARE_UPDATE_ERROR); } else if (ret == HTTP_UPDATE_OK) { updates++; _callback(AUTO_OTA_FIRMWARE_UPDATED); } } if (!error && (updates > 0)) { _callback(AUTO_OTA_RESET); ESP.restart(); } } void AutoOTAClass::handle() { _callback(AUTO_OTA_START); if (_checkUpdates()) _doUpdate(); _callback(AUTO_OTA_END); } AutoOTAClass AutoOTA;