Espota from internet

Good morning,
I have an ESP32 that works 24h/24, which I can update with vscode remotely (OTA) from the local network.
On the same home LAN I have a NAS with reverse proxy. So from the internet, a:

ping esp.xxx.synology.me

reaches the NAS

My question: is it possible to reprogram the ESP32 from the internet?

Now I put in the platformio.io:

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

but I get this:

21:46:46 [DEBUG]: Options: {'esp_ip': 'esp.xxx.synology.me', 'host_ip': '0.0.0.0', 'esp_port': 3232, 'host_port': 58404, 'auth': 'password', 'image': '.pio\\build\\esp-32\\firm ware.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

Is it just possible?
Thank you

Where’s a weird space here for no reason? Did you modify env["PROGNAME"]?

The ESP32 should not care where the conenctions come from. If UDP port 3232 is port-forwarded to the ESP on that domain, it should work.

Hello
Sorry I don’t understand the first point. I did not enter this instruction anywhere.

And no, I did not modify the env[“PROGNAME”] paragraph in the platformio.ini file.

I don’t know if Synology’s reverse proxy sends messages in UDP because I have configured it as follows :
image

Besides, I haven’t opened any particular ports on my internet box. I thought it was not useful because I am accessing all machines on my local network correctly.

But neither the destination not source protocol is HTTP. And if you configured the SRC to be on port 80, then you would also need to tell PlatformIO to access that port from the outside. Do you have the option to setup a 1:1 relationship between Source UDP 3232 and Destination UDP 3232? That should make it work without modifications.

No i can’t do that in my reverse proxy but it’s possible using NAT with my internet box.
I will try
Thank you for this idea

Hello
I just changed the settings of my internet box to transfer everything that comes in UDP port 3232 to my esp with the same port 3232.
Obviously it’s a little bit better

Here is the result :

Successfully created esp32 image.
Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = espota
Uploading .pio\build\esp-32\firmware.bin
22:18:28 [DEBUG]: Options: {'esp_ip': 'esp.xxx.synology.me', 'host_ip': '0.0.0.0', 'esp_port': 3232, 'host_port': 23524, 'auth': 'password', 'image': '.pio\\build\\esp-32\\firmware.bin', 'spiffs': 
False, 'debug': True, 'progress': True, 'timeout': 10}
22:18:28 [INFO]: Starting on 0.0.0.0:23524
22:18:28 [INFO]: Upload size: 821168
Sending invitation to esp.xxx.synology.me 
Authenticating...OK       <---- NEW
22:18:28 [INFO]: Waiting for device...
22:18:38 [ERROR]: No response from device
*** [upload] Error 1

No change in platformio.ini and I confirm there is no space in the word “firmware”.

Oh, actually this process is more complicated. It starts off with UDP, but then it will ask the ESP to connect to the given TCP server port opened by the computer, i.e., from the ESP32 (source port probably random) to the computer, target port 23524 in this case. See source code. This port number is however random

So what you should do:

  1. Use upload_flags in the platformio.ini to add --host_port, then it should have a fixed TCP server port on the PC side
  2. Make another rule so that the ESP32 can reach your computer’s TCP server port as decided above

First, thank you Maxgerhardt for your help !
Then, I’ve fixed host_port in platformio.ini

upload_port = 176.xxx.yyy.zzz  ; it's the IP adress of my internet box
upload_flags = 
	--port=3232
	--auth=password
	--host_port=22564 ; selected by me
upload_protocol = espota

then, the rules are now

  • protocole=tous means protocole=tcp or udp
  • 192.168.1.251 is the local IP adress of the ESP
09:28:48 [DEBUG]: Options: {'esp_ip': '176.xxx.yyy.zzz', 'host_ip': '0.0.0.0', 'esp_port': 3232, 'host_port': 22564, 'auth': 'password', 'image': '.pio\\build\\esp-32\\firmware.bin', 'spiffs': False, 'debug': True, 'progress': True, 'timeout': 10}
09:28:48 [INFO]: Starting on 0.0.0.0:22564
09:28:48 [INFO]: Upload size: 821168
Sending invitation to 176.146.75.156 
Authenticating...OK
09:28:48 [INFO]: Waiting for device...
09:28:58 [ERROR]: No response from device
*** [upload] Error 1

a problem remains …

To complete, if I deactivate the firewall of my internet box and the firewall of my computer, the problem persists.

Then something is still wrong with the port forwarding. I guess you could a very minimal sketch for the ESP32 (uploaded via serial) that tries to connect to TCP 22564 on your computer’s IP address (e.g. derived from this) while a minimal TCP server is opened by e.g. this program.

Thank you Maxgerhardt, I continue to search.

I just stumbled across this thread, but I got this to work using PlatformIO/VSCode and regular consumer grade routers at each location. A Linksys router on one end, and an ASUS router on the other.

In the platformio.ini of the new sketch to be uploaded I set:

upload_protocol = espota
upload_flags =
–port=3232
–host_port=22564 ;
upload_port = 199.XXX.XXX.XXX ; redacted Public IP address

On the router where the ESP32 is located (about 1500 miles away), I remotely forwarded port 3232 (both TCP and UDP) to the internal/private IP address of the ESP32.

On the router where the PC running PlatformIO/VSCode is located (and me), I forwarded port 22564 (both TCP and UDP) to the internal/private IP address of the PC I was using.

I clicked the upload button in PlatformIO and boom…It worked.

Of course the remote ESP32 sketch was already running ArduinoOTA/ESPOTA code, but I’d only ever used it when the device was on the same LAN as the PC. The settings above allowed me to update with a new sketch over the internet.

Oh, and of course I knew the public IPv4 address of the remote router. The remote location internet has dynamic IP, but it doesn’t change often, and the sketch running on the ESP32 there reports the some data back to my NAS every 15 minutes which includes the Public IP address on that end. I’m sure setting up a DDNS on the remote router would work too, but I haven’t tested whether the Upload port flag on the PlatformIO.ini can lookup the IP address directly.