diff --git a/src/AgApiClient.cpp b/src/AgApiClient.cpp index 8a72a67..1516d83 100644 --- a/src/AgApiClient.cpp +++ b/src/AgApiClient.cpp @@ -59,9 +59,20 @@ bool AgApiClient::fetchServerConfiguration(void) { #else HTTPClient client; client.setTimeout(timeoutMs); - if (client.begin(uri) == false) { - getConfigFailed = true; - return false; + if (apiRootChanged) { + // If apiRoot is changed, assume not using https + if (client.begin(uri) == false) { + logError("Begin HTTPClient failed (GET)"); + getConfigFailed = true; + return false; + } + } else { + // By default, airgradient using https + if (client.begin(uri, agCA) == false) { + logError("Begin HTTPClient using tls failed (GET)"); + getConfigFailed = true; + return false; + } } #endif @@ -90,8 +101,6 @@ bool AgApiClient::fetchServerConfiguration(void) { String respContent = client.getString(); client.end(); - // logInfo("Get configuration: " + respContent); - /** Parse configuration and return result */ return config.parse(respContent, false); } @@ -115,22 +124,28 @@ bool AgApiClient::postToServer(String data) { } String uri = apiRoot + "/sensors/airgradient:" + ag->deviceId() + "/measures"; - // logInfo("Post uri: " + uri); - // logInfo("Post data: " + data); - - WiFiClient wifiClient; HTTPClient client; client.setTimeout(timeoutMs); - if (client.begin(wifiClient, uri.c_str()) == false) { - logError("Init client failed"); - return false; + if (apiRootChanged) { + // If apiRoot is changed, assume not using https + if (client.begin(uri) == false) { + logError("Begin HTTPClient failed (POST)"); + getConfigFailed = true; + return false; + } + } else { + // By default, airgradient using https + if (client.begin(uri, agCA) == false) { + logError("Begin HTTPClient using tls failed (POST)"); + getConfigFailed = true; + return false; + } } client.addHeader("content-type", "application/json"); int retCode = client.POST(data); client.end(); logInfo(String("POST: ") + uri); - // logInfo(String("DATA: ") + data); logInfo(String("Return code: ") + String(retCode)); if ((retCode == 200) || (retCode == 429)) { @@ -189,7 +204,10 @@ bool AgApiClient::sendPing(int rssi, int bootCount) { String AgApiClient::getApiRoot() const { return apiRoot; } -void AgApiClient::setApiRoot(const String &apiRoot) { this->apiRoot = apiRoot; } +void AgApiClient::setApiRoot(const String &apiRoot) { + this->apiRootChanged = true; + this->apiRoot = apiRoot; +} /** * @brief Set http request timeout. (Default: 10s) diff --git a/src/AgApiClient.h b/src/AgApiClient.h index 7035323..2d8b162 100644 --- a/src/AgApiClient.h +++ b/src/AgApiClient.h @@ -20,8 +20,47 @@ class AgApiClient : public PrintLog { private: Configuration &config; AirGradient *ag; +#ifdef ESP8266 String apiRoot = "http://hw.airgradient.com"; +#else + String apiRoot = "https://hw.airgradient.com"; + const char *agCA = "-----BEGIN CERTIFICATE-----\n" + "MIIF4jCCA8oCCQD7MgvcaVWxkTANBgkqhkiG9w0BAQsFADCBsjELMAkGA1UEBhMC\n" + "VEgxEzARBgNVBAgMCkNoaWFuZyBNYWkxEDAOBgNVBAcMB01hZSBSaW0xGTAXBgNV\n" + "BAoMEEFpckdyYWRpZW50IEx0ZC4xFDASBgNVBAsMC1NlbnNvciBMYWJzMSgwJgYD\n" + "VQQDDB9BaXJHcmFkaWVudCBTZW5zb3IgTGFicyBSb290IENBMSEwHwYJKoZIhvcN\n" + "AQkBFhJjYUBhaXJncmFkaWVudC5jb20wHhcNMjEwOTE3MTE0NDE3WhcNNDEwOTEy\n" + "MTE0NDE3WjCBsjELMAkGA1UEBhMCVEgxEzARBgNVBAgMCkNoaWFuZyBNYWkxEDAO\n" + "BgNVBAcMB01hZSBSaW0xGTAXBgNVBAoMEEFpckdyYWRpZW50IEx0ZC4xFDASBgNV\n" + "BAsMC1NlbnNvciBMYWJzMSgwJgYDVQQDDB9BaXJHcmFkaWVudCBTZW5zb3IgTGFi\n" + "cyBSb290IENBMSEwHwYJKoZIhvcNAQkBFhJjYUBhaXJncmFkaWVudC5jb20wggIi\n" + "MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC6XkVQ4O9d5GcUjPYRgF/uaY6O\n" + "5ry1xCGvotxkEeKkBk99lB1oNUUfNsP5bwuDci4XKfY9Ro6/jmkfHSVcPAwUnjAt\n" + "BcHqZtA/cMXykaynf9yXPxPQN7XLu/Rk32RIfb90sIGS318xgNziCYvzWZmlxpxc\n" + "3gUcAgGtamlgZ6wD3yOHVo8B9aFNvmP16QwkUm8fKDHunJG+iX2Bxa4ka5FJovhG\n" + "TnUwtso6Vrn0JaWF9qWcPZE0JZMjFW8PYRriyJmHwr/nAXfPPKphD1oRO+oA7/jq\n" + "dYkrJw6+OHfFXnPB1xkeh4OPBzcCZHT5XWNfwBYazYpjcJa9ngGFSmg8lX1ac23C\n" + "zea1XJmSrPwbZbWxoQznnf7Y78mRjruYKgSP8rf74KYvBe/HGPL5NQyXQ3l6kwmu\n" + "CCUqfcC0wCWEtWESxwSdFE2qQii8CZ12kQExzvR2PrOIyKQYSdkGx9/RBZtAVPXP\n" + "hmLuRBQYHrF5Cxf1oIbBK8OMoNVgBm6ftt15t9Sq9dH5Aup2YR6WEJkVaYkYzZzK\n" + "X7M+SQcdbXp+hAO8PFpABJxkaDAO2kiB5Ov7pDYPAcmNFqnJT48AY0TZJeVeCa5W\n" + "sIv3lPvB/XcFjP0+aZxxNSEEwpGPUYgvKUYUUmb0NammlYQwZHKaShPEmZ3UZ0bp\n" + "VNt4p6374nzO376sSwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQB/LfBPgTx7xKQB\n" + "JNMUhah17AFAn050NiviGJOHdPQely6u3DmJGg+ijEVlPWO1FEW3it+LOuNP5zOu\n" + "bhq8paTYIxPxtALIxw5ksykX9woDuX3H6FF9mPdQIbL7ft+3ZtZ4FWPui9dUtaPe\n" + "ZBmDFDi4U29nhWZK68JSp5QkWjfaYLV/vtag7120eVyGEPFZ0UAuTUNqpw+stOt9\n" + "gJ2ZxNx13xJ8ZnLK7qz1crPe8/8IVAdxbVLoY7JaWPLc//+VF+ceKicy8+4gV7zN\n" + "Gnq2IyM+CHFz8VYMLbW+3eVp4iJjTa72vae116kozboEIUVN9rgLqIKyVqQXiuoN\n" + "g3xY+yfncPB2+H/+lfyy6mepPIfgksd3+KeNxFADSc5EVY2JKEdorRodnAh7a8K6\n" + "WjTYgq+GjWXU2uQW2SyPt6Tu33OT8nBnu3NB80eT8WXgdVCkgsuyCuLvNRf1Xmze\n" + "igvurpU6JmQ1GlLgLJo8omJHTh1zIbkR9injPYne2v9ciHCoP6+LDEqe+rOsvPCB\n" + "C/o/iZ4svmYX4fWGuU7GgqZE8hhrC3+GdOTf2ADC752cYCZxBidXGtkrGNoHQKmQ\n" + "KCOMFBxZIvWteB3tUo3BKYz1D2CvKWz1wV4moc5JHkOgS+jqxhvOkQ/vfQBQ1pUY\n" + "TMui9BSwU7B1G2XjdLbfF3Dc67zaSg==\n" + "-----END CERTIFICATE-----\n"; +#endif + bool apiRootChanged = false; // Indicate if setApiRoot() is called bool getConfigFailed; bool postToServerFailed; bool notAvailableOnDashboard = false; // Device not setup on Airgradient cloud dashboard.