Exemplo de envio de dados usando MQTT com a ESP32. Exemplo prático (funcional) do MQTT com ESP32 Async Usei a lib Async MQTT Client #define MQTT_MAX_PACKET_SIZE 30000 // Increase the maximum packet size #include <WiFi.h> #include <AsyncMqttClient.h> #define WIFI_SSID "my-wifi" // Replace with your Wi-Fi SSID #define WIFI_PASSWORD "my-password" // Replace with your Wi-Fi password #define MQTT_HOST IPAddress(0, 0, 0, ) // Replace with your MQTT broker's IP` #define MQTT_PORT 1883 // Replace with your MQTT broker's port if different AsyncMqttClient mqttClient; TimerHandle_t wifiReconnectTimer; TimerHandle_t mqttReconnectTimer; const int ARRAY_SIZE = 5000; int randomArray[ARRAY_SIZE]; void connectToWifi() { Serial.println("Connecting to Wi-Fi..."); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); } void connectToMqtt() { Serial.println("Connecting to MQTT..."); mqttClient.connect(); } void WiFiEvent(WiFiEvent_t event) { switch (event) { case ARDUINO_EVENT_WIFI_STA_GOT_IP: Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); connectToMqtt(); break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: Serial.println("WiFi lost connection"); xTimerStop(mqttReconnectTimer, 0); xTimerStart(wifiReconnectTimer, 0); break; } } void onMqttConnect(bool sessionPresent) { Serial.println("Connected to MQTT."); // Generate random numbers Serial.println("Generating random numbers..."); for (int i = 0; i < ARRAY_SIZE; i++) { randomArray[i] = random(0, 1000000); // Generates random integers between 0 and 999,999 } // Send the array via MQTT Serial.println("Publishing message..."); size_t payloadSize = sizeof(randomArray); uint16_t packetIdPub = mqttClient.publish( "test/randomArray", // Topic name 0, // QoS level false, // Retain flag (const char*)randomArray, payloadSize ); Serial.print("Publishing at QoS 0, packetId: "); Serial.println(packetIdPub); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { Serial.println("Disconnected from MQTT."); if (WiFi.isConnected()) { xTimerStart(mqttReconnectTimer, 0); } } void setup() { Serial.begin(115200); // Seed the random number generator randomSeed(analogRead(0)); wifiReconnectTimer = xTimerCreate( "wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi) ); mqttReconnectTimer = xTimerCreate( "mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt) ); WiFi.onEvent(WiFiEvent); mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); mqttClient.setCredentials("username", "password"); mqttClient.setServer(MQTT_HOST, MQTT_PORT); connectToWifi(); } void loop() { // Nothing to do here since we're using asynchronous callbacks } Leitura dos dados recebidos no Python usando Paho Client: import paho.mqtt.client as mqtt import struct # Define MQTT broker details broker = 'broker-host' # Replace with your broker's address port = 1883 # Typically 1883 for non-SSL, 8883 for SSL topic = 'test/randomArray' # Topic to subscribe/publish username = 'username' # Replace with your username password = 'password' # Replace with your password # Define callback for connection def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to broker") client.subscribe(topic) # Subscribe to the topic upon successful connection else: print(f"Connection failed with code {rc}") # Define callback for received messages def on_message(client, userdata, msg): print(f"Message received: {msg.payload} on topic {msg.topic}") payload = msg.payload print(f"Received msg on topic {msg.topic} with payload size {len(payload)} bytes") # Calculate the number of integers in the payload num_integers = len(payload) // 4 # 4 bytes per integer # Check if the payload size is as expected if num_integers != 5000: print(f"Warning: Expected 5000 integers, but received {num_integers}") # Unpack the binary data into a tuple of integers # Use '>' for big-endian or '<' for little-endian depending on how the data was sent integers = struct.unpack('<' + 'i' * num_integers, payload) # '<' for little-endian # Now 'integers' is a tuple containing the integers print("First 10 integers received:", integers[:10]) # If you want to convert the tuple to a list integers_list = list(integers) print('Integers list:',integers_list) # Initialize the MQTT client client = mqtt.Client() # Set username and password client.username_pw_set(username, password) # Attach callbacks client.on_connect = on_connect client.on_message = on_message # Connect to the broker client.connect(broker, port, 60) # Function to publish a message def publish_message(client, topic, message): client.publish(topic, message) print(f"Message '{message}' published on topic '{topic}'") # Start the MQTT client loop to handle reconnects, subscriptions, etc. client.loop_start() # Example of publishing a message publish_message(client, topic, "Hello, MQTT!") # Keep the script running for a while to receive messages try: while True: pass except KeyboardInterrupt: print("Disconnecting from broker") client.loop_stop() client.disconnect()