0

我想使用 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”示例并且它有效。

4

0 回答 0