微信小程序连接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 ? `<br />${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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值