How to Implement OTA Updates for ESP32 with FreeRTOS on Google Cloud IoT Core?

@Middleware & OS
Hello guys am interested in
over the air
(OTA) firmware update of an ESP32 microcontroller running FreeRTOS and connect it to Google Cloud IoT Core for data monitoring, please i would need any form of guidance i can get i.e code examples or documentation and suggested libraries that can aid me in OTA updates for ESP32 with FreeRTOS
Solution
Your code should be identical or similar to 👇
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoOTA.h>

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* mqttServer = "mqtt.googleapis.com";
const char* mqttUsername = "unused";
const int mqttPort = 8883;
const char* devicePrivateKey = "YOUR_DEVICE_PRIVATE_KEY";

WiFiClientSecure wifiClient;
PubSubClient client(wifiClient);

void connectWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  }
}

void connectMQTT() {
  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);
  while (!client.connected()) {
    if (client.connect("ESP32-device", mqttUsername, devicePrivateKey)) {
      client.subscribe("your_topic");
    } else {
      delay(1000);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  // Handle incoming MQTT messages here
}

void setup() {
  Serial.begin(115200);

  connectWiFi();

  ArduinoOTA.setHostname("ESP32-device");
  ArduinoOTA.setPassword("Your_OTA_Password");

  // Callbacks to handle OTA updates
  ArduinoOTA.onStart([]() {
    Serial.println("OTA update started...");
  });

  ArduinoOTA.onEnd([]() {
    Serial.println("\nOTA update complete!");
    ESP.restart();
  });

  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));

    // You can use progress/total to publish update progress to Google Cloud IoT Core
  });

  ArduinoOTA.begin();

  connectMQTT();
}

void loop() {
  ArduinoOTA.handle();

  if (!client.connected()) {
    connectMQTT();
  }
  client.loop();

  // Perform your regular tasks here

  delay(1000);
}
Was this page helpful?