
#include <ESP8266WiFi.h>
#include <PubSubClient.h>


const char* ssid = "WIND-WiFi-D67E"; //ssid al quale si vuole connettere
const char* password = ""; //password del wifi
const char* mqtt_server = "192.168.8.102";// indirrizzo ip della macchina sulla quale si ha il broker mqtt
const char* clientID = "esp";
const char* outTopic = "NodeMCUout";  //topic dal quale i messaggi vengono scritti dall' arduino
const char* inTopic = "NodeMCUin";// messaggio dal quale 
String messaggio;

WiFiClient espClient;
PubSubClient client(espClient);
char msg[50];

void setup_wifi() {  //permette la connessione alla rete wifi

  Serial.println();
  Serial.print("Connessione a  ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("non sono connesso");
    delay(1000);
  }

  Serial.println("");
  Serial.println("WiFi connesso");
  Serial.println("indirizzo IP: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) { // all' arrivo di un messaggio sull topic al quale ci siamo iscritti entriamo in questa funzione
  payload[length] = '\0'; //converte char in una stringa perchè il terminatore di stringa è \0
  String message = (char*)payload;

  Serial.print("Messaggio arrivato sull' arduino:");
  Serial.println(message);
  if(message == "prova\n")
    client.publish(outTopic, "ok"); //publicca un messaggio su topic outtopic
}

void reconnect() {
  while (!client.connected()) {
   Serial.print("tentativo di connessione al servere MQTT");
    if (client.connect(clientID)) {
     Serial.println("connesso");
      client.publish(outTopic, clientID); //pubblico il mio id per vedere se davvero mi sono connesso
      client.subscribe(inTopic); //mi sottoscrivo al topic dal quale aspetto comandi
    } else {
      Serial.println("riprovo a connettermi");
      delay(1000);
    }
  }
}

void setup() {
  Serial.begin(9600);
  setup_wifi(); //connetto al wifi
  client.setServer(mqtt_server, 1883);  //setto server mqtt
  client.setCallback(callback); //setto la funzione che si avvia alla ricezione di un messaggio su questo topic
}

void loop() {

  if (!client.connected()) {
    reconnect(); //mi fa connettere al client mqtt
  }
  if(Serial.available())
  {
    messaggio=Serial.readString();
    messaggio.toCharArray(msg,6);// la uso perchè publish accetta solo char
    Serial.print(messaggio);
    client.publish(outTopic, msg);
  }
  client.loop();
  
}
