我想使用 MQTT 将像树莓派这样的单个设备连接到 thingsboard。到目前为止我所做的:我在计算机上设置了一个虚拟机。这台计算机通过以太网电缆连接到设备。我设置了 newtwork,所有工作的 ping:ping 设备-> VM = 双向工作 ping 设备-> 计算机 = 双向工作
这样网络部分就覆盖了,我开始安装thingboard server。在虚拟机(顺便说一句,它有 ubuntu)上,我将 lib 嵌入式 paho 交叉编译到我的设备上,并将主机设置为 VM 的 ip(端口 = 1883),并将thingsboard 给出的令牌作为用户名。当我尝试连接时,我总是得到错误(rc=-1),我不知道为什么。我尝试禁用所有防火墙(来自 windows 和 ubuntu)但我仍然无法连接,所以我认为可能是网络设置不正确。所以我决定直接在虚拟机上编译程序并使用 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;
}
任何线索为什么这不起作用?我已经在这个问题上苦苦挣扎了好几天,而且我疯了。
谢谢
编辑:我不认为问题出在代码上,因为 thingsboard 返回 0、4 或 5 作为连接状态。它需要是别的东西。
解决方案:如果你来这里遇到和我一样的问题,我在 paho 上使用了名为“Hello”的示例,我改为“qos0pub”示例并且它有效。