最近一直跟某公司对接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不一样(不建议这样做)。