我想使用MQTT将像raspberry pi这样的设备连接到thingboard . 到目前为止我做了什么:我在计算机上设置了一个虚拟机 . 此计算机通过以太网电缆连接到设备 . 我设置newtwork,所有ping工作:ping设备 - > VM =两种方式ping设备 - >计算机=双向工作

所以网络部分已经覆盖,我开始安装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”样本并且它有效 .