1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-21 10:26:06 +03:00

add HTTP Updater docu

This commit is contained in:
Markus Sattler 2015-11-06 09:33:02 +01:00
parent c1c2eba990
commit aefdf82ae2

View File

@ -3,21 +3,20 @@ title: OTA Update
--- ---
## Table of Contents ## Table of Contents
* [Requirements](#Requirements) * [Basic Requirements](#basic-requirements)
* [Arduino IDE](#arduino-ide) * [Arduino IDE](#arduino-ide)
* [HTTP Server](#http-server) * [HTTP Server](#http-server)
* [Stream Interface](#stream-interface) * [Stream Interface](#stream-interface)
## Requirements ## Basic Requirements
Basic requirement:
- Flash chip size is 2x the size of the sketch - Flash chip size is 2x the size of the sketch
## Arduino IDE ## Arduino IDE
TODO describe Arduino IDE OTA process TODO describe Arduino IDE OTA process
### Requirements #### Requirements
- The ESP and the Computer must be connected to the Same network. - The ESP and the Computer must be connected to the Same network.
@ -27,18 +26,29 @@ the ```ESPhttpUpdate``` class can check for updates and download a binary file f
It is possible to download updates from every IP or domain address on the Network or Internet. It is possible to download updates from every IP or domain address on the Network or Internet.
### Requirements #### Requirements
- web server - web server
### Arduino code #### Arduino code
##### simple updater
the Simple Updater downloads the File every time the function is called.
simple updater:
```cpp ```cpp
ESPhttpUpdate.update("192.168.0.2", 80, "/arduino.bin"); ESPhttpUpdate.update("192.168.0.2", 80, "/arduino.bin");
``` ```
advanced: ##### advanced updater
Its possible to point to a script at the server.
If a version String is delivered to the Function this String will be send to the server.
A Server side Update check is now possible.
the Server can return a binary file for update (Header 200)
or it return header 304 to notify the ESP that no Update is needed.
```cpp ```cpp
t_httpUpdate_return ret = ESPhttpUpdate.update("192.168.0.2", 80, "/esp/update/arduino.php", "optional current version string here"); t_httpUpdate_return ret = ESPhttpUpdate.update("192.168.0.2", 80, "/esp/update/arduino.php", "optional current version string here");
switch(ret) { switch(ret) {
@ -54,9 +64,93 @@ switch(ret) {
} }
``` ```
### Server request handling #### Server request handling
##### simple updater
for the simple Updater the Server only needs to deliver the binary file for update.
##### advanced updater
for advanced update management a Script needs to run at the Server side, for example a PHP script.
at every Update request the the ESP sends some informations in the Header to the Server
example Header data:
```
[HTTP_USER_AGENT] => ESP8266-http-Update
[HTTP_X_ESP8266_STA_MAC] => 18:FE:AA:AA:AA:AA
[HTTP_X_ESP8266_AP_MAC] => 1A:FE:AA:AA:AA:AA
[HTTP_X_ESP8266_FREE_SPACE] => 671744
[HTTP_X_ESP8266_SKETCH_SIZE] => 373940
[HTTP_X_ESP8266_CHIP_SIZE] => 524288
[HTTP_X_ESP8266_SDK_VERSION] => 1.3.0
[HTTP_X_ESP8266_VERSION] => DOOR-7-g14f53a19
```
with this information the script now can check if a update is needed.
It is also possible to deliver different binary´s based on the MAC address for example.
script example:
```php
<?PHP
header('Content-type: text/plain; charset=utf8', true);
function check_header($name, $value = false) {
if(!isset($_SERVER[$name])) {
return false;
}
if($value && $_SERVER[$name] != $value) {
return false;
}
return true;
}
function sendFile($path) {
header($_SERVER["SERVER_PROTOCOL"].' 200 OK', true, 200);
header('Content-Type: application/octet-stream', true);
header('Content-Disposition: attachment; filename='.basename($path));
header('Content-Length: '.filesize($path), true);
readfile($path);
}
if(!check_header('HTTP_USER_AGENT', 'ESP8266-http-Update')) {
header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403);
echo "only for ESP8266 updater!\n";
exit();
}
if(
!check_header('HTTP_X_ESP8266_STA_MAC') ||
!check_header('HTTP_X_ESP8266_AP_MAC') ||
!check_header('HTTP_X_ESP8266_FREE_SPACE') ||
!check_header('HTTP_X_ESP8266_SKETCH_SIZE') ||
!check_header('HTTP_X_ESP8266_CHIP_SIZE') ||
!check_header('HTTP_X_ESP8266_SDK_VERSION') ||
!check_header('HTTP_X_ESP8266_VERSION')
) {
header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403);
echo "only for ESP8266 updater! (header)\n";
exit();
}
$db = array(
"18:FE:AA:AA:AA:AA" => "DOOR-7-g14f53a19",
"18:FE:AA:AA:AA:BB" => "TEMP-1.0.0"
);
if(isset($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']])) {
if($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']] != $_SERVER['HTTP_X_ESP8266_VERSION']) ) {
sendFile("./bin/".$db[$_SERVER['HTTP_X_ESP8266_STA_MAC']]."bin");
} else {
header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304);
}
}
header($_SERVER["SERVER_PROTOCOL"].' 500 no version for ESP MAC', true, 500);
```
TODO server side
## Stream Interface ## Stream Interface