vue3使用mqtt的示例代码

目录
  • vue3使用mqtt
  • 下面再看下vue3调用mqtt

vue3使用mqtt

封装类

//封装一个类(可直接cv)
class createds {
  //创建公共变量
  static url; //mqtt地址
  static oldSubscribe; //取消订阅准备
  static subscribe; //订阅地址
  static client; //mqtt公共变量
  //接受床底来的数据
  constructor(subscribe) {
    console.log(subscribe, "订阅地址");
    //获取传递来的订阅地址
    this.subscribe = subscribe;
    this.url = "ws://127.0.0.1:8083/mqtt";
  }

  //初始化mqtt
  init() {
    const options = {
      clean: true, // true: 清除会话, false: 保留会话
      connectTimeout: 4000, // 超时时间
    };
    this.client = mqtt.connect(this.url, options);
    this.client.on("error", (error) => {});
    this.client.on("reconnect", (error) => {});
  }
  //取消订阅
  unsubscribes() {
    this.client.unsubscribe(this.subscribe, (error) => {
      if (!error) {
        console.log(this.subscribe, "取消订阅成功");
      } else {
        console.log(this.subscribe, "取消订阅失败");
      }
    });
  }
  //结束链接
  over() {
    this.client.end();
  }
  //链接
  link() {
    this.client.on("connect", (e) => {
      this.client.subscribe(this.subscribe, (error) => {
        //在js代码中最简单的抛出异常方法
        if (!error) {
          console.log("订阅成功");
        } else {
          console.log("订阅失败");
        }
      });
    });
  }
  //收到的消息
  get() {
    this.client.on("message", (topic, message) => {
      console.log("收到消息:", message.toString());
    });
  }
  //结束链接
  over() {
    this.client.end();
  }
}
export default createds;  

使用

//引入封装的类
import createds from "@/utils/mqtt.js";

const PublicMqtt = ref(null);
const startMqtt = (val) => {
  //val = 订阅地址
  //设置订阅地址
  PublicMqtt.value = new createds(val);
  //初始化mqtt
  PublicMqtt.value.init();
  //链接mqtt
  PublicMqtt.value.link();
  getMessage();
};
//获取订阅数据
const getMessage = () => {
  PublicMqtt.value.client.on("message", (topic, message) => {
    let str = JSON.parse(message.toString());
    console.log(str,'返回的数据')
  });
};
//取消MQTT订阅
const unsubscribe = () => {
  //如果页面并没有初始化MQTT,无需取消订阅
  if (PublicMqtt.value) {
    PublicMqtt.unsubscribes();
  }
};
onUnmounted(() => {
  //页面销毁结束订阅
  if (PublicMqtt.value) {
    PublicMqtt.value.unsubscribes();
    PublicMqtt.value.over();
  }
});

// vue3使用npm下载mqtt依赖可能跑不起来,可以把他的js文件下载下来放在本地

下面再看下vue3调用mqtt

npm install mqtt -S

utils下面新建mqtt页面

import { MqttClient, OnMessageCallback } from 'mqtt';
import mqtt from 'mqtt';

class MQTT {
  url: string; // mqtt地址
  topic: string; //订阅地址
  client!: MqttClient;
  constructor(topic: string) {
    this.topic = topic;
    // 虽然是mqtt但是在客户端这里必须采用websock的链接方式
    this.url = 'ws://www.liufengtec.com:8083/mqtt';
  }

  //初始化mqtt
  init() {
    const options = {
        host: 'www.liufengtec.com',
        port: 8083,
        endpoint: '/mqtt',
        clean: true, // 保留会话
        connectTimeout: 4000, // 超时时间
        reconnectPeriod: 4000, // 重连时间间隔
        // 认证信息
        clientId: 'mqttjs_3be2c321',
        username: 'admin',
        password: '3Ha86294',
    };
    this.client = mqtt.connect(this.url, options);
    this.client.on('error', (error: any) => {
      console.log(error);
    });
    this.client.on('reconnect', (error: Error) => {
      console.log(error);
    });
  }
  //取消订阅
  unsubscribes() {
    this.client.unsubscribe(this.topic, (error: Error) => {
      if (!error) {
        console.log(this.topic, '取消订阅成功');
      } else {
        console.log(this.topic, '取消订阅失败');
      }
    });
  }
  //连接
  link() {
    this.client.on('connect', () => {
      this.client.subscribe(this.topic, (error: any) => {
        if (!error) {
          console.log('订阅成功');
        } else {
          console.log('订阅失败');
        }
      });
    });
  }
  //收到的消息
  get(callback: OnMessageCallback) {
    this.client.on('message', callback);
    // console.log(callback,"1010")
  }
  //结束链接
  over() {
    this.client.end();
  }
}
export default MQTT;

utils下面新建usemqtt.ts页面

import MQTT from '@/utils/mqtt';
import { OnMessageCallback } from 'mqtt';
import { ref } from "vue";

export default function useMqtt() {
  const PublicMqtt = ref<MQTT | null>(null);

  const startMqtt = (val: string, callback: OnMessageCallback) => {
    //设置订阅地址
    PublicMqtt.value = new MQTT(val);
    //初始化mqtt
    PublicMqtt.value.init();
    //链接mqtt
    PublicMqtt.value.link();
    getMessage(callback);
  };
  const getMessage = (callback: OnMessageCallback) => {
    //   console.log(callback,"18")
    // PublicMqtt.value?.client.on('message', callback);
    // @ts-ignore //忽略提示
    PublicMqtt.value?.get(callback);
  };
//   onUnmounted(() => {
//     //页面销毁结束订阅
//     if (PublicMqtt.value) {
//       PublicMqtt.value.unsubscribes();
//       PublicMqtt.value.over();
//     }
//   });

  return {
    startMqtt,
  };
}

使用页面调用

import useMqtt from '@/utils/usemqtt';
const { startMqtt } = useMqtt();
startMqtt(deviceSnsss, (topic, message) => {
console.log(message)
}

或者

<template>
  <div id="app">
    <div class="head">
      <p>天润商城后台管理系统</p>
    </div>
    <div class="login">
      <table border="0" cellspacing="20">
        <tr>
          <td>用户名:</td>
          <td>
            <el-input
              prefix-icon="iconfont icon-xingmingyonghumingnicheng"
              placeholder="请输入账号"
              v-model="account"
              clearable
            ></el-input>
          </td>
        </tr>

        <tr>
          <td>密码:</td>
          <td>
            <el-input
              prefix-icon="iconfont icon-mima"
              placeholder="请输入密码"
              v-model="password"
              show-password
            ></el-input>
          </td>
        </tr>
        <tr>
          <td colspan="2" style="text-align: center; padding-top: 50px">
            <el-button type="danger" style="width: 60%" @click="login"
              >登录</el-button
            >
          </td>
        </tr>
      </table>
    </div>
  </div>
</template>

<script>
  import mqtt from 'mqtt'

  export default {
    data() {
      return {
        account:"12",
        password:"12",
        connection: {
          host: 'www.liufengtec.com',
          port: 8084,
          endpoint: '/mqtt',
          clean: true, // 保留会话
          connectTimeout: 4000, // 超时时间
          reconnectPeriod: 4000, // 重连时间间隔
          // 认证信息
          clientId: 'mqttjs_3be2c321',
          username: 'admin',
          password: '3Ha86294',
        },
        subscription: {
          topic: 'topic/mqttx',
          qos: 0,
        },
        publish: {
          topic: 'topic/browser',
          qos: 0,
          payload: '{ "msg": "Hello, I am browser." }',
        },
        receiveNews: '',
        qosList: [
          { label: 0, value: 0 },
          { label: 1, value: 1 },
          { label: 2, value: 2 },
        ],
        client: {
          connected: false,
        },
        subscribeSuccess: false,
      }
    },

    methods: {
      login(){
         this.createConnection();
      },
      // 创建连接
      createConnection() {
        let that=this;
        // 连接字符串, 通过协议指定使用的连接方式
        // ws 未加密 WebSocket 连接
        // wss 加密 WebSocket 连接
        // mqtt 未加密 TCP 连接
        // mqtts 加密 TCP 连接
        // wxs 微信小程序连接
        // alis 支付宝小程序连接
        const { host, port, endpoint, ...options } = this.connection
        const connectUrl = `ws://www.liufengtec.com:8083/mqtt`
        try {
          this.client = mqtt.connect(connectUrl)
        } catch (error) {
          console.log('mqtt.connect error', error)
        }
        this.client.on('connect', () => {
          console.log('Connection succeeded!')
          that.subscribe();

        })
        this.client.on('error', error => {
          console.log('Connection failed', error)
        })
        this.client.on('message', (topic, message) => {
          this.receiveNews = this.receiveNews.concat(message)
          console.log(`Received message ${message} from topic ${topic}`)
        })
      },
      //订阅
   subscribe() {
    var topic = "system";
    var qos = 0;
    //logMessage("INFO", "Subscribing to: [Topic: ", topic, ", QoS: ", qos, "]");
    this.client.subscribe(topic, { qos: Number(qos) });
   },
   // called when a message arrives
    message() {
      var topic = "system";
   this.client.on("message", (topic, message) => {
      console.log(message)
    });
  }
    }
  }
  </script>

<style lang="less" scoped>
.head {
  height: 150px;
  width: 100vw;
  background-image: url(../assets/banner.jpg);
  background-repeat: no-repeat;
  background-size: cover;
  p {
    font-size: 30px;
    color: white;
    line-height: 150px;
    margin-left: 50px;
  }
}
.bg-purple {
  background: #d3dce6;
}

.grid-content {
  border-radius: 4px;
  min-height: 36px;
}
.login {
  display: flex;
  flex-direction: column;
  justify-content: center;
  width: 400px;
  margin: 0px auto;
  border: 2px #f3f3f3 solid;
  padding: 100px;
}
</style>

不封装直接使用。ws和wss不一样

到此这篇关于vue3使用mqtt的文章就介绍到这了,更多相关vue3使用mqtt内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决spring-integration-mqtt频繁报Lost connection错误问题

    目录 问题描述 解决过程 总结 问题描述 在之前的博客介绍了如何在 Spring Boot 集成 MQTT,后面使用中没有发现问题,最近发现一直报错: Lost connection: Connection lost; retrying...Lost connection: 已断开连接; retrying... 解决过程 网上说是因为 client ID 重复,最开始是不相信的,因为我测试只启动了一个客户端.但是却怎么都定位不到异常原因,用重新回到 client ID 重复的这个思路上来: 因为

  • vue3+vite2+mqtt连接遇到的坑及解决

    目录 vue3+vite2+mqtt连接遇到的坑 vue3调用mqtt问题 总结 vue3+vite2+mqtt连接遇到的坑 从vue2版本整合到vue3版本遇到的坑,其实也是自己不够熟悉,哈哈 之前用vue2连接mqtt时是这样的方式 : 1.yarn add mqtt 或 npm install mqtt 2.import mqtt from 'mqtt' 安装完后直接在页面引用,就可以用了 所以在vue2项目里是比较简单的^_^ 但是,但可是,可但是 移到vue3就遇到各种报错了,Refe

  • MQTT.js 入门使用教程

    目录 简介 安装 使用 npm 或 yarn 安装 使用 CDN 安装 全局安装 使用 简单例子 命令行 API 介绍 mqtt.connect([url], options) Client 事件 Client 方法 总结 简介 MQTT.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,主要用于 Node.js 和 浏览器环境中.是目前 JavaScript 生态中使用最为广泛的 MQTT 客户端库. MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,

  • 使用java 实现mqtt两种常用方式

    目录 前言 Paho Java 库实现 spring boot集成mqtt 核心代码 总结 前言 在开发MQTT时有两种方式一种是使用Paho Java 原生库来完成,一种是使用spring boot 来完成. Paho Java 库实现 Eclipse Paho Java Client (opens new window)是用 Java 编写的 MQTT 客户端库(MQTT Java Client),可用于 JVM 或其他 Java 兼容平台(例如Android).Eclipse Paho J

  • Android MQTT与WebSocket协议详细讲解

    目录 MQTT WebSocket 总结 MQTT MQTT是一个极其轻量级的发布/订阅消息传输协议,对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用 有如下特点: 开放消息协议,简单易实现: 发布订阅模式,一对多消息发布: 基于TCP/IP网络连接,提供有序,无损,双向连接: 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量: 消息QoS支持,可靠传输保证. 添加依赖 maven { url "https://repo.eclipse.org/conten

  • 在Node.js下运用MQTT协议实现即时通讯及离线推送的方法

    前言 前些日子了解到mqtt这样一个协议,可以在web上达到即时通讯的效果,但网上并不能很方便地找到一篇目前版本的在node下正确实现这个协议的博客. 自己捣鼓了一段时间,理解不深刻,但也算是基本能够达到使用目的. 本文尚未对离线消息的接收顺序进行处理. 代码 服务端: server.js //服务端引入中间件mosca let mosca = require('mosca') let settings = { port: 5112 } let server = new mosca.Server

  • VUE3+mqtt封装解决多页面使用需重复连接等问题(附实例)

    目录 场景: 一.安装mqtt 二.暴露出main.js中的vue实例 三.封装mqtt 四.编写mqtt配置文件 五.页面引入并使用 总结 场景: 在做的一个项目中多个页面都需要使用到mqtt接收消息,但这样的话每个页面就都需要连接一次mqtt,并且要再次配置options信息.订阅主题.接收消息,非常的不方便,因此琢磨将mqtt封装到vuex中,使其可以多页面通用,这样只需要连接订阅一次,接收到的消息可以存储在vuex中. mqtt在线测试工具:http://www.emqx.io/onli

  • vue3生成随机密码的示例代码

    目录 实现效果 实现思路 完成布局 完成生成随机数的方法 完成生成随机密码的方法 部分代码 总结 实现效果 实现思路 完成布局 完成生成随机数的方法 完成生成随机密码的方法 完成布局 布局直接用element-plus组件库里的el-from+checkbox完成一个简单的表单布局即可. 完成生成随机数的方法 这里我们要四种随机数,大写字母.小写字母.数字.特殊符号.这里实现有两种方式. 第一种直接定义四个字符串,第一个字符串存所有的大写字母.第二个字符串存所有的小写字母.第三个所有的数字.第四

  • 教你使用vue3写Json-Preview的示例代码

    引入后直接<json-preview v-model="jsonData"></json-preview>就可以使用了.近期比较忙,代码就不做调整了. 示例效果 index.vue 文件 <template> <div v-if="isObject" class="json-preview"> <span v-if="!!parentKey"><span cla

  • vue3.0生命周期的示例代码

    在组件化的框架中,比如Angular.React或Vue,都为组件定义了生命周期这个概念,每个组件实例在被创建时都要经过一系列的初始化过程,例如:需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时,在这个过程中也会运行一些叫做生命周期钩子的函数,它们提供给用户在组件的不同阶段添加自己的代码的机会. 使用过Vue2.x的朋友肯定对它的生命周期钩子很熟悉了,因为在实际的开发过程中我们多多少少会用到他们,比如 created.mounted.destoryed等等.

  • 使用Vue3实现一个Upload组件的示例代码

    通用上传组件开发 开发上传组件前我们需要了解: FormData上传文件所需API dragOver文件拖拽到区域时触发 dragLeave文件离开拖动区域 drop文件移动到有效目标时 首先实现一个最基本的上传流程: 基本上传流程,点击按钮选择,完成上传 代码如下: <template> <div class="app-container"> <!--使用change事件--> <input type="file" @ch

  • Springboot整合mqtt服务的示例代码

    首先在pom文件里引入mqtt的依赖配置 <!--mqtt--> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.4</version> </dependency> 其次在springboot 的配置yml文件,配

  • Vue3+TS实现语音播放组件的示例代码

    目录 第一步:点击拖拽进度条 第二步:操作媒体音频 第三步:进度条和播放进度关联 完整代码 该功能将使用vue3 + TS来实现语音播放组件,使用什么技术不重要,重要的是看懂了核心逻辑后,通过原生js.react.vue2等都可以轻松实现 所涉及到重要点有以下几个: (1)进度条的实现:拖拽进度条.点击进度条 (2)操作audio语音播放:通过js操作audio媒体 (3)播放进度与进度条紧密关联:播放的进度改变时,进度条也随之改变:进度条改变时,播放的进度也随之改变 效果图: 开始我们的设计吧

  • Vue3+NodeJS+Soket.io实现实时聊天的示例代码

    目录 前言 前端部分 样式搭建 socket.io-client 后端部分 总结 前言 要想实现一对一实时聊天,我们需要使用 websocket 协议,目前流行的浏览器都支持这个协议. node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验,于是Socket.io诞生. Socket.io将Websocket和轮询机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这

  • vue3实现淘宝放大镜效果的示例代码

    目录 实现效果 实现思路 完成小图盒子.遮罩.大图盒子布局 实现鼠标移动到小图盒子显示遮罩和大图盒子 实现鼠标移动遮罩在小图盒子移动 完整代码 总结 实现效果 实现思路 我们实现动图的淘宝放大镜的效果需要4步. 1.完成小图盒子.遮罩.大图盒子布局2.实现鼠标移动到小图盒子显示遮罩和大图盒子3.实现鼠标移动遮罩在小图盒子移动4.实现遮罩的移动范围不能超出小图盒子,且移动时带动大图图片移动 完成小图盒子.遮罩.大图盒子布局 我的布局小图盒子包裹图片.遮罩.大图盒子.小图盒子为相对定位.遮罩.大图盒

  • vue3 + async-validator实现表单验证的示例代码

    目录 vue3 表单验证 前言 搭建vue3的项目 vue3的表单验证 1.表单代码 2.添加验证 2-1. 初始化 2-2. 多个表单的验证 2-3. Promise方式验证 2-4. 正则验证 2-5. 长度控制 2-6. 多个验证条件 2-5. 自定义验证 3.优化完善 vue3 表单验证 前言 表单验证可以有效的过滤不合格的数据,减少服务器的开销,并提升用户的使用体验. 今天我们使用 vue3 来做一个表单验证的例子.先来看看完成的效果图 搭建vue3的项目 创建项目前 这里我们首先要说

  • 基于Vue3实现数字华容道游戏的示例代码

    目录 前言 环境 思路 实现 GameCnt GameTool GamePass GameTip Menu 最后 前言 恰逢春之四月,天气忽热忽凉,遇游戏大赛,以笨拙之技,书一篇小文. 游戏规则:存在n*n的格子,需要将它们按数字顺序或图片顺序一一还原即可. 环境 主要环境: vue3 version:3.2.4 vite version:2.5.0 vue-router version:4.0.14 注:这个游戏的路由使用的是自动路由插件 主要插件: windicss version:3.5.

随机推荐