我想使用MQTT将像raspberry pi这样的设备连接到thingboard。 到目前为止我做了什么:我在计算机上设置了一个虚拟机。此计算机通过以太网电缆连接到设备。我设置了newtwork,所有ping工作: ping设备 - > VM =两种方式都有效 ping设备 - > computer =双向工作
所以网络部分已经覆盖,我开始安装thingboard服务器。在虚拟机(具有ubuntu btw)上,我将lib嵌入式paho交叉编译到我的设备并将主机设置为VM的ip(port = 1883),并将用户名设置为thingboard给出的令牌。 当我尝试连接时,我总是得到错误(rc = -1),我不知道为什么。我尝试禁用所有防火墙(从Windows和ubuntu),但我仍然无法连接,所以我认为可能是网络设置不正确。所以我决定直接在VM上编译程序并使用IP localhost或127.0.0.1从那里运行它,我得到了相同的结果....我仍然不知道为什么。
在TB的conf文件中,mqtt的绑定ip是0.0.0.0和端口1883。 我用来测试连接的程序代码与示例相同,但更改了ip。这是:
#define MQTTCLIENT_QOS2 1
#include <memory.h>
#include "MQTTClient.h"
#define DEFAULT_STACK_SIZE -1
#include "linux.cpp"
int arrivedcount = 0;
void messageArrived(MQTT::MessageData& md)
{
MQTT::Message &message = md.message;
printf("Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n",
++arrivedcount, message.qos, message.retained, message.dup, message.id);
printf("Payload %.*s\n", (int)message.payloadlen, (char*)message.payload);
}
int main(int argc, char* argv[])
{
IPStack ipstack = IPStack();
float version = 0.3;
const char* topic = "v1/devices/me/telemetry"
printf("Version is %f\n", version);
MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
const char* hostname = "localhost"; // also tried with 127.0.0.1
int port = 1883;
printf("Connecting to %s:%d\n", hostname, port);
int rc = ipstack.connect(hostname, port);
if (rc != 0)
printf("rc from TCP connect is %d\n", rc); //this conections is done succesfully i think.
printf("MQTT connecting\n");
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.MQTTVersion = 3;
data.username.cstring = (char*) "TOKEN";
rc = client.connect(data);
if (rc != 0)
printf("rc from MQTT connect is %d\n", rc); //doesnt go further than here, i get rc = -1
printf("MQTT connected\n");
rc = client.subscribe(topic, MQTT::QOS2, messageArrived);
if (rc != 0)
printf("rc from MQTT subscribe is %d\n", rc);
.
.
.
.
.
return 0;
}
任何线索为什么这不起作用?我已经在这个问题上苦苦挣扎了好几天,我很疯狂。
由于
编辑:我不认为问题在于代码,因为thingboard返回0,4或5作为连接状态。它需要是别的东西。
解决方案:如果你来到这里和我有同样的问题,我在paho上使用了名为“Hello”的样本,我改为“qos0pub”样本并且它有效。