#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "mqtt.thingsboard.cloud"; // Serveur MQTT ThingsBoard
const char* mqtt_user = "m28MCadE26eJDXjSk930";  // Access Token ThingsBoard
const char* mqtt_topic = "v1/devices/me/telemetry"; 

WiFiClient espClient;
PubSubClient client(espClient);

#define WIFI_LED 2   
#define MQTT_LED 15  

void setup_wifi() {
  Serial.println("\nConnexion au WiFi...");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nWiFi connecté !");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Test de la résolution DNS
  Serial.print("Test de résolution DNS : ");
  IPAddress mqtt_ip;
  if (WiFi.hostByName(mqtt_server, mqtt_ip)) {
    Serial.print("Réussi, IP : ");
    Serial.println(mqtt_ip);
    client.setServer(mqtt_ip, 1883);
  } else {
    Serial.println("Échec, utilisation du serveur Mosquitto pour test.");
    client.setServer("test.mosquitto.org", 1883); // Serveur de test
  }
}

void reconnect() {
  if (WiFi.status() != WL_CONNECTED) return;

  while (!client.connected()) {
    Serial.print("Connexion à MQTT...");
    if (client.connect("ESP32_Client", mqtt_user, "")) {  
      Serial.println(" Connecté à MQTT !");
      client.loop();
    } else {
      Serial.print(" Échec, code erreur = ");
      Serial.println(client.state());
      Serial.println("Nouvelle tentative dans 5s...");
      delay(5000);
    }
  }
}

void checkWiFi() {
  digitalWrite(WIFI_LED, WiFi.status() == WL_CONNECTED ? HIGH : LOW);
}

void checkMQTT() {
  digitalWrite(MQTT_LED, client.connected() ? HIGH : LOW);
}

// Fonction pour publier un message sur ThingsBoard
void publishMessage() {
  if (client.connected()) { 
    String message = "{\"temperature\": 30.3, \"humidity\": 70}"; 
    client.publish(mqtt_topic, message.c_str()); 
    Serial.println("Message envoyé : " + message); 
  } else {
    Serial.println("Erreur : Pas connecté à MQTT !");
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(WIFI_LED, OUTPUT);
  pinMode(MQTT_LED, OUTPUT);
  setup_wifi();
}

void loop() {
  checkWiFi();
  reconnect();
  checkMQTT();
  client.loop(); 

  // Envoie un message toutes les 10 secondes
  static unsigned long lastPublish = 0;
  if (millis() - lastPublish > 10000) { 
    lastPublish = millis();
    publishMessage();
  }

  delay(10);
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
led1:A
led1:C
led2:A
led2:C
r1:1
r1:2
r2:1
r2:2