十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
创新互联公司长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为井陉矿企业提供专业的网站设计、做网站,井陉矿网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。这篇文章主要讲解了uniapp打包成微信小程序中如何使用 MQTT,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
最近在uniapp打包成微信小程序的项目中第一次用到了MQTT。使用比较简单,但是还是遇到了一些问题。在此记录一下。
官方文档:MQTT Github
官方MQTT测试工具:MQTTX。测试工具使用说明
MQTT的js文件:mqtt.min.js
先上一点注意事项:
(1)MQTT.js 一个 MQTT 协议的客户端库,用 JavaScript 编写,可用于 Node.js 和浏览器。在 Node.js 端可以通过全局安装使用命令行连接,同时还支持 MQTT ,MQTT TLS 证书连接;值得一提的是 MQTT.js 还对微信小程序有较好的支持。
(2)MQTT可以通过三种方式连接,TCP直连, TLS和WebSocket,但是JavaScript使用 TCP 只能通过 ws 即 Websocket 链接。所以如果服务器是TCP直连,客户端是肯定连不上的,会报 Error in connection establishment 的错误。所以客户端协议只能是ws,wss,wxs(微信)
(3)WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。作为一种通信协议,其使用 ws(非加密)、wss(SSL 加密) 作为协议标识。MQTT.js 客户端支持多种协议,连接地址需指明协议类型;
(4)ws: 未加密的 WebSocket 连接,一般使用8083端口。wss: 加密的 WebSocket 连接,一般使用8084端口。mqtt: 未加密的 TCP 连接,一般使用1883端口。mqtts: 加密 TCP 连接。
贴一下代码:
import $mqtt from './mqtt.min.js'; const mqttOptions = { keepalive: 30, clean: false, connectTimeout: 5000, // Timeout clientId: uni.getStorageSync('clientId'), // username: 'test', // password: 'test', } const connectUrl = `${mqttHost}:${mqttPort}/mqtt`; // #ifdef H5 var client = $mqtt.connect('wss://' + connectUrl, mqttOptions); // #endif // #ifdef MP-WEIXIN||APP-PLUS var client = $mqtt.connect('wxs://' + connectUrl, mqttOptions); // #endif client.on('connect', () => { console.log('connect') // 这是为了给自己发条消息,其它无作用 client.subscribe('test', (err) => { if (!err) { client.publish('test', '{}') } }) }); // 自动重连 client.on('reconnect', (msg) => { console.log('reconnect', msg) }); // 错误 client.on('error', () => { console.log('error') }); // 断开 client.on('end', () => { console.log('end') }); // 掉线 client.on('offline', (msg) => { console.log('offline',msg) }); // 收到消息 client.on('message', (topic, message) => { // 把arrayBuffer转成字符串 let encodedString = String.fromCharCode.apply(null, new Uint8Array(message));// 全局发送消息 uni.$emit('sendTopicMsg',encodedString); console.log(encodedString) }) // 全局监听是否有关闭mqtt的消息的事件 uni.$on('closeMqtt',() => { client.end(true); // 主动断开连接 })