评论

如何在小程序中接入MQTT?

如何在小程序中接入MQTT

在小程序端,我使用的是这个MQTTJS库,这个库可以应用于浏览器,NPM,还可以应用到微信小程序,支付宝小程序。

我在小程序中实际用的版本是mqttv4.2.1.js,将文件下载后,保存为mqtt.js文件,并放入到小程序的utils目录中。然后在具体的MQTT页面中,引入该文件。

import mqtt from "../../utils/mqtt.js";

然后,在小程序页面的js文件中,设置如下变量和方法,这是一个示例,请根据实际情况进行调整。

下面是一些核心关键代码片段:

data: {
    isConn: false,
    isSub: false,
    client: null,
    host: "",
    username: "",
    password: "",
    subTopic: "",
    pubTopic: "",
    pubMsg: "",
    recvMsg: "",
  },
  
  

MQTT连接方法,请注意,这里的连接地址格式为wxs://yourdomain.com/mqtt/ws

connect() {
    const that = this;
    if (utils.isEmpty(that.data.host)) {
      wx.showToast({
        title: '连接地址为空',
      })
      return
    }
  
    // 微信小程序中需要将 wss 协议写为 wxs,且由于微信小程序出于安全限制,不支持 ws 协议
    try {
      wx.showLoading({
        title: '连接中',
      })
      const options = {
        keepalive: 30,
        //protocolVersion: 4, //MQTT V3.1.1
        connectTimeout: 3000,
        reconnectPeriod: 0, // 1000毫秒,设置为 0 禁用自动重连,两次重新连接之间的间隔时间
        clientId: 'mqttmp_' + Math.random().toString(16).substr(2, 8), //这个地方最好用一个随机字符串方法生成
        port: 443,
        username: `${this.data.username}`,
        password: `${this.data.password}`,
      }
      this.data.client = mqtt.connect(`${this.data.host}`, options);
      this.data.client.on("connect", () => {
        wx.hideLoading({
          success: (res) => {},
        })
        that.setData({
          isConn: true,
        })
        wx.showToast({
          title: "连接成功",
        });

        this.data.client.on("message", (topic, payload) => {
          wx.showModal({
            content: `收到消息 - Topic: ${topic},Payload: ${payload}`,
            showCancel: false,
          });

        });

      });
    } catch (error) {
      wx.hideLoading({
        success: (res) => {},
      })
      that.setData({
        isConn: false,
      })
      wx.showToast({
        title: "连接失败",
      });
      console.log("mqtt.connect error", error);
    }
  },


断开连接方法:

  disconnect() {
    this.data.client.unsubscribe(this.data.subTopic);
    this.data.client.end();
    this.data.client = null;
    this.setData({
      isSub: false,
      isConn: false,
    })
    wx.showToast({
      title: "成功断开连接",
    });
  },

发布主题方法:

publish() {
    if (this.data.client) {
      this.data.client.publish(this.data.pubTopic, this.data.pubMsg);
      return;
    }
    wx.showToast({
      title: "请先点击连接",
      icon: "error",
    });
  },

订阅主题方法:

 subscribe() {
    if (this.data.client) {
      this.data.client.subscribe(this.data.subTopic);
      this.setData({
        isSub: true,
      })
      wx.showModal({
        content: `成功订阅主题:${this.data.subTopic}`,
        showCancel: false,
      });
      return;
    }
    wx.showToast({
      title: "请先点击连接",
      icon: "error",
    });
  },


最后一次编辑于  10-02  
点赞 0
收藏
评论
登录 后发表内容