前端结合MQTT实现连接 订阅发送信息等操作 VUE3

  MQTT客户端下载 使用测试 在我之前文章中 MQTT下载基础使用

下面记录一下前端使用的话的操作

1.安装

npm i mqtt

引入

import * as mqtt from "mqtt/dist/mqtt.min"; //VUE3
import mqtt from 'mqtt'   //VUE2

一、MQTT协议中的方法

Connect。等待与服务器建立连接。
Disconnect。等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。
Subscribe。等待完成订阅。
UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。
Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。
 

二,简单使用 基础使用(VUE2)

下面代码中, options 是客户端连接选项,以下是主要参数说明,其余参数详见https://www.npmjs.com/package/mqtt#connect。
keepalive:心跳时间,默认 60秒,设置 0 为禁用;
clientId: 客户端 ID ,默认通过 ‘mqttjs_’ + Math.random().toString(16).substr(2, 8) 随机生成;
username:连接用户名(如果有);
password:连接密码(如果有);
clean:true,设置为 false 以在离线时接收 QoS 1 和 2 消息;
reconnectPeriod:默认 1000 毫秒,两次重新连接之间的间隔,客户端 ID 重复、认证失败等客户端会重新连接;
connectTimeout:默认 30 * 1000毫秒,收到 CONNACK 之前等待的时间,即连接超时时间。

import mqtt from 'mqtt'// 连接选项
const options = {connectTimeout: 4000, // 超时时间// 认证信息clientId: 'emqx-connect-via-websocket',username: 'emqx-connect-via-websocket',password: 'emqx-connect-via-websocket',
}const client = mqtt.connect('wss://iot.actorcloud.io:8084/mqtt', options)client.on('reconnect', (error) => {console.log('正在重连:', error)
})client.on('error', (error) => {console.log('连接失败:', error)
})client.on('connect', (e) => {console.log('成功连接服务器')// 订阅一个主题client.subscribe('hello', { qos: 1 }, (error) => {if (!error) {cosnole.log('订阅成功')client.publish('hello', 'Hello EMQ', { qos: 1, rein: false }, (error) => {cosnole.log(error || '发布成功')})}})// 订阅多个主题client.subscribe(['hello', 'one/two/three/#', '#'], { qos: 1 },  onSubscribeSuccess)// 订阅不同 qos 的不同主题client.subscribe([{ hello: 1 }, { 'one/two/three': 2 }, { '#': 0 }], onSubscribeSuccess,)
})// 取消订阅
client.unubscribe(// topic, topic Array, topic Array-Onject'hello',onUnubscribeSuccess,
)// 监听接收消息事件
client.on('message', (topic, message) => {console.log('收到来自', topic, '的消息', message.toString())
})// 发布消息
if (!client.connected) {console.log('客户端未连接')return
}client.publish('hello', 'hello EMQ', (error) => {console.log(error || '消息发布成功')
})

三,项目中示例  (VUE3)

//项目中示例  这只是一个简单的链接 订阅 断开链接的案例

import * as mqtt from "mqtt/dist/mqtt.min";
import { onUnmounted, ref, reactive } from 'vue';
import { ElNotification } from 'element-plus'export default function useMqtt() {let client = ref({connected: false});const notifyPromise = ref(Promise.resolve())const qosList = [0, 1, 2];// 订阅const topic = ref('rscu/alertpush/participant/up')const qos = ref(1)// 链接地址const hostUrl = ref('101.37.163.199')const connection = reactive({// 指明协议类型protocol: "ws",host: hostUrl.value,// ws: 8083; wss: 8084//端口号port: 8083,endpoint: "/mqtt",// for more options, please refer to https://github.com/mqttjs/MQTT.js#mqttclientstreambuilder-optionsclean: true,connectTimeout: 30 * 1000, // msreconnectPeriod: 4000, // msclientId: "emqx_benYing_" + Math.random().toString(16).substring(2, 8),// 账号密码username: "admin",password: "root",});const messageValue = ref(false)// 订阅的信息const receiveNews = ref('')const time = ref(null)const startMqtt = () => {try {const { protocol, host, port, endpoint, ...options } = connection;const connectUrl = `${protocol}://${host}:${port}${endpoint}`;client.value = mqtt.connect(connectUrl, options);if (client.value.on) {// 连接client.value.on("connect", () => {console.log("连接成功 successful");});// 重连client.value.on("reconnect", handleOnReConnect);client.value.on("error", (error) => {console.log("重连失败 error:", error);});// 收到信息client.value.on("message", (topic, message) => {// receiveNews.value = receiveNews.value.concat(message.toString());let { phaseValue } = JSON.parse(message)phaseValue.forEach((value, index, array) => {notifyPromise.value = notifyPromise.value.then(() => {ElNotification({type: 'warning',title: '警告',message: value.msg,position: 'bottom-right',offset: 10})})})console.log(`收到信息 message: ${message} from topic: ${topic}`);});}} catch (error) {console.log("mqtt.connect error:", error);}};// 订阅const link = () => {let qosValue = qos.valueclient.value.subscribe(topic.value,{ qosValue },(error, granted) => {if (error) {console.log("订阅失败 error:", error);return;}console.log("订阅成功 successfully:", granted);});};// 取消订阅const UnSubscribe = () => {let qosValue = qos.valueclient.value.unsubscribe(topic.value, { qosValue }, (error) => {if (error) {console.log("取消订阅失败 error:", error);return;}console.log(`取消订阅成功 topic: ${topic}`);});};// 取消连接const destroyConnection = () => {if (client.value.connected) {try {client.value.end(false, () => {console.log("断开连接成功 successfully");});} catch (error) {console.log("断开连接失败 error:", error);}}};//发送信息  sendMsg //发送的信息const SendMessage =(topic, sendMsg)=> {let qosValue = qos.valueclient.value.publish(this.topic, JSON.stringify(sendMsg), {qosValue }, (err, a) => {if (!err) {console.log('发送信息成功');} else {console.log('发送信息失败');}})}const retryTimes = ref(0);const handleOnReConnect = () => {retryTimes.value += 1;if (retryTimes.value > 5) {try {client.value.end();initData();console.log("connection maxReconnectTimes limit, stop retry");} catch (error) {console.log("handleOnReConnect catch error:", error);}}};const initData = () => {client.value = {connected: false,};retryTimes.value = 0;};return {startMqtt,link,UnSubscribe,destroyConnection};
}

四,项目中tcp协议的坑

项目中 后端返回给我链接地址是 tcp://101.37.163.199:1883  但是我测试半天都链接不上

最后搜索才发现 要替换成       ws://101.37.163.199:8083/mqtt 才能调试链接通

五,经典研究案例 ,大家要是上面研究差不多 或者研究半解 可以去仓库拉下代码 下载包本地运行一下这个项目(他这个是参考MQTTX客户端的一个项目 在这上面可以配置配置项 订阅并发布信息)

仓库地址 : MQTTdemo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[VUE]2-vue的基本使用

目录 vue基本使用方式 1、vue 组件 2、文本插值 3、属性绑定 4、事件绑定 5、双向绑定 6、条件渲染 7、axios 8、⭐跨域问题 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅…

气膜建筑:舒适、智能、可持续

气膜建筑之所以能够拥有广阔的发展空间,源于其融合了诸多优势特点,使其成为未来建筑领域的前沿趋势。 气膜建筑注重环境可持续性和能源效率。在材料和设计上,它采用可回收材料、提高热保温效果,并积极利用太阳能等可再生能源&…

【洛谷学习自留】p9226 糖果

解题思路: 简单的计算题,用n对k取余,如果余数为0,则输出k的值,否则输出(k-余数)的值。 代码实现: import java.util.Scanner;public class p9226 {public static void main(Strin…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于QuickRNet的TPU超分模型部署

2023 CCF 大数据与计算智能大赛 《赛题名称》 基于QuickRNet的TPU超分模型部署 巴黎欧莱雅 林松 智能应用业务部算法工程师 中信科移动 中国-北京 gpu163.com 团队简介 巴黎欧莱雅团队包含一个队长和零个队员。 队长林松,研究生学历,2019-202…

【一份老网工珍藏多年的网络配置笔记,很重要!】

01、交换机、路由器的几种配置模式及模式转换 1. 用户模式 登录到交换机(路由器)时会自动进入用户模式,提示符为 switchname>。在该模式下只能够查看相关信息, 对 IOS的运行不产生任何影响。 2. 特权模式 用户模式下&#xff…

精进单元测试技能 —— Pytest断言的艺术!

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如&#…

蒙牛×每日互动合作获评中国信通院2023“数据+”行业应用优秀案例

当前在数字营销领域,品牌广告主越来越追求品效协同。针对品牌主更注重营销转化的切实需求,数据智能上市企业每日互动(股票代码:300766)发挥自身数据和技术能力优势,为垂直行业的品牌客户提供专业的数字化营…

实时云渲染的技术原理是什么?一篇文章讲透云渲染

实时云渲染依赖互联网的连接和高性能服务集群,为客户实时提供渲染画面,它有以下几个关键技术: 1、GPU上云 利用云服务器强大的GPU替代本地GPU进行图形处理,提高性能、可替换性和扩展性。2、视频流化技术 这项技术能在远程执行用户…

【ArcGIS微课1000例】0087:经纬度格式转换(度分秒转度、度转度分秒)

ArcGIS软件可以很方便的直接实现度分秒转度、度转度分秒。 文章目录 一、转换预览二、工具介绍三、案例解析一、转换预览 借助ArcGIS快速实现度分秒与度及其他格式的坐标转换。例如:度分秒→度 度分秒: 度: 二、工具介绍 转换坐标记法:将一个或两个字段包含的坐标记法从一…

XREAL推出其新款AR眼镜:XREAL Air 2 Ultra,体量轻内置音效

这款眼镜堪称科技的杰作,它以钛合金为框架,尽显轻盈与精致。配备的双3D环境传感器,宛如双眼般敏锐,能精准捕捉头部运动,让你在虚拟与现实间自由穿梭。120Hz的超高刷新率与500尼特的亮度,让你在4米之外感受1…

搭建React开发环境-webpack实现

周末在家学会React前端知识,记录下来,方便备查。 webpack版本:webpack5 编译器:vscode 第一步、新建项目及初始化 1)新建项目文件夹 可命名为 my_webpack 2)初始化项目 使用命令 npm init -y,…

Centos7 MongoDB安装

基础配置(Centos7.5镜像,2核2GB内存,50GB硬盘) 主机名IPmongodb192.168.100.124 (在MongoDB官网有linux安装MongoDB的步骤) (1)配置yum源 [rootmongodb ~]# cat /etc/yum.repos.d…

DDIA 第十一章:流处理

本文是《数据密集型应用系统设计》(DDIA)的读书笔记,一共十二章,我已经全部阅读并且整理完毕。 采用一问一答的形式,并且用列表形式整理了原文。 笔记的内容大概是原文的 1/5 ~ 1/3,所以你如果没有很多时间…

如何修复 SQL Server 数据库中的恢复挂起状态?

当我们想与关系数据库交互时,SQL 就会出现并帮助用户与数据库进行交互。SQL 从高级语言中获取用户的输入,然后访问将代码转换为机器可理解的形式。SQL 确实会恢复数据库文件,但有时 SQL 服务器恢复暂挂阶段会进入帐户,这会停止恢复…

系统编程--VIM特辑

这里写目录标题 vim三种工作模式进入文本模式的快捷键在命令模式下进行文本编辑删除快捷键复制粘贴查找替换查找替换 vim其他操作 vim打造简易IDE vim 三种工作模式 具体可见第二章对vim的详细介绍 需要注意的是,在末行模式下执行完一次命令,就可以直接…

编写.NET的Dockerfile文件构建镜像

创建一个WebApi项目,并且创建一个Dockerfile空文件,添加以下代码,7.0代表的你项目使用的SDK的版本,构建的时候也需要选择好指定的镜像tag FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443F…

报表控件Stimulsoft 2023回顾:都做了哪些产品的改变?

在2023年过去一年中,报表控件Stimulsoft 针各类控件都做了重大改变,其中新增了某些产品、同时加强了很多产品的性能和UI设计,更加符合开发者需求,下面就跟随小编一起来回顾,具体都有哪些↓↓↓ Stimulsoft Ultimate &…

uniapp打包后图片资源会重复

hbuildx打包后文件过大,多方优化后,发现会生成重复的图片,如图: 临时解决方法: lib.zip chain-webpack.js_.zip 解压 lib.zip 替换到 HBuilderX根目录/plugins/uniapp-cli/node_modules/dcloudio/uni-cli-shared/lib…

【无标题】MySQL8修改非root用户密码

首先查看修改的用户信息,我这里用户名是demo,host是**%** 然后使用alter命令修改密码 这里USER后的参数是第一步里查询得到的user与host的组合。ALTER USER demo% IDENTIFIED WITH mysql_native_password BY 新密码;可能会出现的错误: 如果百…

DNS被劫持怎么办

DNS劫持是一种网络攻击,攻击者通过篡改DNS记录,将特定域名的解析结果指向错误的IP地址,从而实现对特定网站的访问劫持或流量劫持。这种攻击方式严重影响了用户的上网体验,并可能导致用户隐私泄露。下面也从原因、危害以及应对的策…