Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 2 months ago.
MQTT Hello world on NUCLEO_F429ZI (and F746ZG) freezes after a couple of minutes or so
Hi.
Did anybody know why a simple usage of MQTT paho embedded C client for mbedos5 like the following hangs after 90 seconds? I referred to
Import programHelloMQTT
Sample MQTT program - simple send and receive
for usage of such lib.
Actually, using a periodic publisher publishing messages at 1 msg per second rate as well as at 1 msg every 3 seconds (periodic publisher has been implemented through a node-red flow), I always have my firmware stop receving published messages after 90 seconds (many trials, same result).
This is my code (excerpt):
[...] void messageArrived(MQTT::MessageData& md) { MQTT::Message &message = md.message; logMessage("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id); logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload); logMessage("Received messages count: %d\r\n", ++arrivedcount); } [...] int main(int argc, char* argv[]) { float version = 0.6; char* topic = "mbed-sample"; logMessage("HelloMQTT: version is %.2f\r\n", version); NetworkInterface* network = easy_connect(true); if (!network) { return -1; } MQTTNetwork mqttNetwork(network); MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork); const char* hostname = "138.68.78.136"; // "m2m.eclipse.org"; int port = 1883; logMessage("Connecting to %s:%d\r\n", hostname, port); int rc = mqttNetwork.connect(hostname, port); if (rc != 0) logMessage("rc from TCP connect is %d\r\n", rc); MQTTPacket_connectData data = MQTTPacket_connectData_initializer; data.MQTTVersion = 3; data.clientID.cstring = "mbed-sample"; data.username.cstring = "sk"; //"testuser"; data.password.cstring = "sk-1"; //"testpassword"; if ((rc = client.connect(data)) != 0) logMessage("rc from MQTT connect is %d\r\n", rc); if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0) logMessage("rc from MQTT subscribe is %d\r\n", rc); MQTT::Message message; // QoS 0 /*char buf[100]; sprintf(buf, "Hello World! QoS 0 message from app version %f\r\n", version); message.qos = MQTT::QOS0; message.retained = false; message.dup = false; message.payload = (void*)buf; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); while (arrivedcount < 1) client.yield(100);*/ // QoS 1 /*sprintf(buf, "Hello World! QoS 1 message from app version %f\r\n", version); message.qos = MQTT::QOS1; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); while (arrivedcount < 2) client.yield(100);*/ // QoS 2 /*sprintf(buf, "Hello World! QoS 2 message from app version %f\r\n", version); message.qos = MQTT::QOS2; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); while (arrivedcount < 3) client.yield(100);*/ logMessage("waiting for blue button...\r\n"); while(!blueButton.read()) client.yield(); logMessage("...disconnecting...\r\n"); if ((rc = client.unsubscribe(topic)) != 0) logMessage("rc from unsubscribe was %d\r\n", rc); if ((rc = client.disconnect()) != 0) logMessage("rc from disconnect was %d\r\n", rc); mqttNetwork.disconnect(); logMessage("Version %.2f: finish %d msgs\r\n", version, arrivedcount); return 0; }
1 Answer
7 years ago.
Hello. The MQTT library has now been updated to work better with mbed OS 5, so hopefully should work better for you.
Does the issue also occur when using HelloMQTT version 49c9daf2b0ff, and MQTT version e335fcc1a663 ? We were tracing a bug down last week with using free'd memory with the latest release, and maybe this is related?
posted by Jan Jongboom 11 Sep 2017