This shows you the differences between two versions of the page.
|
iothings:laboratoare:2025_code:lab9_1 [2025/11/23 13:42] dan.tudose |
iothings:laboratoare:2025_code:lab9_1 [2025/11/24 16:58] (current) dan.tudose |
||
|---|---|---|---|
| Line 18: | Line 18: | ||
| const char* DEVICE_PASSWORD = "DEVICE_PASSWORD"; | const char* DEVICE_PASSWORD = "DEVICE_PASSWORD"; | ||
| const char* DEVICE_ID = "sparrow-01"; | const char* DEVICE_ID = "sparrow-01"; | ||
| - | |||
| - | // Google GTS Root R1 (cross-signed by GlobalSign Root CA), seen in TLS chain for | ||
| - | // identitytoolkit.googleapis.com and *.firebaseio.com (captured via openssl s_client) | ||
| - | static const char GOOGLE_ROOT_CA[] PROGMEM = R"EOF( | ||
| - | -----BEGIN CERTIFICATE----- | ||
| - | MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBX | ||
| - | MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE | ||
| - | CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYx | ||
| - | OTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoT | ||
| - | GUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIx | ||
| - | MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63 | ||
| - | ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwS | ||
| - | iV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351k | ||
| - | KSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZ | ||
| - | DrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zk | ||
| - | j5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5 | ||
| - | cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esW | ||
| - | CruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499 | ||
| - | iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35Ei | ||
| - | Eua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbap | ||
| - | sZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b | ||
| - | 9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAP | ||
| - | BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAf | ||
| - | BgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIw | ||
| - | JQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUH | ||
| - | MAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6Al | ||
| - | oCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAy | ||
| - | MAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIF | ||
| - | AwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9 | ||
| - | NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9 | ||
| - | WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw | ||
| - | 9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy | ||
| - | +qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvi | ||
| - | d0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8= | ||
| - | -----END CERTIFICATE----- | ||
| - | )EOF"; | ||
| // Hardware (adapt to your Sparrow board) | // Hardware (adapt to your Sparrow board) | ||
| - | #define I2C_SDA 21 | + | #define I2C_SDA 21 |
| - | #define I2C_SCL 22 | + | #define I2C_SCL 22 |
| - | #define NEOPIXEL_PIN 3 | + | #define NEOPIXEL_PIN 3 |
| #define MIN_VALID_EPOCH 1577836800UL // Jan 1 2020 used to detect if NTP time is set | #define MIN_VALID_EPOCH 1577836800UL // Jan 1 2020 used to detect if NTP time is set | ||
| Line 99: | Line 63: | ||
| Serial.println("NTP time synced"); | Serial.println("NTP time synced"); | ||
| } | } | ||
| + | } | ||
| + | |||
| + | bool waitForTime(uint32_t timeoutMs = 8000) { | ||
| + | unsigned long start = millis(); | ||
| + | while (!hasValidTime() && millis() - start < timeoutMs) { | ||
| + | syncTimeIfNeeded(); | ||
| + | delay(200); | ||
| + | } | ||
| + | return hasValidTime(); | ||
| } | } | ||
| Line 367: | Line 340: | ||
| connectWiFi(); | connectWiFi(); | ||
| - | syncTimeIfNeeded(); | + | waitForTime(); |
| secureClient.setTimeout(15000); | secureClient.setTimeout(15000); | ||
| - | secureClient.setCACert(GOOGLE_ROOT_CA); // validate HTTPS using Google root | + | secureClient.setInsecure(); // NOTE: uses HTTPS but skips cert validation |
| initBME(); | initBME(); | ||