无法在mqtt

时间:2017-08-28 10:01:57

标签: c mqtt

我运行了一个简单的mqtt发布商c代码订阅" Hello World"。

mqtt subscriber1:

mosquitto_sub -h xx.xx.xx.xx -t "mq_test" 

我连续在另一个位置运行相同的mqtt发布商代码,并使用不同的主题订阅同一主机。

mqtt subscriber2:

mosquitto_sub -h xx.xx.xx.xx -t "mq_t"

当我启动第二个发布程序时,第一个mqtt订阅停止。 为什么会出现此问题,我认为可以订阅多个主题。

mqtt发布商c代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>
#define ADDRESS     "tcp://xx.xx.xx.xx:abcd"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "mq_test" //"mq_t"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L
int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc = 0;
    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 5;
    conn_opts.cleansession = 1;
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;
    while(1){
        rc = 0;
         pubmsg.payload = PAYLOAD;
        pubmsg.payloadlen = strlen(PAYLOAD);
        pubmsg.qos = QOS;
        pubmsg.retained = 0;
        MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
        printf("Waiting for up to %d seconds for publication of %s\n"
            "on topic %s for client with ClientID: %s\n",
            (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
         rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
         printf("Message with delivery token %d[%d] delivered\n", token,rc);
    }
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

3 个答案:

答案 0 :(得分:1)

您仅为多个mqtt发布者使用相同的代码,只需更改主题,并且两个发布商中的客户端ID保持不变。请通过为发布商提供不同的客户ID来尝试该方案。

答案 1 :(得分:0)

#define CLIENTID    "ExampleClientPub"

连接到MQTT Broker的每个应用程序/程序都需要自己唯一的clientId 即&#34; MyClnt001&#34;,&#34; MyClnt002&#34;,&#34; MyClnt003&#34;等

答案 2 :(得分:0)

您可以使用以下多个mosquitto_sub选项从-t客户端订阅多个主题:

mosquitto_sub -t topic1 -t topic2 -t topic3

以编程方式,如果客户端库支持订阅现有连接,则可以通过一次连接(使用一个clienId)并通过不同主题的循环订阅多次来实现此目的。