13 MQTT断线的问题分析

最近一直跟某公司对接MQTT,出现对方MQTT掉线的问题。经过网上搜索资料之后,经过自己的测试之后,发现MQTT掉线的原因了,这也是原因之一,相信大家也会遇到,在此记录下来。

下面直接附上掉线原因的答案:

是因为客户端的clientId存在重复造成的!

实际场景A:

用户A网上下了demo,没有去改程序的clientId,直接在3台机子上跑程序了。机子1跑起来了,在MQTT控制台可以看到上线了。
机子2跑起来了,在MQTT控制台可以看到机子1掉线了。
机子3跑起来了,在MQTT控制台可以看到机子都掉线了。

这是由于MQTT服务器判断到了有重复的clientId机子连接了,为了保证唯一性,把之前相同的clientId机子给断掉了连接。

实际场景B:

用户B写了个工具类,用来订阅MQTT的主题的,伪代码是这样写的:

  public static sendMQTT() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setClientId("pc_123456");
        options.setCleanSession(false);
        options.setUserName("admin");
        options.setPassword("password"));
        // 设置超时时间
        options.setConnectionTimeout(10);
        // 设置会话心跳时间
        options.setKeepAliveInterval(20);
        ......
    }

用户B要订阅几个主题,调用了这个方法几次。细心的会发现,里面的ClientID是写死的,所以每一次调用的clientId都一样,所以每一次调用,都会造成前一个连接断线。

解决方案

1.连接MQTT服务成功后,保证一个连接的情况下,订阅多个主题。

2.每订阅一个主题,重新连接MQTT服务,且需要保证clientId不一样(不建议这样做)。

MQTT消息遗留问题主要涉及到两个方面:保留消息和遗嘱消息。 保留消息是指当客户端连接时,Broker会存储每个Topic的最后一条保留消息及其QoS。当订阅该Topic的客户端上线后,Broker会将该消息投递给它。保留消息的作用是让新订阅的客户端得到发布方的最新状态值,而不必等待新消息推送。但保留消息的弊端是,Broker保存的消息会与断线连接时收到的断线消息重复,并且每次重连时都会投递一次。要删除保留消息,只需发送一条Retained为true,payload为空的消息即可解除。\[1\] 遗嘱消息是在客户端断线时发送的消息。它有四个参数:topic(预定发布的主题)、payload(遗嘱消息内容)、qos(遗嘱消息质量)和retained(遗嘱消息是否保留)。当客户端断线时,订阅该主题的其他客户端都会收到一条遗嘱消息。遗嘱消息的应用是在客户端连接时设置向指定主题发送遗嘱消息,以便在客户端断线时通知其他订阅者。\[2\] 遗嘱消息及消息保留的应用中提到,保留消息的好处是当有新的连接订阅该topic时,Broker会先发送保留消息给该连接,从而确保该连接立刻获取到topic上的消息。这样可以优化用户体验。然而,保留消息的坏处是由于保留消息会一直存在,导致新的连接都会获得该消息,如果该消息不是它们想要的,就会存在污染。因此,一些人的做法是让发送方重新发送一个空的保留消息来覆盖原有保留消息。\[3\] 综上所述,MQTT消息遗留问题主要涉及到保留消息和遗嘱消息的使用和管理。保留消息可以让新订阅的客户端得到发布方的最新状态值,但可能会导致重复投递。遗嘱消息可以在客户端断线时通知其他订阅者,但需要注意保留消息的污染问题。 #### 引用[.reference_title] - *1* *2* [SpringBoot 开发之 MQTT 协议遗嘱消息及消息保留的应用](https://blog.csdn.net/myinsert/article/details/108360297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [相机MQTT遗嘱消息发送异常分析](https://blog.csdn.net/weixin_39603492/article/details/119434437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值