8 years, 1 month ago.

MQTT async implementation

Hi all,

I'm trying to get the async version of MQTT to run but fail with the implementation of the callbacks. What I did so far is creating a header for my application with:

CommunicationManager.h

#define MQTTCLIENT_QOS2 1

#include "mbed.h"
#include "rtos.h"
#include "ModemManager.h"
#include "MQTTAsync.h"

#define MQTTMGR_SERVERNAME "test.domain"
#define MQTTMGR_SERVERPORT 1883
#define MQTTMGR_CLIENTID "user_001"
#define MQTTMGR_USERNAME "user_001"
#define MQTTMGR_PASSWORD "test1234"

class CommunicationManager {
    public:
        CommunicationManager();
        void run();
        
    private:
        MQTT::Async<ModemManager, Countdown, Thread, Mutex>* mqttClient;
};

void resultHandler(MQTT::Result*);

Then I implemnt this as follows:

CommunicationManager.cpp

#include "CommunicationManager.h"

CommunicationManager::CommunicationManager() 
{

}


void CommunicationManager::run() {
  
    // Connect to MQTT Broker
    MQTTPacket_connectData connData = MQTTPacket_connectData_initializer;
    connData.MQTTVersion = 3; // Version 3 = MQTT version 3.1
    connData.clientID.cstring = MQTTMGR_CLIENTID;
    connData.username.cstring = MQTTMGR_USERNAME;
    connData.password.cstring = MQTTMGR_PASSWORD;
    connData.keepAliveInterval = 120;
    connData.cleansession = 0;
    ret = connect(resultHandler, connData);
    
    while (true){
		// TO IMPLEMENT
    }
}

void resultHandler(MQTT::Result* res)
{
    // TO IMPLEMENT
}

Whit this code I get the following compile errors:

  • Incomplete type is not allowed "void resultHandler(MQTT::Result*);"
  • Namespace "MQTT" has no member "Result" "void resultHandler(MQTT::Result*)"
  • Expected an expression "void resultHandler(MQTT::Result*)"

Any ideas on how to correctly implement the async MQTT version are appreciated! Christoph

Question relating to:

An API for using MQTT over multiple transports MQTT, MQTTClient

I figured it out in the meantime andit seems to work:

#include "CommunicationManager.h"

CommunicationManager::CommunicationManager() 
{
    mqttClient = new MQTT::Async<ModemManager, Countdown, Thread, Mutex>(modem);
}


void CommunicationManager::run() {

    // Connect to MQTT Broker
    MQTTPacket_connectData connData = MQTTPacket_connectData_initializer;
    connData.MQTTVersion = 3; // Version 3 = MQTT version 3.1
    connData.clientID.cstring = MQTTMGR_CLIENTID;
    connData.username.cstring = MQTTMGR_USERNAME;
    connData.password.cstring = MQTTMGR_PASSWORD;
    connData.keepAliveInterval = 120;
    connData.cleansession = 0;
    ret = mqttClient->connect(resultHandler, &connData);
    
    while (true){
		// To IMPLEMENT
	}
}

void resultHandler(MQTT::Async<ModemManager, Countdown, Thread, Mutex>::Result* res)
{
	// TO IMPLEMENT
}
posted by Christoph W. 25 Feb 2016
Be the first to answer this question.