У меня есть код C ++, использующий библиотеку Paho MQTTPacket Embedded C ++ для подключения к брокеру MQTT. Когда этот брокер io.adafruit.com, он работает отлично. Но когда на моем Raspberry Pi работает мой собственный экземпляр Mosquitto, соединение не устанавливается. Я сузил это до этой строки в MQTTClient.h, в методе MQTT :: Client :: connect:
// this will be a blocking call, wait for the connack
if (waitfor(CONNACK, connect_timer) == CONNACK)
Приложение зависает здесь примерно на 30 секунд, а затем получает результат, отличный от CONNACK (в частности, 0, а не 2).
Я пробовал обе версии протокола 3 (т.е. 3.1) и 4 (то есть 3.1.1); тот же результат.
Мой экземпляр Mosquitto не имеет аутентификации или паролей. Я попытался включить сообщения отладки в журнале Mosquitto, но они не показывают ничего полезного. Я в недоумении. Почему я не могу подключиться к Mosquitto из своего кода C ++ Paho?
РЕДАКТИРОВАТЬ: Вот код клиента … опять же, это прекрасно работает с Adafruit, но когда я указываю его на мой Mosquitto на localhost, он зависает, как описано. (Я удалил имя пользователя и пароль — я отправляю их, но я действительно не думаю, что это проблема, так как с mosquitto_pub или mosquitto_sub в командной строке я могу подключиться независимо от этого, так как mosquitto настроен на разрешить анонимные подключения.)
const char* host = "127.0.0.1";
int port = 1883;
const char* clientId = "ZoomBridge";
const char* username = "...";
const char* password = "...";
MQTT::QoS subsqos = MQTT::QOS2;
ipstack = new IPStack();
client = new MQTT::Client<IPStack, Countdown, 30000>(*ipstack);
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.willFlag = 1;
data.MQTTVersion = 3;
data.clientID.cstring = (char*)clientId;
data.username.cstring = (char*)username;
data.password.cstring = (char*)password;
data.keepAliveInterval = 20;
data.cleansession = 1;
int rc = ipstack->connect(host, port);
if (rc != MQTT::SUCCESS) {
cout << "Failed [1] (result " << rc << ")" << endl;
return rc;
}
rc = client->connect(data);
if (rc != MQTT::SUCCESS) {
cout << "Failed [2] (result " << rc << ")" << endl;
ipstack->disconnect();
return rc;
}
Как уточняется в комментариях.
Похоже, вы устанавливаете флаг, чтобы указать, что вы хотите установить Last Will и Завет для клиента (data.willFlag = 1;
) но тогда не передавая никакой темы или полезной нагрузки для LWT.
Если вам не нужен LWT, установите флаг на 0 (или удалите флаг настроек линии), так как по умолчанию он отключен.
Также стоит указать на ясность, это все с Paho Embedded C ++ MQTTPacket клиент не в полном объеме Paho C ++ клиент.
Других решений пока нет …