Paho C ++ Mqtt Callback на Подписаться на темы - PullRequest
0 голосов
/ 02 октября 2019

Я разрабатываю новое приложение, которое подключается к серверу MQTT на esp8266. Я использую библиотеку PahoMQTT Arduino (https://platformio.org/lib/show/1560/Paho).

Я реализовал класс утилит MQTT. Мне не нужно получать исключение, все выглядит хорошо. Я не мог перезвонить, подписавшись наtopic.

Как я могу отозвать метод в подписанной теме?

Это код, который я уже пробовал.

/////MqttUtils.h

class MqttUtilsClass {
private:
protected:
    bool initialSubscribeTopics();

    WiFiClient wiFiClient;
    IPStack ipstack = IPStack(wiFiClient);
    MQTT::Client<IPStack, Countdown, 1024, 5> *mqttClient = NULL;
public:
    MqttUtilsClass(){
        mqttClient= new MQTT::Client<IPStack, Countdown, 1024, 5>(ipstack);
    }
    static void defaultMessageHandler(MQTT::MessageData &md);

    bool connect();
};


/////MqttUtils.cpp

#include "MqttUtils.h"

void MqttUtilsClass::defaultMessageHandler(MQTT::MessageData &md) {
    MQTT::Message &message = md.message;
    DDebug.printInfo("defaultMessageHandler");
    DDebug.printInfo((char *)message.payload);
}

bool MqttUtilsClass::initialSubscribeTopics() {
    return mqttClient->subscribe("TOPIC", MQTT::QOS0, &MqttUtilsClass::defaultMessageHandler) == MQTT::SUCCESS;
}

bool MqttUtilsClass::connect() {
    int rc = ipstack.connect((char *) hostname, port);

    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.username.cstring = (char *) userName;
    data.password.cstring = (char *) password;
    data.MQTTVersion = 4;

    rc = mqttClient->connect(data);

    // subscribe to common topics
    initialSubscribeTopics();

    return true;
}


/////main.cpp

MqttUtilsClass mqttUtilsClass;

void setup() {
    Serial.begin(9600);
    ConnectionHandler.connectWifi();
    mqttUtilsClass.connect();
}

void loop() {

}

Код правильно скомпилирован. ПодписатьсяКажется, завершено успешно. Но когда я публикую данные в подписанной теме, метод обратного вызова defaultMessageHandler не выполняется.

Где я ошибаюсь? Я что-то упустил?

...