Un saluto a tutto il forum di Arduino.
Sono nuovo di questo forum e volevo esporre il mio problema sulla funzione di callback del protocollo MQTT. Il mio scopo è quello di inviare un messaggio al broker e, tramite la funzione di callback, vorrei assegnare il contenuto del payload ad un'altra variabile per farci che voglio. Eseguendo il codice, dopo aver effettuato le connessioni, provo ad inviare un messaggio sul broker ma dal monitor seriale mi accorgo che la funzione di callback non viene mai chiamata.
Mi piacerebbe capire come funziona esattamente questa funzione, visto che negli sketch per accendere e spegnere il led va tutto bene.
Grazie
#include <WiFi.h>
#include <PubSubClient.h>
#define NAME "var/name"
#define LASTNAME "var/lastname"
const char* mqttServer = "......";
const char* ssid = ".....";
const char* password = ".........";
char myname[30];
char lastname[30];
String MsgIn;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
delay(1000);
Serial.begin(115200);
WiFi.begin(ssid,password);
client.setServer(mqttServer, 1883);
client.setCallback(callback);
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
client.subscribe(NAME);
client.subscribe(LASTNAME);
}
void callback(char* topic, byte* payload, unsigned int length)
{
MsgIn="";
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++)
{
MsgIn = MsgIn + ((char)payload[i]);
}
Serial.print(MsgIn);
if (topic == NAME)
{
for(int i=0;i<MsgIn.length();i++)
{
myname[i]=MsgIn[i];
}
Serial.println(myname);
}
if (topic == LASTNAME)
{
for(int i=0;i<MsgIn.length();i++)
{
lastname[i]=MsgIn[i];
}
Serial.println(lastname);
}
}
void reconnect()
{
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("esp")) {
Serial.println("connected");
client.subscribe(NAME);
client.subscribe(LASTNAME);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}