简体   繁体   中英

mqtt error void callback/subscribed on arduino

I'm testing with my arduino and MQTT cloud. For the publish everything goes well, the arduino publishes "hello world"

But with the void callback function nothing happens. With my MQTT.fx client, I'm subscribed to the topics "status" and "commando". At the "status" I see that the arduino is a live.

When I publish with my MQTT.fx client to the topic "commando". I can see it arrived in my client, but not in the serial monitor of the arduino.

Why is the void callback function not used?

 #include <SPI.h> #include <PubSubClient.h> #include <Ethernet.h> #define server "m20.cloudmqtt.com" int port = 13365; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; byte ip[] = { 192, 168, 0, 120 }; unsigned long time; char message_buff[100]; EthernetClient ethClient; PubSubClient client(server, port, callback, ethClient); void setup() { // init serial link for debugging Serial.begin(115200); Ethernet.begin(mac, ip); if (client.connect("arduino-MQTT","test","test")) { client.publish("/arduino/status/","hello world"); client.subscribe("/arduino/commando/"); Serial.println("Connected"); } if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); return; } } void loop() { // MQTT client loop processing client.loop(); } void callback(char* topic, byte* payload, unsigned int length) { if (strcmp(topic, "/arduino/commando/") == 0) { String msg = toString(payload, length); Serial.println(msg); }else{ Serial.println("arduino topic not found"); } } // // toString function // String toString(byte* payload, unsigned int length) { int i = 0; char buff[length + 1]; for (i = 0; i < length; i++) { buff[i] = payload[i]; } buff[i] = '\\0'; String msg = String(buff); return msg; } 

I have just tested your code with RSMB broker and it works. I do not have DHCP on my computer so I had to comment out DHCP handling code - Ethernet.begin(mac) . I think that's where your bug is. Because:

  1. You assign static IP to your Ethernet
  2. Connect to mqtt broker, and subscribe to a topic
  3. Query DHCP for a new IP. Probably at this point your Arduino gets a different IP than statically configured and the broker cannot reach your Arduino any more to publish subscribed topic.

Fix your Ethernet handling code. I like this formula:

// Start the Ethernet connection:
Serial.println(F("Querying DHCP"));
if ( Ethernet.begin( mac ) == 0 ) {
    Serial.println(F("DHCP failed, fallback to static IP"));
    // When DHCP fails, fallback to static configuration ;
    Ethernet.begin( mac, ip ) ;
}
printIp() ;  

And printIp function:

void printIp() {
  // Print local IP address
  Serial.print(F("My IP "));
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print('.');
  } 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM