#include #include #include // --- WiFi Settings --- const char* ssid = "floflo"; const char* password = "florence"; // --- Azure MQTT Settings --- const char* mqtt_server = "mqtt-test2.southeastasia-1.ts.eventgrid.azure.net"; const int mqtt_port = 8883; const char* mqtt_clientID = "my-device"; // Azure Event Grid may require username (often the client ID) const char* mqtt_username = "my-device"; // Password might be a SAS token or empty for cert-based auth const char* mqtt_password = ""; // // --- Complete Certificate Chain --- // // Root CA static const char root_ca[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- )EOF"; //Intermediate CA static const char intermediate_ca[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- )EOF"; // Device Certificate static const char device_cert[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- )EOF"; // Device Private Key static const char device_key[] PROGMEM = R"EOF( -----BEGIN PRIVATE KEY----- -----END PRIVATE KEY----- )EOF"; // -------------Establish WiFi Connection----------------------- // Secure WiFi client WiFiClientSecure espClient; // MQTT client PubSubClient client(espClient); // Connection status tracking unsigned long lastReconnectAttempt = 0; bool mqttConnected = false; void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to WiFi: "); Serial.println(ssid); WiFi.begin(ssid, password); int attempts = 0; while (WiFi.status() != WL_CONNECTED && attempts < 20) { delay(500); Serial.print("."); attempts++; } if (WiFi.status() == WL_CONNECTED) { Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } else { Serial.println(""); Serial.println("WiFi connection failed!"); } } void reconnect() { if (millis() - lastReconnectAttempt < 5000) { return; // Don't retry too frequently } lastReconnectAttempt = millis(); Serial.print("Connecting to Azure MQTT..."); // Try to connect with username/password (may be required for Azure Event Grid) if (client.connect(mqtt_clientID, mqtt_username, mqtt_password)) { Serial.println("connected!"); mqttConnected = true; // Subscribe to any topics if needed // client.subscribe("my-device/commands"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(); // Print more detailed error information switch(client.state()) { case -4: Serial.println("Connection timeout"); break; case -3: Serial.println("Connection lost"); break; case -2: Serial.println("Connect failed"); break; case -1: Serial.println("Disconnected"); break; case 1: Serial.println("Bad protocol"); break; case 2: Serial.println("Bad client ID"); break; case 3: Serial.println("Unavailable"); break; case 4: Serial.println("Bad credentials"); break; case 5: Serial.println("Unauthorized"); break; } mqttConnected = false; } } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (unsigned int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } void setup() { Serial.begin(115200); Serial.println("Starting Azure MQTT client..."); setup_wifi(); if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi not connected, halting..."); while(1) delay(1000); } // Configure TLS certificates // For a complete chain, you might need to concatenate certificates // espClient.setCACert(root_ca); espClient.setCACert(intermediate_ca); espClient.setCertificate(device_cert); espClient.setPrivateKey(device_key); // Optional: Enable certificate verification client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); // Set a reasonable timeout client.setSocketTimeout(15); Serial.println("Setup complete"); } void loop() { // Ensure WiFi is still connected if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi disconnected, reconnecting..."); setup_wifi(); return; } // Handle MQTT connection if (!client.connected()) { mqttConnected = false; reconnect(); } else { client.loop(); // Only send telemetry if connected if (mqttConnected) { // Create a more structured payload String payload = "{\"deviceId\":\"my-device\",\"temperature\":38.0,\"timestamp\":" + String(millis()) + "}"; // Use Azure Event Grid compatible topic format String topic = "my-device/telemetry/temperature"; bool published = client.publish(topic.c_str(), payload.c_str()); if (published) { Serial.println("Telemetry sent: " + payload); } else { Serial.println("Failed to publish telemetry"); } } } delay(10000); // Send every 10 seconds instead of 5 }