#include
<ESP8266WiFi.h>
#include
<ESP8266WiFiMulti.h>
#include
<ESP8266HTTPClient.h>
#include
<ESP8266httpUpdate.h>
#include
<time.h>
#ifndef
APSSID
#define
APSSID
"<YOUR-SSID>"
#define
APPSK
"<YOUR-PASSWD>"
#endif
ESP8266WiFiMulti WiFiMulti;
time_t setClock() {
configTime(
3
*
3600
,
0
,
"pool.ntp.org"
,
"time.nist.gov"
);
Serial.print
(
"Waiting for NTP time sync: "
);
time_t now
=
time(nullptr);
while
(now <
8
*
3600
*
2
) {
delay
(
500
);
Serial.print
(
"."
);
now
=
time(nullptr);
}
Serial.println
(
""
);
struct tm timeinfo;
gmtime_r(
&
now,
&
timeinfo);
Serial.print
(
"Current time: "
);
Serial.print
(asctime(
&
timeinfo));
return
now;
}
void
update_started() {
Serial.println
(
"CALLBACK: HTTP update process started"
);
}
void
update_finished() {
Serial.println
(
"CALLBACK: HTTP update process finished"
);
}
void
update_progress(
int
cur,
int
total) {
Serial.printf(
"CALLBACK: HTTP update process at %d of %d bytes...\n"
, cur, total);
}
void
update_error(
int
err) {
Serial.printf(
"CALLBACK: HTTP update fatal error code %d\n"
, err);
}
static
const
char
serverCert[] PROGMEM
=
R"EOF(
-
-
-
-
-
BEGIN CERTIFICATE
-
-
-
-
-
MIIDGTCCAgGgAwIBAgIULbAi2zs41Rh6AZy08xumoYMIFJQwDQYJKoZIhvcNAQEL
BQAwHDEaMBgGA1UEAwwRMTkyLjE2OC4xLjcwOjM0NDMwHhcNMjEwOTEzMDcwODUw
WhcNMjIwOTEzMDcwODUwWjAcMRowGAYDVQQDDBExOTIuMTY4LjEuNzA6MzQ0MzCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM
/
BTwpvOvg
+
Io6T5LgLCPbS
2CfFiV6y
/
30VuaK
+
Xs
+
PCFhogRfrxp9rNhSh5BrWc0zwZIpGHiBJmdFmTrVFHl3V
T8S1ZFUVaEhQHZThXLopDe9RpWhdGO0ePOW9qu6W8u8cXf
/
futMkyqCuc
/
YRt0pR
DLG4Bbs
/
c4x9IsTOfUtu48a1lEd6lyRec6l12CEG
+
ohGu
+
szwY
+
jRGgBfOJdkxDi
FCBLFmimc
/
rZeKe18zV
/
95lU
/
Cz3DD
/
kNUsVCzSOLYu4I
+
3FqiQ2CSq3TAYdLpA1
pYNsHsgGFt6DuguDQcfPZIwmRisaSZaGS74FWRZZ
/
2ycwr9GM3Y00wDMwYAOhI8C
AwEAAaNTMFEwHQYDVR0OBBYEFKyvsHqrsHBj
+
V5H8aDT5qvPOSfdMB8GA1UdIwQY
MBaAFKyvsHqrsHBj
+
V5H8aDT5qvPOSfdMA8GA1UdEwEB
/
wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggEBALwdlitiQayOG2o2y3BAipcdaMxdGbihorheuO17glsZtp2R
H2LUUqnmG8hGH4pHbkd2gozxLt
/
h7ILrD1xK
/
EIlXjGueu3MF377GWZpR18OXt
+
1
cqpxDdAESD3PRbcJnu75uffFYLSKizbuaTbV2D8RY1kcUxRlrFG2bciNP9widbjq
T9B4RhtJb0d
+
Sk8Z2G2eTlNxESPQ
/
Oi530rrbZsez0XmdYyogbVHuNdwJvfQdA8U
F1UtWj6vtGAramUn0dS5rJ8REfZ4jdGsXYT2jmCfDTgaE
+
1sEYm6ry
+
RInDK5RVi
Kk
+
bL292uc4d0STCqXciv7YbWDWlZPo9fH0Pxs0
=
-
-
-
-
-
END CERTIFICATE
-
-
-
-
-
)EOF";
static
const
char
serverKey[] PROGMEM
=
R"EOF(
-
-
-
-
-
BEGIN RSA PRIVATE KEY
-
-
-
-
-
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPwU8Kbzr4PiKO
k
+
S4Cwj20tgnxYlesv99Fbmivl7PjwhYaIEX68afazYUoeQa1nNM8GSKRh4gSZnR
Zk61RR5d1U
/
EtWRVFWhIUB2U4Vy6KQ3vUaVoXRjtHjzlvarulvLvHF3
/
37rTJMqg
rnP2EbdKUQyxuAW7P3OMfSLEzn1LbuPGtZRHepckXnOpddghBvqIRrvrM8GPo0Ro
AXziXZMQ4hQgSxZopnP62XintfM1f
/
eZVPws9ww
/
5DVLFQs0ji2LuCPtxaokNgkq
t0wGHS6QNaWDbB7IBhbeg7oLg0HHz2SMJkYrGkmWhku
+
BVkWWf9snMK
/
RjN2NNMA
zMGADoSPAgMBAAECggEBAMQ8NHuHquy2TA
/
edAi
/
K51wdInElUekzZyJ
+
8lUBdwJ
n3laZK2CoB8OtotwizQqYchHvL
+
7EVOwEaFwAGJKQi
+
hf
/
Iu3
/
FaAiFjwz1QTTTt
+
GKX
/
SQB47x9dkoPCDjKzfa7FbLN0fsEYny5q4C
/
JSEGQ3ZOeuNuQKdvv3qkDEdF
Z90JBHWzOrfUR2SpHuuk366ixwBjohOwyOHSP8VLXfPYp
/
RcgU
/
7
/
cRBSPN
+
xxIB
2Ovv
/
ERnTUbLqYlgU0Ok5KMMc7RmtXO9mwE6wFwNGJImYgn4IcCxAe41h6UTxmaG
gdeS2Ixil20Fi7wuLntOGkaqGewdjmjZN2apJ33gCukCgYEA7zE0hVzgfzLXPRVe
y7ouuLLrhZlkJfFsk75aVv9vfLD4eX6JgN
/
VU34vqmzqVSdszfum6fWyycSXwc9s
xrCLMYMS9lbz
/
HuiQn1c
+
7mZT
+
3hF4Qazy4ZU1rA4CBgGoyJK4eiO7tC9Vl29PvR
osDTdCOjJbIOCIAKsswrixHfgDsCgYEA3lqWDEuxQTctplL6gtXRUyBAooMLrrGZ
9
/
5Ut3qLlTWqdKr5
+
RlJCF4hc
/
1iYQHxDq
+
6SV2GpOO
/
0E7w0GlcoO3ME
+
AMf4qq
OHMcAGoJXYCEw
/
0u2MjuEnXlo8L3qp1
+
LK9rvGUViCx7Fha4OCIRuNWeJ4g8eIAl
qqzUd6fJ
+
70CgYEAiBDEoMzZxGIGgPAEMf5ij5zwT9qXVuJEcrNJLs41
/
IergWmT
DOXHs6xHrzov
/
2rjATYTmGm1YAPelFjLtyc8t1ip08pZFxq5jftEhsnoxcg7UKZM
nejKbVll
+
NlR8ihZ65JHnpUDHRDck7YgZeYtI5cWOt5UD0
/
PRjDQ4Fa1fnsCgYAL
+
gEfBGy1wI0a6llH9tBhk9knZ7uXW0WZz
/
8sKtOd49gclKEGQ9BlPPy8TKeh5gLf
8aMtFHaOJx5L0BS0hRhSKrzVTTofHI7yn3CgrRV4DdYY4GhHkPsRz3vhCD1i2TzU
l1ZMPX2dahfvJqYhj
+
Q4enkcVAA91VkyCkEfeNAuWQKBgH
+
82agy
+
jlRyRBvQ6eI
i5n7FbCMJSw
/
1mfOmxGiEQhshaQkPDx
+
PfPgy
+
LOMuXAr1ZBsWMCGERdUsesXjIH
AHcY8Nl0tC5dG8q7B3A11xttwFbhQ4fgq
+
AUEzSH3ykTvuobGCNtM5AuawNWIjj7
VO0JDqUFQcom1brJIHowKKNU
-
-
-
-
-
END RSA PRIVATE KEY
-
-
-
-
-
)EOF";
#define
FIRMWARE_VERSION
"0.2"
void
setup
() {
Serial.begin
(
115200
);
Serial.println
();
Serial.println
();
Serial.println
();
for
(uint8_t t
=
4
; t >
0
; t
-
-
) {
Serial.printf(
"[SETUP] WAIT %d...\n"
, t);
Serial.flush
();
delay
(
1000
);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP(APSSID, APPSK);
}
const
char
*
updateServer
=
"192.168.1.70"
;
const
int
updateServerPort
=
3443
;
void
loop
() {
if
((WiFiMulti.run()
=
=
WL_CONNECTED)) {
BearSSL::WiFiClientSecure client;
bool mfln
=
client.probeMaxFragmentLength(updateServer, updateServerPort,
1024
);
Serial.printf(
"MFLN supported: %s\n"
, mfln
?
"yes"
:
"no"
);
if
(mfln) {
client.setBufferSizes(
1024
,
1024
);
}
client.setClientRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey));
client.allowSelfSignedCerts();
setClock();
ESPhttpUpdate.setLedPin(LED_BUILTIN,
LOW
);
ESPhttpUpdate.onStart(update_started);
ESPhttpUpdate.onEnd(update_finished);
ESPhttpUpdate.onProgress(update_progress);
ESPhttpUpdate.onError(update_error);
ESPhttpUpdate.rebootOnUpdate(
false
);
Serial.println
(F(
"Update start now!"
));
switch
(ret) {
case
HTTP_UPDATE_FAILED:
Serial.printf(
"HTTP_UPDATE_FAILD Error (%d): %s\n"
, ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
Serial.println
(F(
"Retry in 10secs!"
));
delay
(
10000
);
break
;
case
HTTP_UPDATE_NO_UPDATES:
Serial.println
(
"HTTP_UPDATE_NO_UPDATES"
);
Serial.println
(
"Your code is up to date!"
);
delay
(
10000
);
break
;
case
HTTP_UPDATE_OK:
Serial.println
(
"HTTP_UPDATE_OK"
);
delay
(
1000
);
ESP.restart();
break
;
}
}
}