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