
uniapp,微信小程序中使用MQTT
最近在uniapp打包成微信小程序的项目中第一次用到MQTT使用比拟简单,但是还是遇到一些问题。此记录一下。
官方文档:MQTTGithub
官方MQTT测试工具:MQTTX测试工具使用说明
MQTTjs文件:mqtt.min.js
先上一点注意事项:
1 MQTT.j一个 MQTT协议的客户端库,用 JavaScript编写,可用于 Node.j和浏览器。Node.j端可以通过全局装置使用命令行连接,同时还支持 MQTTMQTTTLS证书连接;值得一提的MQTT.j还对微信小顺序有较好的支持。
2 MQTT可以通过三种方式连接,TCP直连,TLS和WebSocket但是JavaScript使用 TCP只能通过 ws即 Websocket链接。所以如果服务器是TCP直连,客户端是肯定连不上的会报
3 WebSocket一种在单个 TCP连接上进行全双工通讯的协议。作为一种通信协议,其使用 ws非加密)wssSSL加密)作为协议标识。MQTT.j客户端支持多种协议,连接地址需指明协议类型;
4 ws:未加密的WebSocket连接,一般使用8083端口。wss:加密的WebSocket连接,一般使用8084端口。mqtt:未加密的TCP连接,一般使用1883端口。mqtts:加密 TCP连接。
贴一下代码:
import$mqttfrom./mqtt.min.js;
constmqttOption={keepalive:30 ,clean: false ,connectTimeout:5000, // TimeoutclientId:uni.getStorageSyncclientId , // username: est, // password: est, }constconnectUrl=`${mqttHost}:${mqttPort}/mqtt`; // #ifdefH5 varclient=$mqtt.connectwss://+ connectUrl,mqttOption; // #endif // #ifdefMP-WEIXIN||A PP-PLUS varclient=$mqtt.connectwxs://+ connectUrl,mqttOption; // #endif client.onconnect,=> { console.logconnect //这是为了给自己发条消息,其它无作用client.subscrib est,err=> { if! err{client.publish est,{} }}}; //自动重连client.on econnect,msg=> {console.log econnect ,msg}; //过失client.onerror,=> {console.logerror }; //断开client.onend,=> {console.logend }; //掉线client.onoffline,msg=> { console.logoffline ,msg}; //收到消息 client.onmessage,topic,messag=> { // 把arrayBuff转成字符串letencodedStr=String.fromCharCode.applinull,newUint8A rraimessag; // 全局发送消息uni.$emitsendTopicMsg,encodedStr;
console.logencodedStr} // 全局监听是否有关闭mqtt消息的事件uni.$oncloseMqtt,=> {client.end true ; //主动断开连接}
说明:
1配置项里的keepA liv指的心跳时间。以秒为单位。定义服务端从客户端接收到消息的最大间隔时间。可以设置为0表示客户端一直不时开,除非主动断开。
2clean设置为fals为了让客户端掉线的时候,服务器必需在客户端断开之后继续存储/坚持客户端的订阅状态。即当为true时候,如果掉线了服务端会清理链接状态的数据和内容。当为fals时候,服务端会保管消息发送期间,链接断开导致发送失败的消息。这样连上的时候就会自动推送到订阅的客户端。
3如果连接需要验证用户名和密码,则需要加上usernam和password字段。
4微信小程序使用的协议,如果不是加密的则是wss如果是加密的就是wxsweb端,一般不加密就是wx加密就是wss
5前端收到消息是arrayBuff格式的需要转成字符串格式,如果带有中文,可能转成字符串会乱码。可以使用
6clientId使用
怎么初始化?
哪个地方第一次提供了mqtturl地址和端口,哪个地方就开始初始化,就把上面那段代码贴上去就行。也可自行封装为方法,使用的时候调用即可。最好在App.vueonLaunch中加上上面的初始化代码。越早初始化越好
应该是免费的测试MQTT消息的链接: o∩_∩)o
1CA signserver这个直接在MQTTX测试工具里面 选择 SSL/TLS勾选为true时即可选择。
2测试的时候,先填好内容,然后链接上的时候,再添加一个订阅,Topic就填一会你需要发送消息的Topic这样当你模拟服务器发送消息的时候,MQTTX里面也会收到刚才发送的内容,这样就是连通了
开发过程中遇到问题:
1 如果呈现
总结:
1以上对mqtt解也只是一知半解,还没弄明白这里的心跳时间,和 TCP/IP心跳机制是不是一样的超越心跳时间,能不能让客户端不掉线,或者有没有更好的解决离线的方法。
2而且还有很多特性都没用到比方will遗愿标志,专门用来处置客户端断开连接的配置项。
3由于这个项目都是用的Qos0消息,都不知道与Qos1Qos2区别是什么。
先暂时记录到这里,后面弄懂了再补充。


