C 无法订阅mqtt中的多个主题

C 无法订阅mqtt中的多个主题,c,mqtt,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发

我运行一个简单的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;
}
#包括
#包括
#包括
#包括
#“定义地址”tcp://xx.xx.xx.xx:abcd"
#定义CLIENTID“ExampleClientPub”
#定义主题“mq_测试”//“mq_测试”
#定义有效负载“你好,世界!”
#定义QOS 1
#定义超时10000L
int main(int argc,char*argv[])
{
MQTTClient;
MQTTClient\u connectOptions conn\u opts=MQTTClient\u connectOptions\u初始值设定项;
int rc=0;
MQTTClient_创建(&C)客户端,地址,客户端ID,
MQTTCLIENT_PERSISTENCE_NONE,NULL);
conn_opts.keepAliveInterval=5;
conn_opts.cleansession=1;
if((rc=MQTTClient_connect(client,&conn_opts))!=MQTTClient_SUCCESS)
{
printf(“连接失败,返回代码%d\n”,rc);
退出(退出失败);
}
MQTTClient_message pubmsg=MQTTClient_message_初始值设定项;
MQTTClient_deliveryToken令牌;
而(1){
rc=0;
publimsg.payload=有效载荷;
publimsg.payloadlen=strlen(有效载荷);
publimsg.qos=qos;
publimsg.reserved=0;
MQTTClient_publishMessage(客户端、主题、发布消息和令牌);
printf(“等待最多%d秒以发布%s\n”
“在客户端ID为%s的客户端的主题%s上\n”,
(int)(超时/1000)、有效负载、主题、客户端ID);
rc=MQTTClient_waitForCompletion(客户端、令牌、超时);
printf(“传递令牌为%d[%d]的邮件已传递\n”,令牌,rc);
}
MQTTClient_断开连接(客户端,10000);
MQTTClient_销毁(&client);
返回rc;
}

您正在为多个mqtt发布服务器使用相同的代码,只需更改两个发布服务器中的主题和客户端id即可。请通过为发布服务器提供不同的客户端id来尝试该方案

#define CLIENTID    "ExampleClientPub"
连接到MQTT代理的每个应用程序/程序都需要自己唯一的clientId。

i、 e.“MyClnt001”、“MyClnt002”、“MyClnt003”等。

您可以通过以下多个
-t
选项从
mosquitto\u sub
客户端订阅多个主题:

mosquitto_sub -t topic1 -t topic2 -t topic3

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

是否可以添加订阅代码段?