Send an ESP32 New Firmware OTA

Send an ESP32 New Firmware OTA

To facilitate over-the-air (OTA) firmware updates for the ESP32 using a C# application, you’ll need to prepare both the ESP32 firmware to handle OTA requests and write C# code to send the new firmware to the ESP32.

Here’s a step-by-step guide with the required code snippets.

Step 1: Preparing ESP32 Firmware for OTA

  1. OTA Code for ESP32: Use the Arduino IDE to program your ESP32. Include OTA capabilities in your ESP32 firmware.
  2. Update ssid and password with your WiFi credentials.
  3. This code sets up the ESP32 to receive OTA updates.
  4. Here’s a simplified example: –
#include <WiFi.h> 
#include <ESPmDNS.h> 
#include <WiFiUdp.h> 
#include <ArduinoOTA.h>

const char* ssid = "yourSSID"
const char* password = "yourPASSWORD"
void setup() 
    WiFi.begin(ssid, password); 
    while (WiFi.status() != WL_CONNECTED) 

       Serial.println("Connecting to WiFi..."); 

    // Port defaults to 3232 
    // Hostname defaults to esp3232-[MAC] 
    // No authentication by default 
        String type; 
        if(ArduinoOTA.getCommand() == U_FLASH) 
            type = "sketch"; 


        // U_SPIFFS type = "filesystem"; 

        // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() 
        Serial.println("Start updating " + type);
     .onProgress([](unsigned int progressunsigned int total) 
         Serial.printf("Progress: %u%%\r", (progress / (total / 100))); 
     .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"); 

 void loop() 

Step 2: Creating the C# Application for OTA

  1. C# Application Setup:
    • Create a new C# Console or Windows Forms application in Visual Studio.
  2. Implementing OTA Update Function in C#:
    • Replace espIpAddress with the IP address of your ESP32.
    • Replace firmwarePath with the path to your compiled ESP32 firmware binary file.
    • Use the following code snippet to create a method that uploads the firmware file to the ESP32:
using System
using System.Net.Http
using System.Threading.Tasks

class Program {

    static async Task Main(string[] args

        var espIpAddress""// Replace with your ESP32 IP
        var string firmwarePath@"C:\path\to\your\firmware.bin"// Replace with your firmware file path 
        using (varclientnew HttpClient()) 
            var formnewMultipartFormDataContent(); 
            var firmwareData = System.IO.File.ReadAllBytes(firmwarePath); 
            form.Add(new ByteArrayContent(firmwareData0, firmwareData.Length), "firmware""firmware.bin"); 
            Console.WriteLine("Uploading firmware..."); 
            var responseawaitclient.PostAsync($"http://{espIpAddress}/update", form); 
                Console.WriteLine("Firmware upload successful."); 
                Console.WriteLine("Firmware upload failed."); 

Performing OTA Update

Run the C# application, ensuring the ESP32 is powered on and connected to the same network. The application will upload the new firmware to the ESP32, which will then apply the update and reboot.


This setup demonstrates the core components needed for OTA firmware updates for ESP32 using C#. Ensure proper error handling and secure the OTA process to prevent unauthorized access, especially in production environments.


Hi, my name is Stephen Finchett. I have been a software engineer for over 30 years and worked on complex, business critical, multi-user systems for all of my career. For the last 15 years, I have been concentrating on web based solutions using the Microsoft Stack including ASP.Net, C#, TypeScript, SQL Server and running everything at scale within Kubernetes.