C 无法订阅mqtt中的多个主题
我运行一个简单的mqtt发布者c代码,订阅“Hello World” mqtt subscriber1: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发
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)并使用不同主题在循环中订阅多次来实现这一点。是否可以添加订阅代码段?