ArduinoOTA ESP32 : mise à jour sans fil (OTA) en Wi-Fi depuis l'IDE Arduino • Domotique et objets connectés à faire soi-même

zel06tkmxxaan8j9gc5h-1212786
n70ym5oelyczezm6pdhs-7616071

La librairie ArduinoOTA qui permet de réaliser des mises à jour sans fil (OTA) en Wi-Fi est également compatible avec l’ESP32, le successeur plus puissant de l’ESP8266. Elle est intégrée au Arduino Core pour ESP32 développé par Espressif (page GitHub du projet). Il n’est pas encore possible d’installer le kit de développement depuis le gestionnaire de cartes. Le SDK étant encore en phase de développement, la procédure d’installation dépend de la machine sur laquelle est installé l’IDE Arduino. Il est maintenant possible d’utiliser le hash du mot de passe pour sécuriser d’avantage la mise à jour à distance. Autre nouveauté, il est maintenant possible de mettre en jour en Wi-Fi la zone mémoire SPIFFS.

Installer la librairie ArduinoOTA pour ESP32 sur l’IDE Arduino

Avant de démarrer l’installation, quittez l’IDE Arduino. Ensuite, pour installer le kit de développement sur votre macOS, Windows, Linux ou Raspberry Pi, suivez ce tutoriel précédent. Une fois que le SDK est installé, vous pouvez relancer l’IDE.

Si tout s’est correctement déroulé, vous devez avoir de nouvelles cartes ESP32 proposées

Dans la version actuelle, le kit supporte les cartes génériques (ESP32 Dev Module jusqu’à 4MB), et plusieurs cartes de fabricants connus comme la nouvelle Wemos LoLin32 présentée récemment.

Pour faire apparaître le menu des exemples, sélectionnez votre ESP32. Les cartes génériques sont très bien prisent en charge par le SDK. Dans le menu, sélectionnez l’exemple basicOTA.

Le code diffère très peu par rapport à celui des cartes ESP8266.

#include 
#include 
#include 
#include 

const char* ssid = "..........";
const char* password = "..........";

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  ArduinoOTA.setHostname("Demo OTA ESP32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "sketch";
    else // U_SPIFFS
      type = "filesystem";

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

Plusieurs paramètres sont à notre disposition :

  • setPort() : par défaut le port de communication est le 8266. Il n’est pas très utile de la changer sauf à ce qu’il soit déjà utiliser. Par exemple pour un projet intégrant de la communication UDP.
  • setHostname() : c’est probablement l’option la plus importante. Elle permet d’attribuer un nom à l’ESP32. Ce nom de machine sera diffusé sur le réseau et récupéré par l’IDE Arduino. Si vous avez beaucoup d’objets sur votre réseau, il sera beaucoup plus facile de l’identifier par son nom que par un identifiant construit automatiquement à partir du numéro de série.
  • setPassword() : permet de demander un mot de passe depuis l’IDE Arduino avant d’exécuter une mise à jour. Pratique si vous travaillez à plusieurs ou dans un établissement scolaire.
  • setPasswordHash() : permet de stocker l’empreinte du mot de passe pour plus de sécurité. Voir plus loin pour apprendre comment faire.

Quatre autres méthodes permettent de brancher des traitements dans les cas suivants :

  • onStart() : code à exécuter au démarrage de la mise à jour. Nouveauté sur l’ESP32, il est possible de mettre à jour à distance le fichiers de la zone SPIFFS. C’est très pratique si vous avez besoin de développer une interface HTML pour votre projet.
  • onEnd() : idem à la fin
  • onProgress() : durant la progression
  • onError() : et en cas d’erreur

A la fin du setup, on démarre la prise en charge de la mise à jour sans fil en appelant la méthode begin().

Enfin, pour que tout fonctionne, il est nécessaire d’appeler la méthode ArduinoOTA.handle() dans la boucle loop().

Avant de teléverser le programme, modifiez les variables ssid (réseau Wi-Fi sur lequel va se connecter l’ESP32) et password (mot de passe du réseau).

Sécuriser la mise à jour avec le hash du mot de passe

L’ESP32 étant beaucoup plus sécurisé que l’ESP8266 (lire cet article pour en savoir plus), il est possible de stocker l’empreinte du mot de passe (hash) à la place de celui-ci. Pour créer l’empreinte de votre mot de passe, vous pouvez utiliser un générateur en ligne tel que celui-ci ou celui-ci (en français sans pub). Par exemple le hash du mot de passe admin donnera l’empreinte 21232f297a57a5a743894a0e4a801fc3.

Ensuite, utilisez la fonction setPasswordhash() à la place de setPassword() pour indiquer le mot de passe d’authentification.

ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

Test de mise à jour sans fil

Téléversez le programme et ouvrez le Terminal pour vérifier que l’ESP32 est correctement connecté au réseau Wi-Fi.

L’IDE Arduino détecte automatiquement les appareils supportant la mise à jour à distance. Ils sont ajoutés à la liste des ports dans une nouvelle section appelée Network ports.

Pour mettre à jour le programme, il suffit de sélectionner l’ESP comme port à la place du port série habituel. Puis téléverser le programme comme d’habitude. Ici, comme un mot de passe est obligatoire, une fenêtre de saisie apparaît dans l’IDE. Il n’est demandé qu’une seule fois.

On peut suivre le bon déroulement (ou l’échec) de la mise à jour à distance directement depuis l’IDE Arduino.

Mises à jour

[24/11/2017] Ajout du lien vers VPN mentor. Merci Jackie

Avez-vous aimé cet article ?