一、需求:最近一个物联网项目,需要通过手机端微信小程序发布控制指令到设备,微信小程序端可以接收设备端的数据,于是用到了EMQX,通过MQTT.JS连接EMQX平台。
二、实现过程:
1、购买阿里云服务器;
2、购买域名,并进行域名备案;
3、阿里云服务器上Windows平台搭建EMQX服务器,参考链接Windows服务器上Mqtt服务器EMQX的安装使用_51CTO博客_windows mqtt服务器;
4、微信小程序中引入MQTT.JS,MQTT版本库mqtt - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers;
5、阿里云服务器上Windows平台搭建Nginx服务器;
6、Nginx配置SSL证书、反向代理、配置为自启动服务(Windows 下将 Nginx 设置成服务 - Code-Rain - 博客园),SSL证书配置参考EMQX MQTT 服务配置 WSS 证书 - Nginx - 大象笔记,Nginx配置ssl证书(https)_喜枝儿的博客-CSDN博客_nginx 配置ssl
三、过程中遇到的问题:
1、问题1:由于跟设备之间进行通信,统一通信格式为十六进制字节数组格式,MQTT.JS需要支持发布字节数组格式,原有代码里面只支持发布字符串格式;
2、问题2:在通过MQTT.JS连接EMQX服务器的时候,存在微信开发工具模拟器能够正常连接使用,并且能够发布与接收消息,但是安卓真机无法进行连接的情况(存在两种情况会造成此问题);
四、问题解决思路
1、问题1解决思路
开始出现这个问题,网络上更多的是更换MQTT.JS版本,尝试了多个版本的更换后,发现报的错误也不一样,最后确定一个版本,进行单步调试,发现有两处代码需要调整,具体代码调整如下,修改后可以支持发送十六进制字节数组。
2、问题2解决思路
出现模拟器可以正常连接、发布与接收消息,实际存在两种情况。
(1)MQTT.JS的版本问题,通过更新最新的版本或者其中一些稳定的版本可以解决,模拟器调试的时候存在sec-websocket-protocol:mqtt,而真机上不存在的时候,这个可以通过更新MQTT.JS进行解决。
(2)安卓真机必须使用TLS/433端口,在用模拟器和IOS的时候是正常的,但是用安卓的时候必须使用TLS/433端口,不能在连接地址处带端口。
由于安卓真机在连接EMQ的时候,连接地址不能带端口,因此我们需要利用Nginx将wss://域名/mqtt映射到我们实际的8083或者8084端口上进行使用。