OTA Updates¶

Introduction¶

OTA (Over the Air) update is the process of uploading firmware to an ESP module using a Wi-Fi connexion rather than a serial port. Such functionality becomes extremely useful in case of limited or no concrete access to the module.

OTA may exist done using:

  • Arduino IDE

  • Web Browser

  • HTTP Server

The Arduino IDE choice is intended primarily for the software development phase. The other two options would be more useful subsequently deployment, to provide the module with awarding updates either manually with a spider web browser, or automatically using an HTTP server.

In any example, the offset firmware upload has to exist washed over a serial port. If the OTA routines are correctly implemented in the sketch, then all subsequent uploads may exist done over the air.

By default, there is no imposed security for the OTA procedure. It is up to the programmer to ensure that updates are immune simply from legitimate / trusted sources. Once the update is complete, the module restarts, and the new code is executed. The programmer should ensure that the application running on the module is shut downward and restarted in a rubber fashion. Chapters beneath provide additional data regarding security and safety of OTA updates.

Security Disclaimer¶

No guarantees as to the level of security provided for your awarding past the post-obit methods is implied. Please refer to the GNU LGPL license associated for this project for full disclaimers. If you practise find security weaknesses, please don't hesitate to contact the maintainers or supply pull requests with fixes. The MD5 verification and countersign protection schemes are already known to supply a very weak level of security.

Basic Security¶

The module has to be exposed wirelessly to get it updated with a new sketch. That poses a take a chance of the module being violently hacked and programmed with another code. To reduce the likelihood of beingness hacked, consider protecting your uploads with a password, selecting certain OTA port, etc.

Check functionality provided with the ArduinoOTA library that may improve security:

                                        void                    setPort                    (                    uint16_t                    port                    );                    void                    setHostname                    (                    const                    char                    *                    hostname                    );                    void                    setPassword                    (                    const                    char                    *                    password                    );                  

Sure basic protection is already congenital in and does not require any boosted coding by the developer. ArduinoOTA and espota.py use Digest-MD5 to authenticate uploads. Integrity of transferred information is verified on the ESP side using MD5 checksum.

Make your ain take chances analysis and, depending on the application, decide what library functions to implement. If required, consider implementation of other means of protection from beingness hacked, like exposing modules for uploads simply according to a specific schedule, triggering OTA merely when the user presses a dedicated "Update" button wired to the ESP, etc.

Advanced Security - Signed Updates¶

While the above password-based security will dissuade casual hacking attempts, information technology is not highly secure. For applications where a higher level of security is needed, cryptographically signed OTA updates can be required. This uses SHA256 hashing in place of MD5 (which is known to be cryptographically cleaved) and RSA-2048 bit level public-key encryption to guarantee that only the holder of a cryptographic private key tin produce signed updates accustomed by the OTA update mechanisms.

Signed updates are updates whose compiled binaries are signed with a private key (held past the developer) and verified with a public primal (stored in the application and bachelor for all to see). The signing procedure computes a hash of the binary code, encrypts the hash with the developer's private key, and appends this encrypted hash (as well called a signature) to the binary that is uploaded (via OTA, spider web, or HTTP server). If the code is modified or replaced in whatsoever way by anyone except the holder of the developer's private key, the signature volition not match and the ESP8266 volition pass up the upload.

Cryptographic signing only protects against tampering with binaries delivered via OTA. If someone has physical access, they will e'er be able to wink the device over the serial port. Signing also does non encrypt anything only the hash (so that it tin can't exist modified), so this does non protect code inside the device: if a user has physical access they tin can read out your programme.

Securing your private key is paramount. The aforementioned private/public key pair that was used with the original upload must also be used to sign later binaries. Loss of the individual cardinal associated with a binary means that yous will not exist able to OTA-update whatsoever of your devices in the field. Alternatively, if someone else copies the private key, then they volition be able to utilize it to sign binaries which will be accustomed past the ESP.

Signed Binary Format¶

The format of a signed binary is uniform with the standard binary format, and can be uploaded to a not-signed ESP8266 via serial or OTA without whatsoever weather condition. Note, however, that once an unsigned OTA app is overwritten by this signed version, further updates will require signing.

As shown beneath, the signed hash is appended to the unsigned binary, followed by the total length of the signed hash (i.e., if the signed hash was 64 bytes, and so this uint32 data segment will contain 64). This format allows for extensibility (such as adding a CA-based validation scheme allowing multiple signing keys all based on a trust anchor). Pull requests are always welcome. (currently information technology uses SHA256 with RSASSA-PKCS1-V1_5-SIGN signature scheme from RSA PKCS #one v1.five)

                      NORMAL-BINARY <SIGNATURE> <uint32 LENGTH-OF-SIGNATURE>                    

Signed Binary Prerequisites¶

OpenSSL is required to run the standard signing steps, and should be available on any UNIX-similar or Windows arrangement. As usual, the latest stable version of OpenSSL is recommended.

Signing requires the generation of an RSA-2048 central (other bit lengths are supported as well, but 2048 is a good selection today) using whatsoever appropriate tool. The following shell commands will generate a new public/private key pair. Run them in the sketch directory:

                      openssl genrsa -out individual.cardinal                      2048                      openssl rsa -in private.primal -outform PEM -pubout -out public.key                    

Automatic Signing – Only bachelor on Linux and Mac¶

The simplest way of implementing signing is to utilize the automatic mode, which presently is only possible on Linux and Mac due to some of the tools not being available for Windows. This mode uses the IDE to configure the source lawmaking to enable sigining verification with a given public key, and signs binaries as office of the standard build process using a given public primal.

To enable this mode, merely include individual.key and public.key in the sketch .ino directory. The IDE volition call a helper script (tools/signing.py) before the build begins to create a header to enable key validation using the given public key, and to actually do the signing after the build process, generating a sketch.bin.signed file. When OTA is enabled (ArduinoOTA, Web, or HTTP), the binary will automatically only accept signed updates.

When the signing procedure starts, the bulletin:

will appear in the IDE window earlier a compile is launched. At the completion of the build, the signed binary file well be displayed in the IDE build window equally:

                      Signed binary: /full/path/to/sketch.bin.signed                    

If you receive either of the post-obit letters in the IDE window, the signing was not completed and you lot will need to verify the public.key and private.central:

                      Not enabling binary signing ... or ... Not signing the generated binary                    

Manual Signing of Binaries¶

Users may as well manually sign executables and require the OTA procedure to verify their signature. In the main lawmaking, before enabling any update methods, add the following declarations and office telephone call:

                                            <                      in                      globals                      >                      BearSSL                      ::                      PublicKey                      signPubKey                      (                      ...                      central                      contents                      ...                      );                      BearSSL                      ::                      HashSHA256                      hash                      ;                      BearSSL                      ::                      SigningVerifier                      sign                      (                      &                      signPubKey                      );                      ...                      <                      in                      setup                      ()                      >                      Update                      .                      installSignature                      (                      &                      hash                      ,                      &                      sign                      );                    

The above snippet creates a BearSSL public key and a SHA256 hash verifier, and tells the Update object to apply them to validate any updates it receives from whatsoever method.

Compile the sketch unremarkably and, once a .bin file is bachelor, sign it using the signer script:

                      <ESP8266ArduinoPath>/tools/signing.py --fashion sign --privatekey <path-to-private.key> --bin <path-to-unsigned-bin> --out <path-to-signed-binary>                    

Old And New Signature Formats¶

Upwardly to version 2.5.2 of the core, the format of signatures was a footling dissimilar. An additional signed binary with the extension legacy_sig is created. This file contains a signature in the old format and can be uploaded OTA to a device that checks for the onetime signature format.

To create a legacy signature, telephone call the signing script with –legacy:

                      <ESP8266ArduinoPath>/tools/signing.py --way sign --privatekey <path-to-private.key> --bin <path-to-unsigned-bin> --out <path-to-signed-binary> --legacy <path-to-legacy-file>                    

Pinch¶

The eboot bootloader incorporates a GZIP decompressor, built for very depression code requirements. For applications, this optional decompression is completely transparent. For uploading compressed filesystems, the application must be built with ATOMIC_FS_UPDATE defined considering, otherwise, eboot will not be involved in writing the filesystem.

No changes to the application are required. The Updater class and eboot bootloader (which performs actual awarding overwriting on update) automatically search for the gzip header in the uploaded binary, and if establish, handle it.

Compress an application .bin file or filesystem package using any gzip available, at any desired compression level (gzip -nine is recommended because it provides the maximum compression and uncompresses as fast as whatever other compressino level). For example:

                  gzip -9 sketch.bin                  # Maximum compression, output sketch.bin.gz                  <Upload the resultant sketch.bin.gz>                

If signing is desired, sign the gzip compressed file after pinch.

                  gzip -9 sketch.bin <ESP8266ArduinoPath>/tools/signing.py --mode sign --privatekey <path-to-private.key> --bin sketch.bin.gz --out sketch.bin.gz.signed                

Updating apps in the field to support compression¶

If you accept applications deployed in the field and wish to update them to support compressed OTA uploads, you will need to commencement recompile the awarding, and then _upload the uncompressed .bin file once. Attempting to upload a gzip compressed binary to a legacy app will result in the Updater rejecting the upload every bit it does not empathize the gzip format. Later this initial upload, which volition include the new bootloader and Updater class with compression back up, compressed updates can then be used.

Safety¶

The OTA process consumes some of the ESP's resource and bandwidth during upload. Then, the module is restarted and a new sketch executed. Analyse and test how this affects the functionality of the existing and new sketches.

If the ESP is in a remote location and controlling some equipment, you should devote additional attention to what happens if operation of this equipment is suddenly interrupted past the update process. Therefore, make up one's mind how to put this equipment into a safe state earlier starting the update. For instance, your module may be controlling a garden watering system in a sequence. If this sequence is non properly shut down and a water valve is left open up, the garden may exist flooded.

The following functions are provided with the ArduinoOTA library and intended to handle functionality of your application during specific stages of OTA, or on an OTA error:

                                        void                    onStart                    (                    OTA_CALLBACK                    (                    fn                    ));                    void                    onEnd                    (                    OTA_CALLBACK                    (                    fn                    ));                    void                    onProgress                    (                    OTA_CALLBACK_PROGRESS                    (                    fn                    ));                    void                    onError                    (                    OTA_CALLBACK_ERROR                    (                    fn                    ));                  

OTA Basic Requirements¶

The flash scrap size should exist big enough to hold the old sketch (currently running) and the new sketch (OTA) at the same time.

Proceed in mind that the file system and EEPROM, for case, need space too; run across Flash layout.

                                        ESP                    .                    getFreeSketchSpace                    ();                  

tin be used for checking the free space available for the new sketch.

For an overview of retentiveness layout, where the new sketch is stored and how it is copied during the OTA process, see Update procedure - memory view.

The following chapters provide more details and specific methods for OTA updates.

Arduino IDE¶

Uploading modules wirelessly from Arduino IDE is intended for the post-obit typical scenarios:

  • during firmware development every bit a quicker alternative to loading over a serial port,

  • for updating a small number of modules,

  • but if modules are accessible on the same network as the calculator with the Arduino IDE.

Requirements¶

  • The ESP and the computer must exist connected to the same network.

Application Example¶

Instructions below show configuration of OTA on a NodeMCU one.0 (ESP-12E Module) board. Yous can use any other board that meets the requirements described to a higher place. This instruction is valid for all operating systems supported by the Arduino IDE. Screen captures have been made on Windows vii and yous may run into small differences (like name of the serial port), if yous are using Linux or MacOS.

  1. Before you begin, please make sure that yous have the following software installed:

    • Arduino IDE 1.6.seven or newer - https://www.arduino.cc/en/Principal/Software

    • esp8266/Arduino platform package ii.0.0 or newer - for instructions follow https://github.com/esp8266/Arduino#installing-with-boards-manager

    • Python three.ten - https://www.python.org/

      Note: Windows users should select "Add python.exe to Path" (see below – this option is non selected by default).

      Python installation set up

  2. At present prepare the sketch and configuration for upload via a serial port.

    • Kickoff Arduino IDE and upload the sketch BasicOTA.ino, bachelor under File > Examples > ArduinoOTA ota sketch selection

    • Update the SSID and password in the sketch, so that the module tin can join your Wi-Fi network ota ssid pass entry

    • Configure upload parameters equally below (yous may need to adjust configuration if you lot are using a different module): ota serial upload config

      Note: Depending on version of platform parcel and lath you lot accept, you may see Upload Using: in the menu above. This selection is inactive and information technology does non matter what you select. It has been left for compatibility with older implementation of OTA and finally removed in platform bundle version ii.2.0.

  3. Upload the sketch (Ctrl+U). Once done, open Serial Monitor (Ctrl+Shift+M) and check if module has joined your Wi-Fi network:

    Check if module joined network

Note: The ESP module should exist reset afterwards serial upload. Otherwise, subsequent steps volition not work. Reset may be done for you automatically after opening series monitor, as visible on the screenshot to a higher place. Information technology depends on how you have DTR and RTS wired from the USB-Serial converter to the ESP. If reset is not done automatically, and so trigger information technology by pressing reset button or manually cycling the power. For more details why this should exist done please refer to FAQ regarding ESP.restart() .

  1. But if the module is connected to network, subsequently a couple of seconds, the esp8266-ota port volition evidence up in Arduino IDE. Select port with IP accost shown in the Serial Monitor window in previous footstep:

    Selection of OTA port

    Notation: If the OTA port does not show up, exit Arduino IDE, open it again and check if the port is at that place. If it is non, bank check your firewall and router settings. The OTA port is advertised using mDNS service. To check if the port is visible by your PC, you can employ an application like Bonjour Browser.

  2. At present become ready for your commencement OTA upload by selecting the OTA port:

    Configuration of OTA upload

    Note: The menu entry Upload Speed: does not thing at this point as it concerns the series port. Only left it unchanged.

  3. If you take successfully completed all the above steps, you can upload (Ctrl+U) the aforementioned (or whatsoever other) sketch over OTA:

    OTA upload complete

Notation: To be able to upload your sketch over and once again using OTA, you lot need to embed OTA routines inside. Delight apply BasicOTA.ino as an example.

Password Protection¶

Protecting your OTA uploads with password is actually straightforward. All you need to do, is to include the following statement in your lawmaking:

                                            ArduinoOTA                      .                      setPassword                      ((                      const                      char                      *                      )                      "123"                      );                    

Where 123 is a sample password that you should supplant with your own.

Before implementing it in your sketch, information technology is a proficient idea to check how it works using BasicOTA.ino sketch available under File > Examples > ArduinoOTA. Get alee, open BasicOTA.ino, uncomment the above statement that is already in that location, and upload the sketch. To make troubleshooting easier, practise non modify example sketch besides what is admittedly required. This is including original simple 123 OTA password. And so endeavour to upload sketch again (using OTA). After compilation is consummate, once upload is about to brainstorm, yous should see prompt for password as follows:

Password prompt for OTA upload

Enter the password and upload should be initiated every bit usual with the only divergence being Authenticating...OK message visible in upload log.

Authenticating...OK during OTA upload

You will non be prompted for a reentering the same countersign next time. Arduino IDE volition remember it for you. You will run into prompt for password only after reopening IDE, or if you change it in your sketch, upload the sketch and then try to upload it again.

Please note, it is possible to reveal password entered previously in Arduino IDE, if IDE has non been closed since concluding upload. This can be done by enabling Show verbose output during: upload in File > Preferences and attempting to upload the module.

Verbose upload output with password passing in plain text

The flick above shows that the password is visible in log, equally it is passed to espota.py upload script.

Some other case beneath shows situation when password is inverse between uploads.

Verbose output when OTA password has been changed between uploads

When uploading, Arduino IDE used previously entered password, so the upload failed and that has been conspicuously reported by IDE. Only and so IDE prompted for a new countersign. That was entered correctly and second attempt to upload has been successful.

Troubleshooting¶

If OTA update fails, kickoff step is to cheque for error messages that may be shown in upload window of Arduino IDE. If this is non providing any useful hints, try to upload once more while checking what is shown by ESP on serial port. Serial Monitor from IDE will not be useful in that case. When attempting to open up it, you volition probable see the post-obit:

Arduino IDE network terminal window

This window is for Arduino Yún and not still implemented for esp8266/Arduino. It shows up because IDE is attempting to open Serial Monitor using network port you lot take selected for OTA upload.

Instead you lot need an external serial monitor. If you are a Windows user check out Termite. This is handy, slick and unproblematic RS232 terminal that does not impose RTS or DTR flow command. Such flow control may cause issues if you lot are using respective lines to toggle GPIO0 and RESET pins on ESP for upload.

Select COM port and baud rate on external terminal program equally if you lot were using Arduino Series Monitor. Please see typical settings for Termite below:

Termite settings

Then run OTA from IDE and look what is displayed on final. Successful ArduinoOTA procedure using BasicOTA.ino sketch looks like below (IP accost depends on your network configuration):

OTA upload successful - output on an external serial terminal

If upload fails you volition likely see errors caught by the uploader, exception and the stack trace, or both.

Instead of the log as on the above screen you may come across the post-obit:

OTA upload failed - output on an external serial terminal

If this is the instance, and then most likely ESP module has not been reset after initial upload using serial port.

The most common causes of OTA failure are as follows:

  • not enough physical memory on the chip (e.g. ESP01 with 512K flash retentivity is not enough for OTA).

  • besides much retentiveness alleged for the filesystem so new sketch will not fit between existing sketch and the filesystem – meet Update process - memory view.

  • too little retentivity alleged in Arduino IDE for your selected board (i.e. less than physical size).

  • not resetting the ESP module after initial upload using serial port.

For more details regarding flash retention layout please cheque File system. For overview where new sketch is stored, how it is copied and how memory is organized for the purpose of OTA see Update procedure - retentivity view.

Web Browser¶

Updates described in this affiliate are washed with a web browser that can exist useful in the following typical scenarios:

  • after application deployment if loading direct from Arduino IDE is inconvenient or not possible,

  • after deployment if user is unable to betrayal module for OTA from external update server,

  • to provide updates afterward deployment to small quantity of modules when setting an update server is not practicable.

Requirements¶

  • The ESP and the computer must be connected to the aforementioned network.

Implementation Overview¶

Updates with a web browser are implemented using ESP8266HTTPUpdateServer class together with ESP8266WebServer and ESP8266mDNS classes. The following lawmaking is required to get it work:

setup()

                                        MDNS                    .                    begin                    (                    host                    );                    httpUpdater                    .                    setup                    (                    &                    httpServer                    );                    httpServer                    .                    begin                    ();                    MDNS                    .                    addService                    (                    "http"                    ,                    "tcp"                    ,                    80                    );                  

loop()

                                        httpServer                    .                    handleClient                    ();                  

Awarding Example¶

The sample implementation provided below has been done using:

  • instance sketch WebUpdater.ino available in ESP8266HTTPUpdateServer library,

  • NodeMCU one.0 (ESP-12E Module).

Y'all can apply another module if information technology meets previously described requirements.

  1. Before you lot begin, please brand sure that you have the post-obit software installed:

    • Arduino IDE and 2.0.0-rc1 (of Nov 17, 2015) version of platform package equally described under https://github.com/esp8266/Arduino#installing-with-boards-manager

    • Host software depending on O/Southward you utilise:

      1. Avahi https://avahi.org/ for Linux

      2. Bonjour https://www.apple.com/support/bonjour/ for Windows

      3. Mac OSX and iOS - support is already built in / no any extra south/w is required

  2. Prepare the sketch and configuration for initial upload with a serial port.

    • Beginning Arduino IDE and load sketch WebUpdater.ino bachelor under File > Examples > ESP8266HTTPUpdateServer.

    • Update SSID and password in the sketch, then the module can bring together your Wi-Fi network.

    • Open File > Preferences, look for "Evidence verbose output during:" and check out "compilation" option.

      Preferences - enabling verbose output during compilation

      Note: This setting will be required in pace 5 below. You can uncheck this setting later.

  3. Upload sketch (Ctrl+U). Once done, open up Serial Monitor (Ctrl+Shift+M) and check if you see the post-obit message displayed, that contains url for OTA update.

    Serial Monitor - after first load using serial

    Annotation: Such message volition be shown only later module successfully joins network and is ready for an OTA upload. Please remember about resetting the module once subsequently serial upload as discussed in affiliate Arduino IDE, step three.

  4. Now open web browser and enter the url provided on Serial Monitor, i.e. http://esp8266-webupdate.local/update . One time entered, browser should brandish a form like below that has been served by your module. The grade invites yous to cull a file for update.

    OTA update form in web browser

    Annotation: If entering http://esp8266-webupdate.local/update does not work, try replacing esp8266-webupdate with module's IP accost. For example, if your module IP is 192.168.1.100 so url should exist http://192.168.1.100/update . This workaround is useful in case the host software installed in stride 1 does not piece of work. If nonetheless nothing works and in that location are no clues on the Serial Monitor, endeavour to diagnose issue past opening provided url in Google Chrome, pressing F12 and checking contents of "Panel" and "Network" tabs. Chrome provides some advanced logging on these tabs.

  5. To obtain the file, navigate to directory used by Arduino IDE to store results of compilation. You lot tin check the path to this file in compilation log shown in IDE debug window as marked below.

    Compilation complete - path to binary file

  6. Now press "Cull File" in spider web browser, go to directory identified in step 5 higher up, find the file "WebUpdater.cpp.bin" and upload it. If upload is successful, you will come across "OK" on web browser like beneath.

    OTA update complete

    Module will reboot that should exist visible on Serial Monitor:

    Serial Monitor - after OTA update

    Just after reboot you should see exactly the same message HTTPUpdateServer set up! Open http://esp8266-webupdate.local/update in your browser like in step 3. This is because module has been loaded over again with the aforementioned lawmaking – start using series port, and then using OTA.

Once y'all are comfortable with this procedure, go ahead and modify WebUpdater.ino sketch to print some additional messages, compile information technology, locate new binary file and upload it using web browser to see entered changes on a Series Monitor.

Yous can likewise add OTA routines to your own sketch post-obit guidelines in Implementation Overview higher up. If this is done correctly, you should be always able to upload new sketch over the previous one using a web browser.

In case OTA update fails dead after entering modifications in your sketch, you lot can ever recover module by loading information technology over a serial port. Then diagnose the event with sketch using Serial Monitor. In one case the issue is stock-still try OTA over again.

HTTP Server¶

ESPhttpUpdate grade can check for updates and download a binary file from HTTP web server. It is possible to download updates from every IP or domain accost on the network or Cyberspace.

Note that past default this form closes all other connections except the one used by the update, this is because the update method blocks. This means that if there's another application receiving data then TCP packets volition build up in the buffer leading to out of memory errors causing the OTA update to neglect. In that location's besides a express number of receive buffers available and all may be used upwardly by other applications.

There are some cases where you know that you won't be receiving whatsoever data but would still like to send progress updates. It'south possible to disable the default behaviour (and proceed connections open) by calling closeConnectionsOnUpdate(false).

Arduino lawmaking¶

Simple updater¶

Simple updater downloads the file every time the function is called.

                                            WiFiClient                      client                      ;                      ESPhttpUpdate                      .                      update                      (                      customer                      ,                      "192.168.0.ii"                      ,                      lxxx                      ,                      "/arduino.bin"                      );                    

Advanced updater¶

Its possible to indicate the update function to a script on the server. If a version string argument is given, it will be sent to the server. The server side script can use this string to check whether an update should exist performed.

The server-side script tin can respond as follows: - response lawmaking 200, and transport the firmware paradigm, - or response lawmaking 304 to notify ESP that no update is required.

                                            WiFiClient                      client                      ;                      t_httpUpdate_return                      ret                      =                      ESPhttpUpdate                      .                      update                      (                      customer                      ,                      "192.168.0.ii"                      ,                      lxxx                      ,                      "/esp/update/arduino.php"                      ,                      "optional current version string here"                      );                      switch                      (                      ret                      )                      {                      case                      HTTP_UPDATE_FAILED                      :                      Serial                      .                      println                      (                      "[update] Update failed."                      );                      break                      ;                      case                      HTTP_UPDATE_NO_UPDATES                      :                      Series                      .                      println                      (                      "[update] Update no Update."                      );                      break                      ;                      case                      HTTP_UPDATE_OK                      :                      Series                      .                      println                      (                      "[update] Update ok."                      );                      // may non be called since we reboot the ESP                      break                      ;                      }                    

TLS updater¶

Please read and try the examples provided with the library.

Server asking treatment¶

Simple updater¶

For the simple updater the server only needs to evangelize the binary file for update.

Advanced updater¶

For advanced update direction a script (such as a PHP script) needs to run on the server side. On every update request, the ESP sends some information in HTTP headers to the server.

Example header data:

                                            [                      User                      -                      Agent                      ]                      =>                      ESP8266                      -                      http                      -                      Update                      [                      ten                      -                      ESP8266                      -                      STA                      -                      MAC                      ]                      =>                      18                      :                      FE                      :                      AA                      :                      AA                      :                      AA                      :                      AA                      [                      ten                      -                      ESP8266                      -                      AP                      -                      MAC                      ]                      =>                      i                      A                      :                      Fe                      :                      AA                      :                      AA                      :                      AA                      :                      AA                      [                      ten                      -                      ESP8266                      -                      free                      -                      infinite                      ]                      =>                      671744                      [                      10                      -                      ESP8266                      -                      sketch                      -                      size                      ]                      =>                      373940                      [                      10                      -                      ESP8266                      -                      sketch                      -                      md5                      ]                      =>                      a56f8ef78a0bebd812f62067daf1408a                      [                      x                      -                      ESP8266                      -                      bit                      -                      size                      ]                      =>                      4194304                      [                      x                      -                      ESP8266                      -                      sdk                      -                      version                      ]                      =>                      1.3.0                      [                      10                      -                      ESP8266                      -                      version                      ]                      =>                      DOOR                      -                      seven                      -                      g14f53a19                      [                      x                      -                      ESP8266                      -                      mode                      ]                      =>                      sketch                    

With this information the script now tin check if an update is needed. It is also possible to evangelize different binaries based on the MAC accost, as in the post-obit example:

                                            <?PHP                      header                      (                      'Content-type: text/plain; charset=utf8'                      ,                      true                      );                      function                      check_header                      (                      $name                      ,                      $value                      =                      false                      )                      {                      if                      (                      !                      isset                      (                      $_SERVER                      [                      $name                      ]))                      {                      render                      false                      ;                      }                      if                      (                      $value                      &&                      $_SERVER                      [                      $proper name                      ]                      !=                      $value                      )                      {                      return                      simulated                      ;                      }                      return                      true                      ;                      }                      role                      sendFile                      (                      $path                      )                      {                      header                      (                      $_SERVER                      [                      "SERVER_PROTOCOL"                      ]                      .                      ' 200 OK'                      ,                      truthful                      ,                      200                      );                      header                      (                      'Content-Type: application/octet-stream'                      ,                      true                      );                      header                      (                      'Content-Disposition: attachment; filename='                      .                      basename                      (                      $path                      ));                      header                      (                      'Content-Length: '                      .                      filesize                      (                      $path                      ),                      true                      );                      header                      (                      'x-MD5: '                      .                      md5_file                      (                      $path                      ),                      truthful                      );                      readfile                      (                      $path                      );                      }                      if                      (                      !                      check_header                      (                      'User-Agent'                      ,                      'ESP8266-http-Update'                      ))                      {                      header                      (                      $_SERVER                      [                      "SERVER_PROTOCOL"                      ]                      .                      ' 403 Forbidden'                      ,                      true                      ,                      403                      );                      echo                      "only for ESP8266 updater!                      \n                      "                      ;                      exit                      ();                      }                      if                      (                      !                      check_header                      (                      'ten-ESP8266-STA-MAC'                      )                      ||                      !                      check_header                      (                      'x-ESP8266-AP-MAC'                      )                      ||                      !                      check_header                      (                      'x-ESP8266-gratis-infinite'                      )                      ||                      !                      check_header                      (                      'ten-ESP8266-sketch-size'                      )                      ||                      !                      check_header                      (                      '10-ESP8266-sketch-md5'                      )                      ||                      !                      check_header                      (                      'x-ESP8266-chip-size'                      )                      ||                      !                      check_header                      (                      'x-ESP8266-sdk-version'                      )                      )                      {                      header                      (                      $_SERVER                      [                      "SERVER_PROTOCOL"                      ]                      .                      ' 403 Forbidden'                      ,                      true                      ,                      403                      );                      echo                      "just for ESP8266 updater! (header)                      \n                      "                      ;                      exit                      ();                      }                      $db                      =                      array                      (                      "18:Atomic number 26:AA:AA:AA:AA"                      =>                      "DOOR-7-g14f53a19"                      ,                      "18:Iron:AA:AA:AA:BB"                      =>                      "TEMP-one.0.0"                      );                      if                      (                      !                      isset                      (                      $db                      [                      $_SERVER                      [                      'ten-ESP8266-STA-MAC'                      ]]))                      {                      header                      (                      $_SERVER                      [                      "SERVER_PROTOCOL"                      ]                      .                      ' 500 ESP MAC non configured for updates'                      ,                      true                      ,                      500                      );                      }                      $localBinary                      =                      "./bin/"                      .                      $db                      [                      $_SERVER                      [                      'x-ESP8266-STA-MAC'                      ]]                      .                      ".bin"                      ;                      // Check if version has been set and does not match, if not, check if                      // MD5 hash betwixt local binary and ESP8266 binary do not lucifer if not.                      // and so no update has been found.                      if                      ((                      !                      check_header                      (                      'x-ESP8266-sdk-version'                      )                      &&                      $db                      [                      $_SERVER                      [                      '10-ESP8266-STA-MAC'                      ]]                      !=                      $_SERVER                      [                      'x-ESP8266-version'                      ])                      ||                      $_SERVER                      [                      "x-ESP8266-sketch-md5"                      ]                      !=                      md5_file                      (                      $localBinary                      ))                      {                      sendFile                      (                      $localBinary                      );                      }                      else                      {                      header                      (                      $_SERVER                      [                      "SERVER_PROTOCOL"                      ]                      .                      ' 304 Not Modified'                      ,                      truthful                      ,                      304                      );                      }                      header                      (                      $_SERVER                      [                      "SERVER_PROTOCOL"                      ]                      .                      ' 500 no version for ESP MAC'                      ,                      true                      ,                      500                      );                    

Stream Interface¶

The Stream Interface is the base of operations for all other update modes like OTA, HTTP Server / customer. Given a Stream-course variable streamVar providing byteCount bytes of firmware, it tin store the firmware as follows:

                                    Update                  .                  brainstorm                  (                  firmwareLengthInBytes                  );                  Update                  .                  writeStream                  (                  streamVar                  );                  Update                  .                  cease                  ();                

Updater class¶

Updater is in the Core and deals with writing the firmware to the flash, checking its integrity and telling the bootloader (eboot) to load the new firmware on the next boot.

Notation: The bootloader command will be stored into the offset 128 bytes of user RTC memory, then information technology volition be retrieved by eboot on boot. That means that user data present there will be lost (per discussion in #5330).

Note: For uncompressed firmware images, the Updater volition change the flash manner bits if they differ from the wink way the device is currently running at. This ensures that the flash mode is not changed to an incompatible way when the device is in a remote or hard to access area. Compressed images are not modified, thus irresolute the flash fashion in this example could consequence in damage to the ESP8266 and/or flash retentivity chip or your device no longer be attainable via OTA, and requiring re-flashing via a serial connexion (per discussion in #7307).

Update process - memory view¶

  • The new sketch will be stored in the space between the old sketch and the spiff.

  • on the next reboot, the "eboot" bootloader checks for commands.

  • the new sketch is now copied "over" the old 1.

  • the new sketch is started.

By default, OTA filesystem updates overwrite the target flash directly. This can lead to the file system being corrupted if there is a power outage during the update process. In club to employ the same two footstep process that is used for OTA application firmware updates, set the ATOMIC_FS_UPDATE flag. Note that y'all will need to have enough unused space for the new filesystem image to be stored, hence is why this is not the default behaviour.

Memory layout for OTA updates