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

const char*ssid="Wokwi-GUEST";
const char*password="";

const char*mqttServer="mqtt.netpie.io";
const int mqtt_port=1883;
const char*mqtt_Client="f26e62bb-3c25-46d9-ab5c-cfad647c0a83";
const char*mqtt_username="4bWYZRJF9qwE9JMxFrFQMU74NBsDVusR";
const char*mqtt_password="xmYSKDABkWxWCFSttdbZH7WtAaFkXWJt";

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);
}

void wifiConnect()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid,password);
  while(WiFi.status()!=WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }
}

void mqttReconnect()
{
  while(!client.connected())
  {
    if(client.connect(mqtt_Client,mqtt_username,mqtt_password))
    client.subscribe("@msg/#");
    else
    delay(5000);
  }
}

void callback(char*topic,byte*payload,unsigned int length)
{
  String message;
  for(int i=0;i<length;i++)
  message = message+(char)payload[i];

  if(String(topic)=="@msg/message")
  {
    if(message=="on")
    {
      digitalWrite(ledPin,HIGH);
    }
    else if(message=="off")
    {
      digitalWrite(ledPin,LOW);
    }
  }
}

void loop() 
{
  delay(20);
  if(!client.connected())
  {
    mqttReconnect();
  }
  client.loop();
}