当前位置: 首页 > article >正文

vue 通过 mqtt 实现实时接收消息

一. MQTT 简介

‌MQTT(消息队列遥测传输)是一种基于发布/订阅模式的轻量级消息协议,适用于硬件性能有限的远程设备和网络状况不佳的环境。‌它工作在TCP/IP协议之上,具有轻量、简单、开放和易于实现的特点,广泛应用于物联网(IoT)、机器与机器(M2M)通信、智能家居等领域。

二. MQTT 的基本组成

MQTT协议由固定头、可变头和消息体三部分组成:

固定头‌:每个消息都有固定头,但其长度不固定,范围为2-5个字节。固定头用于表示消息的长度和其他控制信息。
可变头‌:存储消息相关的属性,如协议名、协议版本号、心跳时长、主题名、消息ID等。不同类型的消息,可变头中的内容也不同。
‌消息体‌:实际发送的数据。例如,CONNECT消息体包含客户端标识、用户名、密码等信息;PUBLISH消息体则是实际发送的消息内容。

三. MQTT 的使用

  1. 安装
npm i mqtt --save
  1. 引入
import mqtt from 'mqtt'
  1. 使用
data() {
	client: null,
    connection: {
      host: 'localhost',
      port: 8083, // 端口号
      endpoint: '/mqtt',
      clean: true,
      connectTimeout: 4000, // 超时时间
      reconnectPeriod: 4000,
      clientId: uuid.v4(), // 这是一个随机生成的自定义的值
      cleanSession: true, // 是否清理Session
      keepAlive: 5 // 心跳间隔
    },
    mqttfalg: true, // 是否开启 mqtt
    // 下边三个的值是与后端约定好的,根据实际情况赋值
    ImgStart: '', 
    ImgSend: '',
    ImgEnd: ''
},
mounted() {
	// 创建连接
	this.createConnection()
},
beforeDestroy() {
	// 断开 mqtt 连接,不然会一直监听消息
  	this.disConnect()
},
methods: {
	// 创建连接
    createConnection() {
      const { host, port, endpoint, ...options } = this.connection
      // 连接的 url
      const connectUrl = `ws://${host}:${port}${endpoint}`
      
      // 如果开启了 mqtt
      if (this.mqttfalg) {
        this.client = mqtt.connect(connectUrl, options)
        this.client.on('connect', () => {
          console.log('连接成功!')
          
          // 关闭开关,不然会一直重复连接
          this.mqttfalg = false
          
          // 订阅配置(这里的参数都是与后端约定好的,根据实际情况传入)
          this.client.subscribe(this.ImgEnd, { qos: 2 })
          this.client.subscribe(this.ImgSend, { qos: 2 })
          this.client.subscribe(this.ImgStart, { qos: 2 })
        })
        
        // 连接出错执行
        this.client.on('error', error => {
          console.log('连接出错', error)
        })
        
        // 重连时执行
        this.client.on('reconnect', error => {
          console.log('正在重连', error)
        })

		// 监听收到的消息
        this.client.on('message', async (topic, data) => {
          const json = JSON.parse(data.toString())
          console.log('接到了消息', topic, json)
          
          // 如果收到的消息 topic 等于发送
          if (topic === this.ImgSend) {
            // 处理收到的消息 json
            console.log('收到的消息内容', json)
          }
          
		  // 如果收到的消息 topic 等于结束,说明当前最后一条消息已发送完毕
          if (topic === this.ImgEnd) {
            console.log('消息接收完毕')
          }
        })
      }
    },
    // 断开连接
    disConnect() {
      if (this.client) {
        this.client.end()
        console.log('断开连接')
      }
    },
}

http://www.kler.cn/a/422044.html

相关文章:

  • 稳定运行的以Azure Synapse Dedicated SQL Pool数据仓库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • 「Mac玩转仓颉内测版42」小学奥数篇5 - 圆和矩形的面积计算
  • 计算S=1!+2!+3!+…+N!的值:JAVA
  • 【C++】C与C++基本区别以及构造函数
  • Node.js 实战: 爬取百度新闻并序列化 - 完整教程
  • 用三维模型的顶点法向量计算法线贴图
  • 算法笔记:力扣24. 两两交换链表中的节点
  • centos7下安装promethus及grafana
  • flutter 报错 error: unable to find git in your path.
  • MongoDB注入攻击测试与防御技术深度解析
  • 若依前端问题
  • redis针对string的命令及应用场景
  • API 数据接口使用与安全指南
  • vitess使用记录:vtctldclient,设置分表规则
  • Postgres 如何使事务原子化?
  • [每周一更]-(第125期):模拟面试|NoSQL面试思路解析
  • 备赛蓝桥杯--算法题目(2)
  • 基于Matlab地形和环境因素的森林火灾蔓延模拟与可视化研究
  • Windows系统搭建Docker
  • 040集——CAD中放烟花(CAD—C#二次开发入门)
  • qt6 oob
  • 微服务即时通讯系统的实现(服务端)----(3)
  • 基于Python 哔哩哔哩网站热门视频数据采集与可视化分析设计与实现,有聚类有网络语义研究
  • 【数据集】细胞数据集:肿瘤-胎儿重编程的内皮细胞驱动肝细胞癌中的免疫抑制性巨噬细胞(Sharma等人)
  • helm部署golang服务
  • numpy 计算两组向量是否相等,以及在一定误差内相等