Esp32, televersement hors du réseau local

Bonjour
J'ai un ESP32 qui fonctionne 24h/24 que je peux mettre à jour avec vscode à distance (OTA) depuis le réseau local.
Sur le même réseau local de la maison j'ai un NAS avec proxy inversé. Ainsi depuis internet, un

ping esp.xxx.synology.me

atteint le NAS.
Ma question : est-il possible de reprogrammer l'ESP32 depuis internet ?
Pour l'instant j'ai mis dans le platformio.io :

upload_port = esp.xxx.synology.me ;
upload_flags = 
	--port=3232
	--auth=motdepasse
upload_protocol = espota

mais j'obtiens ceci :

21:46:46 [DEBUG]: Options: {'esp_ip': 'esp.xxx.synology.me', 'host_ip': '0.0.0.0', 'esp_port': 3232, 'host_port': 58404, 'auth': 'motdepasse', 'image': '.pio\\build\\esp-32\\firmware.bin', 'spiffs': 
False, 'debug': True, 'progress': True, 'timeout': 10}
21:46:46 [INFO]: Starting on 0.0.0.0:58404
21:46:46 [INFO]: Upload size: 821168
Sending invitation to esp.xxx.synology.me ..........
21:48:26 [ERROR]: No response from the ESP
*** [upload] Error 1

Est-ce tout simplement possible ?
Je me doute que c'est plus un problème réseau que d'ESP mais je ne vois pas où déposer cette question ailleurs.

Bonne soirée

Oui, il faut que tu configure ton reverse proxy pour qu'il redirige le port utiliser par ton ESP pour l'OTA vers celui-ci.
Par contre il faudra que ton ESP est une IP fixe.

Bonjour Terwal
Il me semble que c'est ce que j'ai fait :
image

172.16.1.251 est l'ip fixe de mon esp au sein du réseau local.
Je précise que j'ai essayé aussi de remplacer le port 80 par le port 3232 mais même erreur que précédemment.

J'ai deux doutes :

  • Est-ce que le téléchargement du programme vers l'esp se fait en http ?
  • Qu'est ce que représentent les host_ip:0.0.0.0 et host_port:20120 visibles dans le message :
09:51:04 [DEBUG]: Options: {'esp_ip': 'esp.xxx.synology.me', 'host_ip': '0.0.0.0', 'esp_port': 3232, 'host_port': 20120, 'auth': 'motdepasse', 'image': '.pio\\build\\esp-32\\firmware.bin', 'spiffs': 
False, 'debug': True, 'progress': True, 'timeout': 10}
09:51:04 [INFO]: Starting on 0.0.0.0:20120

Bonne journée

Je ne suis pas spécialiste du téléversement en OTA.
Mais je crois que c'est un serveur WEB qui est utilisé sur l'ESP, donc le protocole doit être HTTP ou HTTPS(je ne sais pas si c'est gérer).
Après ton proxy reverse peut surement se charger de passer d'un Protocol à un autre, mais meix vaut commencer par le même protocole des deux cotés.

Par contre dans ton platform.io, tu donne bien l'IP/nom de domaine de ton NAS, mais tu précise que le port est 3232.
Donc NAS, doit recevoir une demande de connexion sur ce port(3232), qu'il faut redirigé sur le port d'écoute utilisé par ton ESP.
Comme à priori 3232 est le port par défaut pour l'OTA des ESP32, je suppose que le programme de ton ESP, utilise aussi ce port ?
En tout cas, il faut que tu détermine quel est le port utilisé par ton ESP, pour l'indiquer dans la configuration de ton proxy.

J'ai à peu près tout essayé, recevoir par le port 3232 ou 443 (en https) ou 80 et renvoyer vers l'esp avec le port 3232 puisque c'est qu'il attend. Mais pour l'instant, j'obtiens toujours le même message d'erreur (celui indiqué dans mon 1er post).

avez vous essayé AsyncElegantOTA ?
ça fonctionne avec ESPAsyncWebServer qui est le choix habituel quand on veut un serveur web sur un ESP

Ensuite si vous faites une requête pour /update vous verrez une interface dédiée où vous pouvez charger un .bin pour faire l'update, et vous pouvez même utiliser l'interface pour mettre à jour des fichiers SPIFFS

cf pour plus d'info ESP32 OTA (Over-the-Air) Updates - AsyncElegantOTA Arduino | Random Nerd Tutorials.

bien sûr il faut que votre ESP soit sur une route possible depuis votre client (même réseau local ou ESP dans la DMZ) sur le port 80

Donne nous ton code ESP qui permet l'OTA, cela sera plus efficace que de tester des ports au hasard.

Je doute que cela puisse être utile mais ok, j'ai supprimé tout ce qui n'était pas en rapport avec l'OTA.

#include <Arduino.h>
#include <Wire.h>
#include "../include/InfoConnexion.h"
#include <SPI.h>
// autres include liés aux composants embarqués
#include <WiFi.h>
#include <PubSubClient.h>
#include "ArduinoOTA.h"

// Update these with values suitable for your network.
const char *mqtt_server = "192.168.1.16";
const char *device_id = "esp-mare";

#define MQTT_SERIAL_PUBLISH_CH "infomare/"

Adafruit_BME280 bme; // I2C
float nivEauCuve = 0;
float nivEauMare = 0;
float tempEauMare = 0;
float luminositeExt = 0;
float pressionAtmo = 0;
float humiditeAirExt = 0;
float tempAirExt = 0;

WiFiClient wifiClient;
PubSubClient clientMQTT(wifiClient);

unsigned long delayTime = millis();

//-----------------------------
// SETUP DE TOUS LES COMPOSANTS
//-----------------------------

//-----------------------------
// PRISES DE MESURES
//-----------------------------

void initValues()
{
  tempAirExt = ...
  pressionAtmo = ...
  humiditeAirExt = ...
  nivEauCuve = ...
  nivEauMare = ...
  tempEauMare = ...
  luminositeExt = ...
}

void publieLesValeurs()
{
  if (clientMQTT.connected()) {
    //publication des var globales
  }  
  delay(10);
}

void OnWiFiEvent(WiFiEvent_t event)
{
  switch (event)
  {
  case SYSTEM_EVENT_STA_CONNECTED:
    Serial.println("ESP32 Connected to WiFi Network");
    Serial.println("Adresse ip" + WiFi.localIP().toString());
    Serial.println("Passerelle IP :" + WiFi.gatewayIP().toString());
    Serial.println("DNS IP :" + WiFi.dnsIP().toString());
    Serial.println(WiFi.RSSI());
    break;
  case SYSTEM_EVENT_AP_START:
    Serial.println("ESP32 soft AP started");
    break;
  case SYSTEM_EVENT_AP_STACONNECTED:
    Serial.println("Station connected to ESP32 soft AP");
    break;
  case SYSTEM_EVENT_AP_STADISCONNECTED:
    Serial.println("Station disconnected from ESP32 soft AP");
    break;
  default:
    Serial.println("code wifi" + String(event));
    break;
  }
}

void reconnecteMQTT()
{
  while (!clientMQTT.connected())
  {
    if (clientMQTT.connect(device_id, MQTT_USER, MQTT_PASSWORD))
    {
      Serial.println(F("MQTT connected"));
      strcpy(mess, MQTT_SERIAL_PUBLISH_CH);
      strcat(mess, "relais/#");
      clientMQTT.subscribe(mess);      
    }
    else
    {
      Serial.print(F("failed, rc="));
      Serial.print(clientMQTT.state());
      Serial.println(F(" try again in 5 seconds"));
      // Wait 5 seconds before retrying
      delay(5000);      
    }
  }    
}

void setupWifi()
{
  IPAddress ip(192, 168, 1, 251);
  IPAddress gateway(192, 168, 1, 254);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 1, 254);
  delay(1000);
  WiFi.mode(WIFI_STA); // en mode station et pas en point d'accès avec APSTAT
  //  Config IP fixe
  WiFi.config(ip, gateway, subnet, dns);
  WiFi.begin(SSID, PASSWORD);
  WiFi.onEvent(OnWiFiEvent);
  //WiFi.setTxPower(WIFI_POWER_19dBm);
}

void setupMQTT()
{
  clientMQTT.setServer(mqtt_server, mqtt_port);
}

void initOTA()
{
  ArduinoOTA.setHostname(HostName);
  ArduinoOTA.setPort(3232);
  ArduinoOTA.setPassword(MQTT_PASSWORD);
}

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  setupWifi();
  setupMQTT();
  initOTA();
  initValues();
  if (!clientMQTT.connected())
  {
    Serial.print("mqtt deconnecte");
    Serial.printf("Wifi connecté : %d\n", wifiClient.connected());
    Serial.printf("Wifi disponible : %d\n", wifiClient.available());
    reconnecteMQTT();
    delay(500);
  }
}

void loop()
{
  ArduinoOTA.begin(); // faut-il télécharger une mise à jour ?

  if (!clientMQTT.connected()) reconnecteMQTT();

  clientMQTT.loop();

  if (millis() - delayTime >= 60000)
  {
   //initialisation des var globales 
    delayTime = millis();
    //publication des var globales
  }
  
  ArduinoOTA.handle(); //test s'il y a une demande OTA
  delay(100);
}

Pourquoi tu dis ça ?

Je rappelle que je ne suis pas du coup spécialiste de l'OTA, donc il est possible que je raconte des bêtises :slight_smile:
Ton code fait de l'OTA de l'ESP vers l'IDE(basicOTA) non ?
Toi si tu veux pouvoir téléverser depuis internet, il faut le faire de l'IDE vers l'ESP(en WEB ou Mise à jour via OTA par un téléchargement)
Dans la documentation de ArduinoOTA, il indique que ce n'est pas utilisable pour les ESP(32 et 8266) et qu'il faut utiliser ESP32httpUpdate.
Comme @J-M-L a donné un lien vers un tutoriel qui justement doit faire la même chose, j'aurais plutôt tendance à suivre ses conseils, quitte à changer ton code :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.