Paho MQTT (C++) 客户端无法连接到 Mosquitto
Paho MQTT (C++) client fails to connect to Mosquitto
我有使用 Paho MQTTPacket 嵌入式 C++ 库连接到 MQTT 代理的 C++ 代码。当那个经纪人是 io.adafruit.com 时,它工作得很好。但是当我的 Raspberry Pi 上是我自己的 Mosquitto 实例 运行 时,连接失败。在 MQTT::Client::connect 方法中,我已将其缩小到 MQTTClient.h 中的这一行:
// 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 日志中打开调试消息,但它们没有显示任何有用的信息。我不知所措。为什么我无法从我的 C++ Paho 代码连接到 Mosquitto?
编辑:这是客户端代码...同样,这在 Adafruit 上运行良好,但是当我将它指向本地主机上的 Mosquitto 时,它会按照描述挂起。 (我删除了用户名和密码——我正在发送它们,但我真的不认为这些是问题所在,因为在命令行上使用 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;
}
如评论中所述。
看起来您正在设置标志以指示您要为客户端设置遗嘱和遗嘱 (data.willFlag = 1;
),但随后没有为 LWT 传递任何主题或负载。
如果您不需要 LWT,则将标志设置为 0(或删除线路设置标志),因为它应该默认为禁用。
另外值得一提的是,这都是 Paho Embedded C++ MQTTPacket client not the full blown Paho C++ client。
我有使用 Paho MQTTPacket 嵌入式 C++ 库连接到 MQTT 代理的 C++ 代码。当那个经纪人是 io.adafruit.com 时,它工作得很好。但是当我的 Raspberry Pi 上是我自己的 Mosquitto 实例 运行 时,连接失败。在 MQTT::Client::connect 方法中,我已将其缩小到 MQTTClient.h 中的这一行:
// 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 日志中打开调试消息,但它们没有显示任何有用的信息。我不知所措。为什么我无法从我的 C++ Paho 代码连接到 Mosquitto?
编辑:这是客户端代码...同样,这在 Adafruit 上运行良好,但是当我将它指向本地主机上的 Mosquitto 时,它会按照描述挂起。 (我删除了用户名和密码——我正在发送它们,但我真的不认为这些是问题所在,因为在命令行上使用 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;
}
如评论中所述。
看起来您正在设置标志以指示您要为客户端设置遗嘱和遗嘱 (data.willFlag = 1;
),但随后没有为 LWT 传递任何主题或负载。
如果您不需要 LWT,则将标志设置为 0(或删除线路设置标志),因为它应该默认为禁用。
另外值得一提的是,这都是 Paho Embedded C++ MQTTPacket client not the full blown Paho C++ client。