#include <WiFi.h>
#include <PubSubClient.h>
const char*ssid="Wokwi-GUEST";
const char*password="";
const char*mqttServer="broker.netpie.io";
const int mqtt_port=1883;
const char*mqtt_Client="541d2d4a-2e23-41ba-a7b8-c346521329d8";
const char*mqtt_username="myspSmXHVfGLg8rbgrE29DoozfbUCJFD";
const char*mqtt_password="JMQ47fCIY*QlJs1nPjtNFvTtE17KD8Ag";
WiFiClient espClient;
PubSubClient client(espClient);
int ledPin=23;
void setup()
{
Serial.begin(9600);
delay(10);
Serial.println();
Serial.println("Connecting to..");
Serial.println(ssid);
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
client.setServer(mqttServer,mqtt_port);
client.setCallback(callback);
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,HIGH);
Serial.println("Connect to the broker First!\n");
while (!client.connect(mqtt_Client,mqtt_username,mqtt_password));
client.subscribe("@private/shadow/data/get/response");
char msg[100];
String data = R"({"data": {"led": "on"}})";
Serial.println("Broker connected");
data.toCharArray(msg, (data.length() + 1));
client.publish("@shadow/data/update", msg);
data = "";
data.toCharArray(msg, (data.length() + 1));
client.loop();
client.publish("@shadow/data/get", msg);
for (int i=0;i<100;i++) {
delay(10);
client.loop();
}
}
void wifiConnect()
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,password);
while(WiFi.status()!=WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
}
int mqttReconnect()
{
if(client.connected()) {
client.loop(); return 0;
}
client.connect(mqtt_Client,mqtt_username,mqtt_password);
delay(20);
if(client.connected()) {
client.subscribe("@private/shadow/data/get/response");
Serial.println("Successfully reconnect to the broker!\n");
client.loop();
return 0;
}
else
{
Serial.println("Trying to connect to the broker in a second!\n");
delay(1000);
return -1;
}
}
void callback(char*topic,byte*payload,unsigned int length)
{
String message;
Serial.println("Callback called");
for(int i=0;i<length;i++)
message = message+(char)payload[i];
Serial.println(String(topic));
if(String(topic)=="@shadow/data")
{
if(message=="on")
{
digitalWrite(ledPin,HIGH);
}
else if(message=="off")
{
digitalWrite(ledPin,LOW);
}
}
}
void loop()
{
char msg[100];
if ( mqttReconnect()!= -1) {
String data = R"({"data": {"led": "off"}})";
Serial.println("off");
data.toCharArray(msg, (data.length() + 1));
client.loop();
client.publish("@shadow/data/update", msg);
data = "";
data.toCharArray(msg, (data.length() + 1));
client.loop();
client.publish("@shadow/data/get", msg);
for (int i=0;i<100;i++) {
delay(10);
client.loop();
}
mqttReconnect();
data = R"({"data": {"led": "on"}})";
Serial.println("on");
data.toCharArray(msg, (data.length() + 1));
client.loop();
client.publish("@shadow/data/update", msg);
data = "";
data.toCharArray(msg, (data.length() + 1));
client.loop();
client.publish("@shadow/data/get", msg);
for (int i=0;i<100;i++) {
delay(10);
client.loop();
}
}
}