公司是做Zwave智能家居的,以前和服务器连接是TCP长连接,最近想将服务器切换为MQTT服务器,做到主机与主机之间实现数据互通,这样就能以组网的方式,灵活的搭建使用场景,做到从家装到工装的转变,甚至跨平台的控制。从理论上是可行的,实际上又要开始填坑了。
先说下大概的使用场景,如一个家庭A(别墅型),面积大,有五台用来控制设备的主机(ABCDE),每台主机有属于其自己的设备,目前的是可以直接控制的,现在的需求是需要主机之间能相互控制对方的设备。思路其实很简单,就是主机之间要相互通信,各自知道各自有什么设备,控制的时候将想要控制的设备发送给对方,对方再执行。参与MQTT来说,就是每台主机即是订阅者,又是发布者。
MQTT的使用非常简单,网上有很多相关的例子,如(https://blog.csdn.net/qq_27600345/article/details/80741284)(PS:但基本都是入门级的使用,很多东西还是需要自己慢慢探索的,也许是我没找到相关块的资料)。这里就不再贴代码了,简单的说下遇到的问题,虽然现在回过头去很简单,但还是浪费了我一天的时间,里面有无数次抓狂。
首先是多个订阅的方法,这个比较容易,有心的话基本不用找资料都能发现:
SDK中已经提供了订阅多个主题的方法Client.subscribe(String[] topicFilters, int[] qos),只要把主题拼成数组就行了。
其次,就是发布多个主题,这也是困了我整整一天的问题,里论上获取多个topic,然后循环发送就可以了,然后测试的时候发现当第一个发布成功之后MQTT服务器直接断掉了,然后各种找资料,各种找原因,后面一步一步调试发现不是方法的问题。
其实这样循环布是可行的,服务器一直断线的原因是我接收到数据之后写了个回调,然后在回调里面直接处理数据了,数据量有点大,一两秒还是要的,然后阻塞了接收消息的线程,造成后续数据进不来,把服务器卡掉线了。把回调扔到线程池里就可以了。
从结果来看,messageArrived应该是单线程操作,所以不能进行耗时操作,回过头去看,确实非常简单,但就这么句代码,整整困惑了我一天,但这也怪自己不能静下心来调试,平时也没注意这个。希望对遇到同样问题的同学有个参考。