我运行了一个简单的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;
}
答案 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)并通过不同主题的循环订阅多次来实现此目的。