Paho项目旨在为机器对机器(M2M)和物联网(IoT)提供可靠的开放和标准消息传递协议的开源实现。Paho解决设备连接的物理和成本限制,其目标包括设备和应用程序之间的有效解耦,旨在保持市场开放,并鼓励可扩展的Web和企业中间件和应用程序的快速增长。
背景
在对artemis项目测试过程中,逐步对mqtt协议有所了解,于是使用paho对其进行封装,开发了一个mqtt协议的功能测试框架。
问题
在MQTTClient客户端创建过程中,clientId设置为“MQTTPublishSubscribeTest001”时,服务器没有返回任何信息,客户端一直在建立连接状态,但是连不上。如下图:
建连失败截图
解决方案
后端开发定位跟踪后反馈是clientId太长的问题,于是缩短测试用例中的clientId,发现可行,但是不应该不支持clientId长度在24以上的MQTTClient客户端。查询相关资料,得出解决方案如下:
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts添加设置
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setMqttVersion(4);
connOpts.setCleanSession(true);
总结
问题解决,但是paho官网上的示例与官方提供的mqtt服务器却能在clientId长度超出的情况下正常连接并通信。不知道是否是服务端处理了,后续需对mqtt相关以及物联网相关继续深入学习。
but
查看paho源码org.eclipse.paho.client.mqttv3.internal下的ConnectActionListener类,发现默认情况下是会先尝试MqttVersion为3.1.1的,失败后会使用MqttVersion为3.1的,如下图。
设置MqttVersion
所以设置MqttVersion为3.1.1是为了防止失败时用3.1重试。这也是为何官网示例没问题的原因吧。
网友评论