|
| 1 | +/** |
| 2 | + httpUpdateSecure.ino |
| 3 | +
|
| 4 | + Created on: 16.10.2018 as an adaptation of the ESP8266 version of httpUpdate.ino |
| 5 | +
|
| 6 | +*/ |
| 7 | + |
| 8 | +#include <WiFi.h> |
| 9 | +#include <WiFiMulti.h> |
| 10 | + |
| 11 | +#include <HTTPClient.h> |
| 12 | +#include <HTTPUpdate.h> |
| 13 | + |
| 14 | +#include <time.h> |
| 15 | + |
| 16 | +WiFiMulti WiFiMulti; |
| 17 | + |
| 18 | +// Set time via NTP, as required for x.509 validation |
| 19 | +void setClock() { |
| 20 | + configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC |
| 21 | + |
| 22 | + Serial.print(F("Waiting for NTP time sync: ")); |
| 23 | + time_t now = time(nullptr); |
| 24 | + while (now < 8 * 3600 * 2) { |
| 25 | + yield(); |
| 26 | + delay(500); |
| 27 | + Serial.print(F(".")); |
| 28 | + now = time(nullptr); |
| 29 | + } |
| 30 | + |
| 31 | + Serial.println(F("")); |
| 32 | + struct tm timeinfo; |
| 33 | + gmtime_r(&now, &timeinfo); |
| 34 | + Serial.print(F("Current time: ")); |
| 35 | + Serial.print(asctime(&timeinfo)); |
| 36 | +} |
| 37 | + |
| 38 | +/** |
| 39 | + * This is lets-encrypt-x3-cross-signed.pem |
| 40 | + */ |
| 41 | +const char* rootCACertificate = \ |
| 42 | +"-----BEGIN CERTIFICATE-----\n" \ |
| 43 | +"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \ |
| 44 | +"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \ |
| 45 | +"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \ |
| 46 | +"SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" \ |
| 47 | +"GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" \ |
| 48 | +"AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" \ |
| 49 | +"q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" \ |
| 50 | +"SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" \ |
| 51 | +"Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" \ |
| 52 | +"a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" \ |
| 53 | +"/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" \ |
| 54 | +"AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" \ |
| 55 | +"CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" \ |
| 56 | +"bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" \ |
| 57 | +"c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" \ |
| 58 | +"VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" \ |
| 59 | +"ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" \ |
| 60 | +"MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" \ |
| 61 | +"Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" \ |
| 62 | +"AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" \ |
| 63 | +"uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" \ |
| 64 | +"wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" \ |
| 65 | +"X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" \ |
| 66 | +"PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" \ |
| 67 | +"KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" \ |
| 68 | +"-----END CERTIFICATE-----\n"; |
| 69 | + |
| 70 | +void setup() { |
| 71 | + |
| 72 | + Serial.begin(115200); |
| 73 | + // Serial.setDebugOutput(true); |
| 74 | + |
| 75 | + Serial.println(); |
| 76 | + Serial.println(); |
| 77 | + Serial.println(); |
| 78 | + |
| 79 | + for (uint8_t t = 4; t > 0; t--) { |
| 80 | + Serial.printf("[SETUP] WAIT %d...\n", t); |
| 81 | + Serial.flush(); |
| 82 | + delay(1000); |
| 83 | + } |
| 84 | + |
| 85 | + WiFi.mode(WIFI_STA); |
| 86 | + WiFiMulti.addAP("SSID", "PASSWORD"); |
| 87 | +} |
| 88 | + |
| 89 | +void loop() { |
| 90 | + // wait for WiFi connection |
| 91 | + if ((WiFiMulti.run() == WL_CONNECTED)) { |
| 92 | + |
| 93 | + setClock(); |
| 94 | + |
| 95 | + WiFiClientSecure client; |
| 96 | + client.setCACert(rootCACertificate); |
| 97 | + |
| 98 | + // Reading data over SSL may be slow, use an adequate timeout |
| 99 | + client.setTimeout(12000); |
| 100 | + |
| 101 | + // The line below is optional. It can be used to blink the LED on the board during flashing |
| 102 | + // The LED will be on during download of one buffer of data from the network. The LED will |
| 103 | + // be off during writing that buffer to flash |
| 104 | + // On a good connection the LED should flash regularly. On a bad connection the LED will be |
| 105 | + // on much longer than it will be off. Other pins than LED_BUILTIN may be used. The second |
| 106 | + // value is used to put the LED on. If the LED is on with HIGH, that value should be passed |
| 107 | + // httpUpdate.setLedPin(LED_BUILTIN, HIGH); |
| 108 | + |
| 109 | + t_httpUpdate_return ret = httpUpdate.update(client, "https://server/file.bin"); |
| 110 | + // Or: |
| 111 | + //t_httpUpdate_return ret = httpUpdate.update(client, "server", 443, "file.bin"); |
| 112 | + |
| 113 | + |
| 114 | + switch (ret) { |
| 115 | + case HTTP_UPDATE_FAILED: |
| 116 | + Serial.printf("HTTP_UPDATE_FAILED Error (%d): %s\n", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); |
| 117 | + break; |
| 118 | + |
| 119 | + case HTTP_UPDATE_NO_UPDATES: |
| 120 | + Serial.println("HTTP_UPDATE_NO_UPDATES"); |
| 121 | + break; |
| 122 | + |
| 123 | + case HTTP_UPDATE_OK: |
| 124 | + Serial.println("HTTP_UPDATE_OK"); |
| 125 | + break; |
| 126 | + } |
| 127 | + } |
| 128 | +} |
0 commit comments