MQTT断线重连订阅无法接收

工具

MQTT客户端是用的 paho http://www.eclipse.org/paho/

问题

采用以下配置

        connOpts = new MqttConnectOptions(); 
        connOpts.setCleanSession(true);
        connOpts.setConnectionTimeout(10);
        connOpts.setKeepAliveInterval(90);
        connOpts.setAutomaticReconnect(true);

当网络断开后,客户端会进行重连,但是重连之前订阅的主题就失效了,不再接受之前订阅主题的消息。

解决方法

因为配置里将cleanSession 设为 true ,当客户端掉线时 ,服务器端会清除 客户端 session 。 重连后 客户端会有一个新的session。

第一种

把配置里的 cleanSession 设为false,客户端掉线后 服务器端不会清除session,当重连后可以接收之前订阅主题的消息。当客户端上线后会接受到它离线的这段时间的消息

第二种

通过查看 connect 方法的代码发现

这里写图片描述

如果我们设置的 callback实现了 MqttCallbackExtended接口,就会把它设置给connectActionListener,我再来看看MqttCallbackExtended接口。
这里写图片描述

可以看到这个接口拓展了一个方法,该方法会在连接到服务器成功时调用,正符合我们的要求。我只需要实现这个接口并在这个方法里从新订阅之前的主题就行了。

这种方法重连之后不会收到离线期间该主题的消息

转载于:https://www.cnblogs.com/A-yes/p/9894144.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C#中实现MQTT断线重连的示例代码: ```csharp using System; using System.Threading; using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Options; using MQTTnet.Client.Receiving; class Program { private static IMqttClient mqttClient; static async Task Main(string[] args) { var factory = new MqttFactory(); mqttClient = factory.CreateMqttClient(); var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) // 设置MQTT服务器地址和端口 .WithClientId("client1") // 设置客户端ID .Build(); mqttClient.UseDisconnectedHandler(async e => { Console.WriteLine("Disconnected from MQTT server. Trying to reconnect..."); // 断线重连逻辑 while (!mqttClient.IsConnected) { try { await mqttClient.ConnectAsync(options); // 尝试重新连接 Console.WriteLine("Reconnected to MQTT server."); } catch (Exception ex) { Console.WriteLine($"Failed to reconnect: {ex.Message}"); Thread.Sleep(5000); // 等待5秒后再次尝试连接 } } }); await mqttClient.ConnectAsync(options); // 连接到MQTT服务器 // 订阅主题 await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("topic1").Build()); // 接收消息 mqttClient.UseApplicationMessageReceivedHandler(e => { Console.WriteLine($"Received message: {e.ApplicationMessage.Payload}"); }); Console.ReadLine(); } } ``` 该示例代码中,我们使用了MQTTnet库来实现MQTT客户端的功能。在断线重连逻辑中,我们使用了一个循环来尝试重新连接,如果连接成功,则跳出循环。如果连接失败,则等待5秒后再次尝试连接。在断线重连过程中,我们可以根据需要进行异常处理或其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值