在vue使用MQTT

news2024/9/9 1:38:10

在vue中使用MQTT

最近有个需求,需要前端直接链接mqtt,想到后面可能多出使用,就封装成了hooks

中间遇到了一个坑,就是浏览器默认不支持mqtt协议,其借助了webSocket实现的mqtt协议,
而mqtt默认未开启webSocket官网中并说明,但其demo中都是使用的ws,最后通过不断的摸索确认是
需要在配置中进行相关配置

安装mqtt插件

pnpm add mqtt

or

npm i mqtt

or

yarn add mqtt

导入mqtt

import * as mqtt from "mqtt/dist/mqtt.min"

封装

这个封装只需要稍加改动就能在react中使用


import * as mqtt from "mqtt/dist/mqtt.min";
import {onUnmounted, reactive, ref} from "vue";

export default function useMqtt(options, getMessage) {
    const data = ref();
    const connection = reactive({
        protocol: options.host ?? 'ws',
        host: options.host ?? '81.69.203.93',
        port: options.port ?? 8083,
        clientId: options.clientId ?? "mqttx_" + Math.random().toString(16).substring(2, 8),
        username: options.username ?? 'bduser',
        password: options.password ?? '123456',
        clean: options.clean ?? true,
        connectTimeout: options.connectTimeout ?? 30 * 1000, // ms
        reconnectPeriod: options.reconnectPeriod ?? 4000 // ms
    });
    /**
     * 订阅信息设置
     */
    const subscription = ref({
        topic: options.subscription.topic, //需要动态配置
        qos: options.subscription.qos
    });
    let client = ref({
        connected: false
    });
    const receivedMessages = ref("");
    const subscribedSuccess = ref(false);
    const btnLoadingType = ref("");
    const retryTimes = ref(0);
    /**
     * 初始化
     */
    const initData = () => {
        client.value = {
            connected: false
        };
        retryTimes.value = 0;
        btnLoadingType.value = "";
        subscribedSuccess.value = false;
    };
    const handleOnReConnect = () => {
        console.log(`${retryTimes.value}次重试`);
        retryTimes.value += 1;
        if (retryTimes.value > 5) {
            try {
                client.value.end();
                initData();
            } catch (error) {
                console.error(error)
            }
        }
    };
    /**
     * 创建连接
     */
    const createConnection = () => {
        try {
            btnLoadingType.value = "connect";
            console.log('connection----->', connection)
            const {protocol, host, port, ...options} = connection;
            const connectUrl = `${protocol}://${host}:${port}/mqtt`;
            client.value = mqtt.connect(connectUrl, options);
            if (client.value.on) {
                client.value.on("connect", () => {
                    btnLoadingType.value = "";
                    console.log("------链接建立成功------");
                });
                client.value.on("reconnect", handleOnReConnect);
                client.value.on("error", (error) => {
                    console.error("------链接建立失败------", error)
                });
                client.value.on("message", (topic, message) => {
                    receivedMessages.value = receivedMessages.value.concat(message.toString());
                    data.value = JSON.parse(message);
                    if (getMessage) getMessage(message);
                    console.log("收到的数据--------------", data.value);
                });
            }
        } catch (error) {
            btnLoadingType.value = "";
            console.error("链接出错", error);
        }
    };
    /**
     * 订阅消息
     */
    const doSubscribe = () => {
        btnLoadingType.value = "subscribe";
        const {topic, qos} = subscription.value;
        console.log("订阅消息------->", `$queue${topic}`, qos);
        client.value.subscribe(`$queue${topic}`, {qos}, (error, granted) => {
            btnLoadingType.value = "";
            if (error) {
                console.log("subscribe error:", error);
                return;
            }
            subscribedSuccess.value = true;
            console.log("subscribe successfully:", granted);
        });
    };
    /**
     * 关闭连接
     */
    const destroyConnection = () => {
        if (client.value.connected) {
            btnLoadingType.value = "disconnect";
            try {
                client.value.end(false, () => {
                    initData();
                    console.log("disconnected successfully");
                });
            } catch (error) {
                btnLoadingType.value = "";
                console.log("disconnect error:", error);
            }
        }
    };
    /**
     * 发送消息
     * @param data
     */
    const publishMessage = (data) => {
        btnLoadingType.value = "publish";
        const {topic, qos} = subscription.value
        console.log(`发送消息到【${topic}】-【${qos}`)
        client.value.publish(`${topic}`, data, {qos}, (error) => {
            btnLoadingType.value = "";
            if (error) {
                console.error("消息发送失败", error);
                return;
            }
            console.log(`消息内容${data}`);
        });
    };

    /**
     * 取消订阅
     */
    const doUnSubscribe = () => {
        btnLoadingType.value = "unsubscribe";
        const {topic, qos} = subscription.value;
        console.warn("取消订阅------->", `$queue${topic}`, qos);
        client.value.unsubscribe(`$queue${topic}`, {qos}, (error) => {
            btnLoadingType.value = "";
            subscribedSuccess.value = false;
            if (error) {
                console.log("unsubscribe error:", error);
                return;
            }
            console.log(`unsubscribed topic: ${topic}`);
        });
    };
    /**
     * 创建连接并订阅
     */
    const createAndDo = () => {
        createConnection();
        doSubscribe();
    }
    // //组件销毁前断开连接
    onUnmounted(() => {
        console.log("------页面销毁前断开连接------");
        destroyConnection();
    });
    return {
        data,
        publishMessage,
        connection,
        subscription,
        doUnSubscribe,
        destroyConnection,
        createConnection,
        doSubscribe,
        createAndDo
    };
}

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

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

相关文章

vue3前端开发-小兔鲜项目-sku的实现

vue3前端开发-小兔鲜项目-sku的实现!这是一个会计学的特殊专业名词,可以理解为产品的型号,规格的货品计量单位。 它是一组数据的混合体。比如:尺寸,材料,品质,等等。组合在一起形成的一个混合数…

Java——多态(Polymorphism)

一、多态 1、什么是多态 多态(Polymorphism)是面向对象编程的三大核心特性之一(另外两个是封装和继承)。多态性允许一个接口或基类的不同实现或子类以统一的方式处理。 二、方法多态 方法的多态性主要通过方法重载&#xff08…

Git原理与用法系统总结

目录 Reference前言版本控制系统Git的诞生配置Git配置用户名和邮件配置颜色配置.gitignore文件 Git的基础用法初始化仓库克隆现有的仓库添加暂存文件提交变动到仓库比较变动查看日志Git回退Git重置暂存区 Git版本管理重新提交取消暂存撤销对文件的修改 Git分支Git分支的优势Git…

2024年中小企业为何更需要找百度竞价托管代运营公司

企业间的竞争日益激烈,网络营销已成为企业获取市场份额、提升品牌知名度的关键途径。而在众多网络营销手段中,百度竞价推广因其高效、精准的特点,成为众多企业的首选。然而,随着市场竞争的加剧和百度竞价规则的不断调整&#xff0…

值得细读的8个视觉大模型生成式预训练方法

大语言模型的进展催生出了ChatGPT这样的应用,让大家对“第四次工业革命”和“AGI”的来临有了一些期待,也作为部分原因共同造就了美股2023年的繁荣。LLM和视觉的结合也越来越多:比如把LLM作为一种通用的接口,把视觉特征序列作为文…

年化27.9%,最大回撤-13.6%的可转债因子策略,结合机器学习特征筛选(附python代码)

原创文章第603篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 我们重新更新了可转债的全量数据,包含全量已经退市的转债。 ——这是与股票市场不一样的地方,股票退市相对少,而转债本身就有退出周期。 因此&…

喝奶 (全脂 抵脂肪 脱脂 )

鲜牛奶就是全脂的. 婴儿配方奶粉, 脂肪含量就高 全脂牛奶通常口感更浓郁,适合许多人的口味偏好, 全脂牛奶含有较高的脂肪含量,这有助于提供能量和饱腹感,从而减少总体热量的摄入, 有研究指出,喝全脂牛奶的儿童超重或肥胖的风险可能比喝低脂…

80端口被system占用 ,system进程是4!!!亲测-----解决

最近需要使用nginx,发现80端口北占用 正常情况下,查看那个进程占用,然后找到对应的程序,关闭对应的就可了。 使用 netstat 命令: 打开命令提示符(以管理员身份)。输入命令 netstat -ano | fi…

昇思25天学习打卡营第18天|ResNet50 迁移学习实战:从数据准备到模型构建

目录 环境配置 加载数据集 数据集可视化 构建Resnet50网络 固定特征进行训练 训练和评估 可视化模型预测 环境配置 MindSpore 库的版本管理和数据集的下载操作。首先,它卸载了已安装的 MindSpore 版本,并重新安装指定版本(2.3.0rc1&…

帆软BI 模仿一个可视化护理软件大屏 (三百六十行 行行fine BI)

帆软BI 模仿一个可视化护理软件大屏 (三百六十行 行行fine BI) 文章目录 帆软BI 模仿一个可视化护理软件大屏 (三百六十行 行行fine BI)前言一、怎么做?二、导入数据三、编辑数据制作联合饼图四、编辑数据风险管理五、…

微短剧出海CPS分销推广影视平台系统搭建思维逻辑介绍

随着国内短剧市场的蓬勃发展,其独特的魅力与影响力已跨越国界,成为海外观众的新宠。这一趋势不仅推动了短剧内容的全球化传播,也为海外市场的CPS(按销售分润)分销模式提供了广阔舞台。连接内容创作者、平台运营者、系统…

数据结构与算法-关于堆的基本排序介绍

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、堆排序…

职场中的六条建议

在职场的征途中,我们每个人都是独一无二的行者,面对挑战与机遇并存的每一天。我们在职场中工作要弄清楚工作的本质,一定要牢记几点: 工作的本质与态度 我们工作的目的就是为了挣钱,我们不是来义务劳动也不是来参加快乐…

【Redis 初阶】Redis 常见数据类型(预备知识、String、哈希、List)

Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维非常重要,同时掌握每种数据结构的常见命令,会在使用 Redis 的时候做到游刃有余。 一、预备知识 官方文档:Commands | Docs (redis.io) 1、最核心的两个命令…

npm提示 certificate has expired 证书已过期 已解决

在用npm新建项目时,突然发现报错提示 : certificate has expired 证书已过期 了解一下,在网络通信中,HTTPS 是一种通过 SSL/TLS 加密的安全 HTTP 通信协议。证书在 HTTPS 中扮演着至关重要的角色,用于验证服务器身份并加密数据传输…

python——joblib进行缓存记忆化-对计算结果缓存

问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行,通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序,但由于数据包的特性,这一操作很占用性能和时…

动手学深度学习V2每日笔记(模型初始化和激活函数)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1u64y1i75ap2&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录,内容不会特别严谨仅供参考。 1. 模…

Linux安装与配置

下载VMware 首先我们需要下载一个叫VMware的软件: 进入官方下载,地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【 输入许可证密钥 MC60H-DWHD5-H80U9-6V85…

硬盘分区读不出来的解决之道:从自救到专业恢复

在日常的计算机使用过程中,硬盘分区读不出来的问题常常令人头疼不已。这一问题不仅阻碍了用户对数据的正常访问,还可能预示着数据安全的潜在威胁。硬盘分区读不出来,通常是由于分区表损坏、文件系统错误、物理扇区损坏、驱动程序冲突或硬件连…

流量卡对比?看看哪个运营商的流量卡更适合你?

你用过流量卡吗?在这个一机双卡的时代,大部分的朋友都是人手两张电话卡,甚至更多,其中还包括一张大流量卡,那么,你会选择流量卡吗? ​ 为了冲量和拉新用户,三大运营商都在线上推出一…