记录一次mqtt服务接受消息时报错后自动重连后接受不到订阅主题的消息问题的解决方案

mqtt客户端使用的是

org.eclipse.paho.client.mqttv3
private static MqttConnectOptions options;
options = new MqttConnectOptions();
options.setCleanSession(true);

options.setCleanSession(true);

作用:

设置客户端和服务器是否应在重新启动和重新连接时记住状态。

如果设置为false,则客户端和服务器将在重新启动客户端、服务器和连接时保持状态。当状态保持时:

即使重新启动客户端、服务器或连接,消息传递也将可靠地满足指定的QOS。

服务器会将订阅视为持久订阅。

如果设置为true,则客户端和服务器将不会在重新启动客户端、服务器或连接时保持状态。这意味着

如果重新启动客户端、服务器或连接,则无法维持向指定QOS的消息传递

服务器将订阅视为非持久订阅

网络断开后,客户端会进行重连,但是重连之前订阅的主题就失效了,不再接受之前订阅主题的消息。所以将options.setCleanSession(false);问题解决。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在 C 语言中,你可以使用 MQTT 客户端库来接收来自服务器的消息并返回相应的主题消息。以下是一个使用 Eclipse Paho MQTT C 客户端库的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #define ADDRESS "tcp://mqtt.eclipse.org:1883" #define CLIENTID "ExampleClientSub" #define TOPIC "testtopic" #define QOS 1 #define TIMEOUT 10000L volatile MQTTClient_deliveryToken deliveredtoken; int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { printf("接收到消息!\n"); printf("主题: %s\n", topicName); printf("消息: "); fwrite(message->payload, 1, message->payloadlen, stdout); printf("\n"); MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } void connlost(void *context, char *cause) { printf("\n连接丢失!\n"); printf("原因: %s\n", cause); } int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; int rc; MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered); if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("连接到 MQTT 服务器失败, 返回代码: %d\n", rc); exit(EXIT_FAILURE); } printf("连接到 MQTT 服务器成功!\n"); printf("订阅主题: %s\n", TOPIC); MQTTClient_subscribe(client, TOPIC, QOS); while (1) ; MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; } ``` 在这个示例代码中,我们使用 Eclipse Paho MQTT C 客户端库连接到 MQTT 服务器并订阅指定的主题。当收到来自服务器的消息,会调用 `msgarrvd` 函数来处理消息并返回主题消息内容。 请注意,你需要提前安装 Eclipse Paho MQTT C 客户端库,并在编译链接相应的库文件。具体的安装和编译步骤可以参考该库的文档或官方网站。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值