#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "demo.thingsboard.io";
const int mqttPort = 1883; // Default MQTT port
const char* mqttUser = ""; // If your MQTT server requires authentication
const char* mqttPassword = ""; // If your MQTT server requires authentication
const char* deviceToken = "3PYgZqEMhK5u3Lu4ZKvK";
const char* switchStateTopic = "v1/devices/me/attributes";
const char* switchControlTopic = "v1/devices/me/rpc/request/+";
const int ledPin = 2; // Pin number where the LED is connected
const int ledPin2 = 47;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, 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("v1/devices/me/attributes/ledState");
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("RPC Request received on topic: " + String(topic) + ", payload: " + message);
// Parse the JSON payload to extract method and parameters
DynamicJsonDocument doc(512);
DeserializationError error = deserializeJson(doc, payload, length);
if (error) {
Serial.println("Failed to parse JSON payload");
return;
}
// Extract method and parameters from the JSON payload
const char* method = doc["method"];
bool params = doc["params"];
// Check if the method is "setValue" and take appropriate action
if (strcmp(method, "setLedValue") == 0) {
Serial.println("Method: setLedValue, Params: " + String(params));
// Toggle LED state based on the received parameter value
digitalWrite(ledPin, params ? HIGH : LOW);
if (params==HIGH){
String payload = "{\"LED VALUE\":1}";
char attributes[1000];
payload.toCharArray(attributes, 1000);
mqttClient.publish("v1/devices/me/telemetry", attributes);
}
else{
String payload = "{\"LED VALUE\":0}";
char attributes[1000];
payload.toCharArray(attributes, 1000);
mqttClient.publish("v1/devices/me/telemetry", attributes);
}
}
if (strcmp(method, "setValue") == 0) {
Serial.println("Method: setValue, Params: " + String(params));
// Toggle LED state based on the received parameter value
digitalWrite(ledPin2, HIGH);
delay(1000);
digitalWrite(ledPin2, LOW);
// if (params==1){
// String payload = "{\"LED VALUE\":1}";
// char attributes[1000];
// payload.toCharArray(attributes, 1000);
// mqttClient.publish("v1/devices/me/telemetry", attributes);
// }
// else{
// String payload = "{\"LED VALUE\":0}";
// char attributes[1000];
// payload.toCharArray(attributes, 1000);
// mqttClient.publish("v1/devices/me/telemetry", attributes);
// }
}
}
void reconnect() {
// Loop until we're reconnected
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
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");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
}