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就遇到各种报错了,ReferenceError: global is not defined

找遍整网也很难找到想关的答案。

于是就各种升降级改MQTT版本,毛用。各种CDN引用,毛鸟用。

最后去node_modules目录看看,发现有个dist的目录,难道。。。

抱着试试的心态,就改为这样:

import * as mqtt from "mqtt/dist/mqtt.min"; 
that.client = mqtt.connect('ws://' + mqttOption.server, mqttOption);

我去,还真的是可以了!搞足了一天,终于搞定。

那种心情是无法言语的,或许这就是码农的快乐之一吧!

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不一样

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 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, "订阅

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

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

  • MQTT.js 入门使用教程

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

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

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

  • Android MQTT与WebSocket协议详细讲解

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

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

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

  • 使用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

  • Docker安装Redis配置远程连接及踩坑

    目录 1. 安装Redis 2. 新建挂载配置文件夹 3. 增加配置文件 redis.conf 4. 创建redis容器并启动 5. 启动成功,查看状态 6. 容器内部连接进行测试 7. 使用Redis Desktop Manager客户端进行连接 8. 小结 1. 安装Redis 通过docker search redis和docker pull redis下载redis镜像 2. 新建挂载配置文件夹 因为 redis 默认配置你会发现只能够本地连接,不能进行远程访问,使用 Redis Des

  • springboot连接sqllite遇到的坑及解决

    目录 springboot连接sqllite的坑 springboot集成sqlite配置设置 springboot集成sqlite springboot连接sqllite的坑 2021-01-04 13:54:14.178 SvUSService [main] ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.IllegalStateException: Failed to e

  • vue3+vite2中使用svg的方法详解(亲测可用)

    目录 前言: 一.安装vite-plugin-svg-icons 二.在src/components/svgIcon下新建组件index.vue 三.tsconfig.json中添加设置 四.vite.config.ts 中的配置插件 五.在main.ts全局注册组件 六.在页面中使用 七.文件目录结构及其效果展示 八.参考链接地址 总结 技术栈:vue3+vite2 前言: 写过一版基于vue-cli中使用svg的方法,但是因为webpack提供了require.context()在vite中

  • Navicat出现无法远程连接MySql服务器问题的解决办法

    Navicat无法远程连接MySql服务器问题的解决方法写在前面: 操作系统:中标麒麟4.0: 数据库:MySQL5.7.26: JDK:采用中标麒麟系统自带的openjdk: 客户端工具:Navicat: 前置条件: MySQL服务安装完毕: 情景: 安装好mysql,本地访问正常,但同一个局域网内的机器都无法访问该服务器上的mysql数据库: 原因: mysql默认是不可以通过远程机器访问的,只允许本地访问,通过下面的配置可以开启远程访问: 排查思路: mysql设置远程访问主要从以下三个方

  • bitronix 连接 MySQL 出现MySQLSyntaxErrorException 的解决方法

    bitronix 连接 MySQL 出现MySQLSyntaxErrorException 的解决方法 1. 开发环境 hibernate 版本:5.1.0.Final Bitronix btm 版本:2.1.3 2 异常堆栈信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'hibernate' at

  • 远程连接mysql错误代码1130的解决方法

    下面给大家介绍远程连接mysql错误代码1130的解决方法: 以上所述是小编给大家介绍的远程连接mysql错误代码1130的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • Android 弹出软键盘所遇到的坑及解决方法

    demo下载 重要代码: //1.此layout作为最外层的layout: //2.设置需要调整的view: setAdjustView(View view); //3.如果需要控制输入框的显示与隐藏,可以实现OnInputViewVisibleListener接口: public class SoftInputAdjustLayout extends RelativeLayout { private static final String TAG = SoftInputAdjustLayout

  • MySQL5.7中的sql_mode默认值带来的坑及解决方法

    在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本.作为DBA在考虑数据库版本升级带来的影响时,一般会有几个注意点: sql_mode optimizer_switch 本文主要内容是MySQL升级到5.7版本之后,由于默认的 sql_mode 值带来的坑以及对应的解决方案. 案例一:ONLY_FULL_GROUP_BY 问题描述 MySQL版本从5.6升级至5.7之后,部分SQL执行报错,报错信息如下: ERROR 1055 (42000): Expression #3 of X

  • 浅谈vue引入css,less遇到的坑和解决方法

    在使用vux开发手机页面时,引入vux的公共样式less一直报错,通过各种百度,Google都没有解决,走了很多弯路.最后才发现钻牛角尖了,可以换一种方法引入. 1.报错的使用:在App中 @ ./~/css-loader?{"minimize":false,"sourceMap":false}!./~/vux/src/styles/reset. less 3:10-115 @ ./~/css-loader?{"minimize":false,&

  • 基于IOS端微信分享失效的踩坑及解决方法

    最近的一个公众号是基于vue的spa应用,在接入微信分享和微信语音的时候出现了:在Android上一切正常,但是在ios端调用wx.config的时候总是失败,去翻了官方文档也并没有找到解决方案,最后在测试中发现是因为初始化的时候传入的URL的问题.具体过程如下: 微信config接口配置,官方文档如下: 所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支

随机推荐