mqtt

首先创建一个设备,然后自定义topic,为什么要自定义topic。因为,这样的好处就是不要按json格式书写。

然后我找到了阿里云联网平台

java后端mqtt服务器搭建 java 高并发mqtt服务器_下位机


在服务端订阅中,我发现有MNS服务端订阅,和AMQP服务端订阅,看了一下我选择了比较简单的MNS服务端订阅;

java后端mqtt服务器搭建 java 高并发mqtt服务器_java后端mqtt服务器搭建_02


照着教程做啊做啊,我发现一个问题,下位机的数据是可以发上来的,但是数据乱码了,由于,刚刚开始我下位机发送上来的数据是json数据,所以乱码的数据特别长,所以,刚刚开始的时候一直找不到原因,后来通过找代码发现了一些问题;

java后端mqtt服务器搭建 java 高并发mqtt服务器_java后端mqtt服务器搭建_03


java后端mqtt服务器搭建 java 高并发mqtt服务器_字符串_04


如上文所示,他是将messageBodyAsBytes这个数组按照Base64进行解码,解码完后再用UTF-8进行生成字符串(这里传入的参数是utf-8)

但是,由于我也不知道是下位机上传上来的数据是什么格式,就感觉无从下手。

这时候,我用mqttfx代替下位机,来进行数据的发送,我发现数据可以接收

java后端mqtt服务器搭建 java 高并发mqtt服务器_字符串_05


这时候,说明下位机和阿里云设备通讯是没问题的

这时候,我再启动java程序,再次发送20

java后端mqtt服务器搭建 java 高并发mqtt服务器_下位机_06


结果如下:很显然,这边没有我需要的20这个数据

然后我去MNS这里面进行发送数据:

java后端mqtt服务器搭建 java 高并发mqtt服务器_下位机_07


发送了一个20,结果如下

java后端mqtt服务器搭建 java 高并发mqtt服务器_字符串_08


第一个message:代表的是默认会进行base64编码的,在按utf-8进行生成字符串,第二个代表的是,没有进行base64编码的,就直接按照utf-8生成字符串,所以,这个MjA= 刚刚好又等于刚刚收到的playLoad里面的值,所以很明显,要是处理这个问题的话,只需要将MjA= 先分割会byte[]数组,然后再按照base64进行编码,在生成字符串即可

代码如下:

java后端mqtt服务器搭建 java 高并发mqtt服务器_数据_09


结果如下:

java后端mqtt服务器搭建 java 高并发mqtt服务器_java后端mqtt服务器搭建_10