vue3 ts4 封装 mqtt 同一连接订阅多主题

本文是对改良:vue3+ts 封装mqtt_你的微笑、暖暖的的博客-CSDN博客近期在vue3的项目中使用到了mqtt,再次记录下,供大家学习。https://blog.csdn.net/wangyuiba1314/article/details/126307598

服务器采用,RabbitMQ3.9,开启rabbitmq_web_mqtt,部署方法参考http://t.csdn.cn/Xe6Vg

0.安装相关组件

mqtt:用于连接

npm i "mqtt"

uuid:用于确定客户端唯一(非必须)

npm i "vue-uuid"

1.新建Mqtt.ts

import type { MqttClient, OnMessageCallback } from 'mqtt';
import * as mqtt from 'mqtt/dist/mqtt.min.js';
import { uuid } from 'vue-uuid';

class MQTT {
  type: string; // 客户端分类(非必须)
  url: string; // mqtt地址
  client!: MqttClient;

  constructor(type: string) {
    this.type= type;
    this.url = 'ws://192.168.x.x:15675/ws';// ws方式必须ws结尾
  }

  //初始化mqtt
  init() {
    const options = {
      clean: true,
      clientId: this.type+ "_" + uuid.v1(), // 客户端分类唯一
      username: 'xxx',
      password: 'xxx',
      connectTimeout: 3000, // 超时时间
    };

    this.client = mqtt.connect(this.url, options);

    this.client.on('error', (error: any) => {
      console.log(this.url + "异常中断");
    });

    this.client.on('reconnect', (error: Error) => {
      console.log(this.url + "重新连接");
    });
  }

  //取消订阅
  unsubscribes(topic: string) {
    this.client.unsubscribe(topic, (error: Error) => {
      if (!error) {
        console.log(topic + '取消订阅成功');
      } else {
        console.log(topic + '取消订阅失败');
      }
    });
  }

  //连接
  link(topic: string) {
    this.client.on('connect', () => {
      this.client.subscribe(topic, (error: any) => {
        if (!error) {
          console.log(topic + '订阅成功');
        } else {
          console.log(topic + '订阅失败');
        }
      });
    });
  }

  //收到的消息
  get(callback: OnMessageCallback) {
    this.client.on('message', callback);
  }

  //结束链接
  over() {
    this.client.end();
  }
}
export default MQTT;

2.新建UseMqtt.ts

import MQTT from './Mqtt';
import type { OnMessageCallback } from 'mqtt';
import {
  ref,
  onUnmounted
} from 'vue';

export default function useMqtt() {
  const PublicMqtt = ref<MQTT | null>(null);
  const linkList = Array<string>(); // 长连接的列表

  const startMqtt = (type: string, callback: OnMessageCallback) => {
    PublicMqtt.value = new MQTT(type);//创建连接
    PublicMqtt.value.init();//初始化mqtt
    linkList.forEach((topic) => { PublicMqtt.value?.unsubscribes(topic); PublicMqtt.value?.link(topic) });//订阅主题
    getMessage(callback);
  };

  const addLink = (topic: string) => {
    if (!linkList.includes(topic)) { // 简单地去重
      linkList.push(topic);
      PublicMqtt.value?.link(topic);
    }
  }

  const Uint8ArrayToString = (fileData: Uint8Array) => {
    var dataString = "";
    for (var i = 0; i < fileData.length; i++) {
      dataString += String.fromCharCode(fileData[i]);
    }
    return dataString
  }

  const getMessage = (callback: Function) => {
    PublicMqtt.value?.get((t, m) => { callback(t, Uint8ArrayToString(m)); });
  };

  onUnmounted(() => {//页面销毁结束订阅
    linkList.forEach((topic) => { PublicMqtt.value?.unsubscribes(topic) });
    PublicMqtt.value?.over();
  });

  return {
    startMqtt,
    addLink
  };
}

3.使用vue

<script setup lang="ts">
  import UseMqtt from './UseMqtt';

  const {
    startMqtt,
    addLink
  } = UseMqtt();

 // 创建一个连接
 startMqtt("A", (topic, data) => {
    console.log(topic);
    console.log(data);
 });

 // 订阅多主题
 addLink('a001');
 addLink('a002');
</script>

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以将MQTT封装成一个Vue插件,并将其注册到Vue实例中,这样就能够在多个组件中使用它了。 首先,我们要安装MQTT的npm包: ``` npm install mqtt --save ``` 然后,我们创建一个mqtt.js文件,将MQTT封装成一个插件: ```js import mqtt from 'mqtt' const mqttPlugin = { install (Vue, options) { Vue.prototype.$mqtt = mqtt.connect(options.host, options.options) } } export default mqttPlugin ``` 在这里,我们使用了Vue的插件机制,在Vue实例中注册了一个全局的$mqtt属性,可以在任意组件中使用。 我们还需要在main.js文件中引入mqtt插件: ```js import Vue from 'vue' import App from './App.vue' import mqttPlugin from './mqtt.js' Vue.use(mqttPlugin, { host: 'mqtt://localhost:1883', options: { clientId: 'myClientId' } }) new Vue({ render: h => h(App) }).$mount('#app') ``` 在这里,我们使用Vue.use()方法来安装mqtt插件,并传递了host和options参数,以便连接MQTT服务器。 现在,我们就可以在任意组件中使用$mqtt属性来连接订阅MQTT主题了: ```js export default { mounted () { this.$mqtt.on('connect', () => { console.log('MQTT connected') this.$mqtt.subscribe('my/topic') }) this.$mqtt.on('message', (topic, payload) => { console.log(`Received message on topic ${topic}: ${payload.toString()}`) }) }, beforeDestroy () { this.$mqtt.end() } } ``` 在这个例子中,我们在组件的mounted()钩子中连接MQTT服务器,并订阅了一个主题。在message事件中,我们打印出了收到的消息。 最后,在组件的beforeDestroy()钩子中,我们关闭了MQTT连接。 这样,我们就成功地封装MQTT,并能够在多个组件中使用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值