#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define mqtt_server "thingsboard.cloud"
#define mqtt_port 1883
#define mqtt_username "123"
#define mqtt_Password "12"
#define mqtt_deviceId "thimuthu"
#define LED_PIN 12
WiFiClient wifi_client;
PubSubClient MQTT;
bool LED_Status = false;
void RPC_callback(char* topic, byte* payload, unsigned int length) {
Serial.println("Msg Received");
Serial.print("topic -");
Serial.println(topic);
Serial.print("payload -");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
int len = 0;
while (topic[len] != 0) {
len++;
}
int req_no;
for (int i = 0; i < len; i++) {
if (topic[len - 1 - i] == 0x2F) {
req_no = atoi(topic + len - i);
break;
}
}
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
String method = doc["method"];
Serial.println(method);
String reply;
if (method == "getState") {
reply = LED_Status ? "true" : "false";
} else if (method == "setState") {
String LEDvalue = doc["params"];
if (LEDvalue == "true") {
Serial.println("Led turn on");
digitalWrite(LED_PIN, HIGH);
LED_Status = true;
} else {
Serial.println("Led turn off");
digitalWrite(LED_PIN, LOW);
LED_Status = false;
}
reply = "true";
} else {
reply = "123456";
}
String PUB_topic = "v1/devices/me/rpc/response/" + String(req_no);
MQTT.publish(PUB_topic.c_str(), reply.c_str());
}
void setup() {
Serial.begin(115200);
Serial.println("hello");
pinMode(LED_PIN, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
MQTT.setClient(wifi_client);
MQTT.setServer(mqtt_server, mqtt_port);
if (MQTT.connect(mqtt_deviceId, mqtt_username, mqtt_Password)) {
Serial.println("MQTT connected");
}
MQTT.setCallback(RPC_callback);
if (MQTT.subscribe("v1/devices/me/rpc/request/+")) {
Serial.println("Subscribed successfully");
}
}
void loop() {
MQTT.loop();
// Blink LED every second
if (LED_Status) {
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
}
}