mqtt:Message Queuing Telemetry Transport,消息队列遥测传输
名字很霸气,适合物联网传感器窄带宽网络不稳定的环境,可以持久化,推送离线保活消息,且可以使用mqttjs在web端使用。
mqtt的服务搭建也很简单,我用的rabbitmq,一行命令启用,重启rabbitmq即可搭建成功。
使用也很简单,需要注意几个关键点
1,qos(0最多收到一次 1至少收到1次 2保证只收到一次)
2,Retained 可以让新订阅的客户端得到发布方的最新的状态值,而不必要等待发送,此操作属于持久化操作,重启服务依然可以收到。
3,CleanSession保证离线后再连接是否收到消息,默认离线消息是存内存,重启会丢失,除非设置持久化,注意接收离线消息clientid必须固定
4,ConnectionTimeout超时时间
5,KeepAliveInterval会话心跳时间
坑1,springboot集成
因为springboot集成众多消息发布订阅的服务,因此只有基本功能,且集成的paho版本过低,mqtt个别高级功能无法使用,spring中有些方法又是针对别的消息服务才有的而mqtt没有,因此集成mqtt不建议使用springboot的集成版本,建议使用mqttclient的包或者paho的包自己实现(个人拙见)
坑2,Qos=2报错,已断开连接 (32109) - java.io.EOFException
确切的说,这是rabbitmq的坑,官网mqtt介绍首页即描述了,一直没注意,另外,据说mqtt3.1也有此问题,升级到3.1.1解决
Supported MQTT 3.1.1 features
- QoS0 and QoS1 publish & consume
- QoS2 publish (downgraded to QoS1)
坑3,mqttjs在rabbitmq上集成
需要自己下载源码编译安装mqtt-web-plugin插件,试了好几次都没编译过去,看老外的帖子在这几乎都没遇到啥问题,日了狗了。。。
参考:https://stackoverflow.com/questions/19813101/java-io-eofexception-with-paho#