#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h> // Include ArduinoJson library
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "demo.thingsboard.io";
const int mqttPort = 1883;
const char* mqttUser = "";
const char* mqttPassword = "";
const char* deviceToken = "3PYgZqEMhK5u3Lu4ZKvK";
const char* switchStateTopic = "v1/devices/me/attributes/switchState";
const char* switchControlTopic = "v1/devices/me/rpc/request/+";
const char* ledStateTopic = "v1/devices/me/attributes/ledState";
const int ledPin = 2;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
bool ledState = false; // Initial LED state
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
setupWiFi();
setupMQTT();
}
void setupWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
}
void setupMQTT() {
mqttClient.setServer(mqttServer, mqttPort);
mqttClient.setCallback(callback);
mqttClient.subscribe(switchStateTopic);
mqttClient.subscribe(ledStateTopic); // Subscribe to LED state updates
reconnect();
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Message arrived on topic: " + String(topic) + ", payload: " + message);
if (strcmp(topic, switchStateTopic) == 0) {
// Received switch state update from ThingsBoard
if (message.equals("on")) {
digitalWrite(ledPin, HIGH); // Turn on the LED
ledState = true; // Update LED state
} else {
digitalWrite(ledPin, LOW); // Turn off the LED
ledState = false; // Update LED state
}
// Publish LED state to ThingsBoard as an attribute
mqttClient.publish(ledStateTopic, ledState ? "true" : "false");
} else if (strcmp(topic, switchControlTopic) == 0) {
// Received switch control message from ThingsBoard
// Process the message if needed
}
}
void reconnect() {
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
if (mqttClient.connect("ESP32Client", deviceToken, NULL)) {
Serial.println("connected");
mqttClient.subscribe(switchControlTopic);
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
}