> 技术文档 > 微信小程序连接MQTT_微信小程序 mqtt

微信小程序连接MQTT_微信小程序 mqtt


什么是MQTT

MQTT是一种轻量级通信协议,基于TCP/IP,采用发布-订阅模式,广泛应用于物联网领域。

MQTT的工作原理围绕着三个核心部分:发布者(Publishers)、代理(Broker,也称服务器)和订阅者(Subscribers)。发布者负责发送消息到特定的主题(Topic),代理则接收这些消息并将其转发给所有订阅了该主题的订阅者。这种模式允许设备间异步通信,且设备不需要直接了解彼此的存在,从而降低了系统的复杂性。

微信小程序连接MQTT

下面将以uniapp为例,介绍微信小程序如何连接mqtt

1.前期准备

微信小程序安全要求比较高,与后台服务器之间的通讯必须使用https/wss协议。如果还没有配置mqtt服务器,这里可以使用EMQX的免费公共MQTT服务器进行测试。

在这里插入图片描述

微信小程序还需配置socket合法域名,但是该域名还还没有进行ICP备案,这里配置不了,所以需要在微信开发工具中勾选【不校验合法域名、web-view(业务域名)、TLS版本以及 HTTPS 证书】。

如果已经有MQTT服务器,并且进行了ICP备案的,则不需要勾选【不校验合法域名、web-view(业务域名)、TLS版本以及 HTTPS 证书】,直接按照下图在微信公众平台进行配置即可,配置完成之后需要等待一会才能生效。

在这里插入图片描述

在这里插入图片描述

2示例

(1)引入mqtt

uniapp可以使用的mqtt.js版本有v4.1.0 和 v2.18.8

v4.1.0:https://unpkg.com/mqtt@4.1.0/dist/mqtt.min.js

v2.18.8:https://unpkg.com/mqtt@2.18.8/dist/mqtt.min.js

在项目根目录下新建utils文件夹,将下载好的对应版本的mqtt.min.js文件放入该文件夹中,然后通过如下方式引入mqtt

import mqtt from \"../../utils/mqtt.min.js\"

(2)建立连接

data() { return { client: null, connectBtnText: \"连接\", host: \"broker.emqx.io\", port: 8084, clientId: new Date().getTime(), subTopic: \"testtopic/miniprogram\",// 订阅主题 pubTopic: \"testtopic/miniprogram\",// 发布主题 pubMsg: \"Hello!MQTT!\",// 要发送的信息 receivedMsg: \"\",// 接收到的信息 mqttOptions: { // username: \"test\",// 用户名 // password: \"test\",// 密码 reconnectPeriod: 1000, // 1000毫秒,设置为 0 禁用自动重连,两次重新连接之间的间隔时间 connectTimeout: 30 * 1000, // 30秒,连接超时时间 } }},methods: { connectMqtt() { try { this.connectBtnText = \"连接中...\" // 微信小程序中需要将wss协议写为wxs this.client = mqtt.connect(`wxs://${this.host}:${this.port}/mqtt`, { ...this.mqttOptions, clientId: this.clientId }) // 监听连接成功 this.client.on(\"connect\", () => { uni.showToast({  title: \"连接成功\",  icon: \"none\" }) this.connectBtnText = \"连接成功\" // 监听收到的信息 this.client.on(\"message\", (topic, payload) => {  uni.showToast({ title: `收到消息 - Topic: ${topic},Payload: ${payload}`, icon: \"none\"  });  const currMsg = this.receivedMsg ? `
${payload}`
: payload; this.receivedMsg = this.receivedMsg.concat(currMsg) });// 监听错误 this.client.on(\"error\", (error) => { this.connectBtnText = \"连接\" console.log(\"onError\", error); }); this.client.on(\"close\", () => { this.connectBtnText = \"连接\" console.log(\"close\"); }); this.client.on(\"offline\", () => { this.connectBtnText = \"连接\" console.log(\"offline\"); }); // mqtt.js会自动断线重连 this.client.on(\"reconnect\", () => { this.connectBtnText = \"连接\" console.log(\"reconnecting...\"); }); }) } catch (err) { console.log(err) this.connectBtnText = \"连接\" } }}

(3)断开连接

disconnectMqtt() { if(this.client.connected) { this.client.end(true) this.client = null this.connectBtnText = \"连接\" uni.showToast({ title: \"成功断开连接\", icon: \"none\" }) return } uni.showToast({ title: `请先点击连接`, icon: \"none\" })}

(4)订阅主题

subscribe() { if(this.client) { this.client.subscribe(this.subTopic, {qos: 2}, (err) => { if(!err) { uni.showToast({  title: `成功订阅主题:${this.subTopic}`,  icon: \"none\" }) } }) return } uni.showToast({ title: `请先点击连接`, icon: \"none\" })}

(5)取消订阅

unsubscribe() { if(this.client) { this.client.unsubscribe(this.subTopic, (err) => { if(!err) { uni.showToast({  title: `成功取消订阅主题:${this.subTopic}`,  icon: \"none\" }) } }) return } uni.showToast({ title: `请先点击连接`, icon: \"none\" })}

(6)发布

publish() { if(this.client) { this.client.publish(this.pubTopic, this.pubMsg, {qos: 2}, (err) => { if(!err) { console.log(\"发布信息成功\",this.pubTopic, this.pubMsg) } }) return } uni.showToast({ title: `请先点击连接`, icon: \"none\" })}

3.注意点

(1)微信小程序中需要将wss协议写为wxs

(2)如果连接使用的clientId是重复的话,会互相顶掉线

(3)消息级别:QoS 0 最多交付一次;QoS 1 至少交付一次;QoS 2 只交付一次;

(4)testtopic/#:指testtopic的任意子主题;testtopic/miniprogram:testtopic的miniprogram主题

(5)如果订阅和发布是同一个主题,那么发布信息的同时,也会接收到该信息。因此可以将订阅和发布定为不同的主题或采取其他方式进行识别

(6)如果连接公司的mqtt服务器出现问题的话,可以使用EMQX的免费公共MQTT服务器进行测试。有时候可能是服务器没有配置好,才导致连接不上

MQTT测试工具

可以使用MQTTX软件进行测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考链接

https://www.emqx.com/zh/blog/how-to-use-mqtt-in-wechat-miniprogram?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-help-to-blog