Vue3实现mqtt的订阅与发布

什么是MQTT

MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,通常用于连接物联网设备和应用程序之间的通信。它最初由IBM开发,现在由OASIS(Organization for the Advancement of Structured Information Standards)进行标准化。

MQTT的工作原理:它采用发布/订阅模式,其中设备(称为客户端)可以发布消息到特定的主题(topics),而其他设备可以订阅这些主题以接收消息。这种模式使得通信非常灵活,因为发送者和接收者之间的耦合度很低。MQTT还支持负载消息(payload message)的传输,这意味着可以发送各种类型的数据,如传感器读数、控制指令等。

MQTT的轻量级设计使其在网络带宽和资源受限的环境中表现出色,因此在物联网应用中得到了广泛应用。它可以在低带宽、不稳定的网络环境下可靠地运行,同时保持较低的能耗。MQTT也有许多开源实现和客户端库,使得它在各种平台上都能方便地使用。

MQTT的优点

  • 轻量级和低带宽消耗: MQTT设计简单,协议头部小,有效地减少了网络带宽的使用,适合在带宽有限的网络环境中使用,尤其是在物联网设备和传感器等资源受限的场景下。
  • 异步通信: MQTT采用发布/订阅模式,实现了异步通信,发布者和订阅者之间解耦合,无需即时连接,消息的发送和接收是异步的,这种设计提供了更灵活的通信方式。
  • 可靠性: MQTT支持消息传输的可靠性。它提供了QoS(Quality of Service)级别,包括至多一次、至少一次和只有一次,以满足不同应用场景的需求。通过这些QoS级别,可以确保消息能够按照要求进行传输和接收。
  • 容易实现和部署: MQTT具有简单的设计和实现,有许多开源的实现和客户端库可供选择,可以方便地在各种平台和编程语言中使用。这使得MQTT在物联网应用中广泛应用,并且容易部署和集成到现有系统中。
  • 支持持久会话和遗嘱消息: MQTT支持客户端会话保持,即客户端断开连接后可以保持会话状态,同时支持遗嘱消息,即客户端异常断开连接时可以发送遗嘱消息给其他客户端。

什么是发布订阅模式

发布/订阅模式是一种消息传递范式,其中消息的发送者(发布者)和接收者(订阅者)之间是解耦的。在这种模式下,发布者将消息发送到一个特定的主题(topic),而订阅者则通过订阅这些主题来接收消息。

具体来说,发布者将消息发布到一个或多个主题,而订阅者则订阅一个或多个主题。当发布者发布消息到某个主题时,所有订阅了该主题的订阅者都会收到这条消息。这种模式使得消息的发送者和接收者之间没有直接的依赖关系,从而实现了松耦合的通信方式。

发布/订阅模式常用于分布式系统中,特别是在需要大规模消息传递的情况下,比如物联网应用、实时数据处理等。它提供了一种灵活、可扩展的方式来实现异步通信,同时允许多个订阅者同时接收相同的消息,从而满足了各种实时通信的需求。

MQTT在项目的运用

项目Vite和Vue版本

javascript 复制代码
"vue": "^3.4.21"
"vite": "^5.2.0"

安装MQTT

javascript 复制代码
npm i mqtt@5.5.2

引入MQTT文件

javascript 复制代码
import mqtt from "mqtt"; // import namespace "mqtt"
import { onMounted } from 'vue'

MQTT的具体使用

javascript 复制代码
<script setup>
import HelloWorld from "./components/HelloWorld.vue";
import mqtt from "mqtt"; // import namespace "mqtt"
import { onMounted } from "vue";

onMounted(() => {
  // 建立连接
  // 注意此出的网址开头要使用ws:而不是tcp:
  let client = mqtt.connect("ws://192.168.1.131:8083/mqtt", {
    username: "admin",  // 用户名字
    password: "3Ha86294",  // 密码
  });
  // 订阅主题
  client.subscribe("test1", (topic) => {
    console.log(topic);  // 此处打印出订阅的主题名称
  });
  
  // 推送消息
  client.publish("test2", JSON.stringify({one: '1', two: '2'})); 

  //接受消息
  client.on("message", (topic, data) => {
    // 这里有可能拿到的数据格式是Uint8Array格式,所以可以直接用toString转成字符串
    // let dataArr = JSON.parse(data.toString());
    console.log(data);
  });

  // 重连
  client.on("reconnect", (error) => {
    console.log("正在重连:", error);
  });

  // 错误回调
  client.on("error", (error) => {
    console.log("MQTT连接已关闭");
  });
});
</script>
相关推荐
WindrunnerMax1 小时前
从零实现富文本编辑器#11-Immutable状态维护与增量渲染
前端·架构·前端框架
不想秃头的程序员1 小时前
Vue3 封装 Axios 实战:从基础到生产级,新手也能秒上手
前端·javascript·面试
数研小生2 小时前
亚马逊商品列表API详解
前端·数据库·python·pandas
你听得到112 小时前
我彻底搞懂了 SSE,原来流式响应效果还能这么玩的?(附 JS/Dart 双端实战)
前端·面试·github
不倒翁玩偶2 小时前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
前端·npm·node.js
奔跑的web.2 小时前
UniApp 路由导航守
前端·javascript·uni-app
EchoEcho2 小时前
记录overflow:hidden和scrollIntoView导致的页面问题
前端·css
Cache技术分享2 小时前
318. Java Stream API - 深入理解 Java Stream 的中间 Collector —— mapping、filtering 和 fla
前端·后端
竟未曾年少轻狂2 小时前
Vue3 生命周期钩子
前端·javascript·vue.js·前端框架·生命周期