介绍
由于项目中需求,多个客户机终端不断发送位置给服务机,服务机根据消息,准确判断信息,并返回响应,回复该客户机。
在这里我们的服务机,不但要订阅所有客户机的主题,还要根据客户机消息做出相应的响应,服务机同时充当客户机使用,客户机也推送主题消息,充当服务器。
关键问题:
- 服务器怎么区分各个客户机
- 主题配置方面的问题,不可能每个机器配个主题
- 通信方面,选择哪种消息级别
环境配置
使用maven项目,刚好在仓库导包了,可以使用(推荐)
1 | <dependency> |
仓库没有包,直接去网上下,可以直接导包到Lib中
编写
服务器
1 | package com.devframe.mqtt.test; |
客户机
1 | package com.devframe.mqtt.test; |
测试的时候就是把客户机复制了几个,主题和clientid改下,clientid不能一样,不然不能登陆。
回调类
发送完消息,Service需要在这里处理,着我们先做的事情啦。
1 | package com.devframe.mqtt.test; |
总结
- 使用前缀通配符的方式加上特殊码区分各个机器的主题。
- 根据不同业务的需求,需要合理的选择不同级别的消息。
实际使用中一般把发消息的参数
retained
设为false
,这个参数的说明是:
设为true之后把消息保存到本地,每一次去订阅该主题的subscriber都会收到,每次订阅的时候都会收到,导致很多重复多余的消息。如果在使用的过程中不小心将它设置成true,怎么去清除这个存着的消息了,mqtt本身没这个功能;
解决办法:向该topic重新publish数据,RETAIN=TRUE,Payload为空
。
所以,刚开始做这个都得时候就是设置成true,包括上面的测试代码,还没改过来,业务代码已经全部改好了。不然没次去连接mqtt的时候,都会订阅到一大片消息,电脑跑到卡得不行,哈哈。