我使用Paho MQTTPacket嵌入式C ++库连接到MQTT代理获得了C ++代码。当那个经纪人是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日志中启用调试消息,但他们没有显示任何有用的信息。我不知所措。为什么我可能无法从我的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;
}
答案 0 :(得分:1)
正如评论中所述。
看起来您正在设置标志,表示您要为客户端设置最后遗嘱和遗嘱(data.willFlag = 1;
),但之后不会为LWT传递任何主题或有效负载。
如果你不需要LWT,那么将标志设置为0(或删除行设置标志),因为它应该默认为禁用。
同样值得指出清晰度,Paho Embedded C++ MQTTPacket client并非全面展开Paho C++ client。