当前位置:首页 > 新闻动态 > 网站文章

uniapp,微信小程序中使用MQTT

来源: 浏览:114 时间:2023-08-09

        最近在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直连,客户端是肯定连不上的会报 Errorinconnectestablish过失。所以客户端协议只能是wswsswx微信)

        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`;//#ifdefH5varclient=$mqtt.connectwss://+connectUrl,mqttOption;//#endif//#ifdefMP-WEIXIN||A PP-PLUSvarclient=$mqtt.connectwxs://+connectUrl,mqttOption;//#endifclient.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.endtrue;//主动断开连接}

        说明:

        1配置项里的keepA liv指的心跳时间。以秒为单位。定义服务端从客户端接收到消息的最大间隔时间。可以设置为0表示客户端一直不时开,除非主动断开。

        2clean设置为fals为了让客户端掉线的时候,服务器必需在客户端断开之后继续存储/坚持客户端的订阅状态。即当为true时候,如果掉线了服务端会清理链接状态的数据和内容。当为fals时候,服务端会保管消息发送期间,链接断开导致发送失败的消息。这样连上的时候就会自动推送到订阅的客户端。

        3如果连接需要验证用户名和密码,则需要加上usernam和password字段。

        4微信小程序使用的协议,如果不是加密的则是wss如果是加密的就是wxsweb端,一般不加密就是wx加密就是wss

        5前端收到消息是arrayBuff格式的需要转成字符串格式,如果带有中文,可能转成字符串会乱码。可以使用   letdecodeStr=decodeURIComponescapencodedStr 来防止中文乱码。或者是网上通过移位转成中文的方法来解决。

        6clientId使用  Math.random.toStr36.substr3,自定义长度) 来生成自定义长度的唯一id

         

        怎么初始化?

        哪个地方第一次提供了mqtturl地址和端口,哪个地方就开始初始化,就把上面那段代码贴上去就行。也可自行封装为方法,使用的时候调用即可。最好在App.vueonLaunch中加上上面的初始化代码。越早初始化越好

         

        应该是免费的测试MQTT消息的链接: o∩_∩)o  

协议地址端口路径证书mqttbroker.hivemq.com8000无无mqttbroker.emqx.io1883无无wstest.mosquitto.org8080/mqtt无wsstest.mosquitto.org8081/mqttCA signserver

         

         

         

         

         

         

         

        1CA signserver这个直接在MQTTX测试工具里面 选择 SSL/TLS勾选为true时即可选择。

        2测试的时候,先填好内容,然后链接上的时候,再添加一个订阅,Topic就填一会你需要发送消息的Topic这样当你模拟服务器发送消息的时候,MQTTX里面也会收到刚才发送的内容,这样就是连通了

         

        开发过程中遇到问题:

        1 如果呈现 failed:Connectclosebeforreceivahandshakresponse  这个过失。说明 服务端的mqtt协议和客户端的协议不一样,就比如 python用的基于 tcpmqttjs基于websocketmqtt 都不能达成握手的操作。呈现这个的问题应该是服务端使用了 1883 这个端口,而客户端也是用这个端口,就导致这个问题。正确的应该是客户端(js应该使用 8083 端口(未加密)

        2最初我设置心跳时间是3秒,微信开发者工具,或者H5端的时候,没有问题的但是小顺序真机调试里,当小程序切换到后台,差不多5s就会自动断开,然后一直重连,直到切换回小程序,重连成功。而且有时候还会连续断开和重连。自动断网这个原因,小顺序官网做了说明的超越5s断网说明 第二条 网络请求 -使用限制里面就说明了小程序的机制,限制了切换到后台之后网络的处置。所以把心跳时间改为30让 mqtt30秒之后再自动重连。但是这样只是为了让体验稍微好一点,不会呈现切换进来5s就断开链接,再切回来一直提示重连的问题。不过可以把心跳时间改为0表示一直连接不时开。

         

        总结:

        1以上对mqtt解也只是一知半解,还没弄明白这里的心跳时间,和 TCP/IP心跳机制是不是一样的超越心跳时间,能不能让客户端不掉线,或者有没有更好的解决离线的方法。

        2而且还有很多特性都没用到比方will遗愿标志,专门用来处置客户端断开连接的配置项。

        3由于这个项目都是用的Qos0消息,都不知道与Qos1Qos2区别是什么。

        先暂时记录到这里,后面弄懂了再补充。 

         

地址 · ADDRESS

地址:建邺区新城科技园嘉陵江东街18号2层

邮箱:309474043@qq.Com

点击查看更多案例

联系 · CALL TEL

400-8793-956

售后专线:025-65016872

业务QQ:309474043    售后QQ:1850555641

©南京安优网络科技有限公司 版权所有   苏ICP备12071769号-4  网站地图