Я разрабатываю новое приложение, которое подключается к серверу 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 не выполняется.
Где я ошибаюсь? Я что-то упустил?