使用MQTTX和前端vue进行通讯

news/2024/7/2 23:12:46

需求:根据后端给的接口,前端实现消息订阅和消息加密连接操作,不走后端直接和硬件设备进行操作

1.下载mqttx

官网链接:MQTTX: Your All-in-one MQTT Client Toolbox

根据自己电脑选择不同的操作系统,默认下载后是英文的

 英文版改为中文

 2.根据后端提供链接地址进行连接

高级的部分都别动,连接编辑好后点击右上角就可以连接了

 添加订阅的主题名称,如果是测试的话可以随便输入,比如/test

Qos是决定消息质量,Qos:0,是发送端只发送一次,不管服务端收到没,1是至少发送一次,反正服务端一定能收到 1次,有可能收到2次以上,2保证服务端收到且只收到一次,值越大质量越高,qos越小,网络带宽越低。耗能越低

 

 2.前端mqtt连接,并且进行加密操作

这边的加密操作,其实也就是不能让连接地址暴露在浏览器的控制台里,所以我直接把加密的连接地址进行解密的操作再做链接。其实这个方法就应该要后端把加密的连接通过接口的形式给前端,前端再进行解密,这样就安全些。

下载mqtt和crypto-js

npm install mqtt crypto-js -S

加密代码


文本加密
var ciphertext = CryptoJS.AES.encrypt('连接地址', 'secret key 123').toString();

vue完整代码如下

<!--
 * @Descripttion: 在Vue项目中使用mqtt
 * @version: 
 * @Author: 叫我欧皇大人
 * @email: 13071200550@163.com
 * @Date: 2023-07-10 
-->

<template>
    <div class="content-box">
        <div class="container">
            <div class="chatroomBox">
                {{ dataChart }}
                <el-row :gutter="20">
                    <el-col :span="12"><el-input v-model="message" placeholder="请输入内容"></el-input></el-col>
                    <el-col :span="12"> <el-button @click="mqttPublish" type="success" round>发送消息</el-button></el-col>
                </el-row>
            </div>
        </div>
    </div>
</template>
<script>
import mqtt from 'mqtt';
import CryptoJS from 'crypto-js';
var client;

// 连接设置
let options = {
    clean: true, // 保留会话
    connectTimeout: 4000, // 超时时间
    reconnectPeriod: 1000, // 重连时间间隔
    // 认证信息
    clientId: 'mqtitId-Home',
    username: 'root3',
    password: '123456'
};
var bytes = CryptoJS.AES.decrypt('加密后连接地址进行解密', 'secret key 123');
var connectUrl = bytes.toString(CryptoJS.enc.Utf8);
// 创建客户端
client = mqtt.connect(connectUrl, options);
export default {
    data() {
        return {
            message: '',
            dataChart: null,
            logs: [],
            connection: {
                host: '120.55.60.217',
                port: 1883,
                // endpoint: '/mqtt',
                clean: true, // 保留会话
                connectTimeout: 4000, // 超时时间
                reconnectPeriod: 4000, // 重连时间间隔
                // 认证信息
                clientId: 'mqttx_a16dc275',
                username: 'root3',
                password: '123456'
            }
        };
    },
    mounted() {
        this.connectMQTT();
        //   this.mqttReceive();
    },
    watch: {
        textareaMsg: function(newValue, oldValue) {
            console.log(newValue, oldValue, 'watch侦听到的数据');
            return newValue;
        }
    },
    methods: {
        /**
         * @name:初始化mqtt
         * @msg:
         * @param {*}
         * @return {*}
         */
        connectMQTT() {
            if (client.connected) {
                client.end();
            }
            // mqtt连接
            client.on('connect', e => {
                console.log('连接成功:');
                client.subscribe(['/test', 'test2'], error => {
                    if (!error) {
                        console.log('订阅成功');
                    } else {
                        console.log('订阅失败');
                    }
                });
            });
            // 接收消息处理
            client.on('message', (topic, message) => {
                console.log('收到来自', topic, '的消息', message.toString());
                console.log('message: ', JSON.parse(message.toString()));
                this.dataChart = JSON.parse(message.toString());
            });
            // 断开发起重连
            client.on('reconnect', error => {
                console.log('正在重连:', error);
            });
            // 链接异常处理
            client.on('error', error => {
                console.log('连接失败:', error);
            });
        },
        /**
         * @name:发布mqtt消息
         * @msg:
         * @param {*}
         * @return {*}
         */
        mqttPublish() {
            let topic = '/test'; //和后台约定好的主题
            client.publish(topic, JSON.stringify(this.message));
        }
    },
    beforeDestroy() {
        if (this.client) {
            this.client.end();
        }
    }
};
</script>

<style scoped lang="less">
.chatroomBox {
    width: 800px;
    height: 500px;
}
/deep/.el-textarea__inner {
    height: 200px;
}
</style>

3.效果

 文章到此结束,希望对你有所帮助,有不懂的可以在评论区或者私信我~


http://lihuaxi.xjx100.cn/news/1344019.html

相关文章

【深度学习笔记】训练 / 验证 / 测试集

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

键盘控制鼠标移动

记录一下&#xff0c; windows用autohotkeys ^up::MouseMove,0,-75,0,r ^up::MouseMove,0,-15,0,r ^down::MouseMove,0,75,0,r ^down::MouseMove,0,15,0,r ^left::mousemove,-75,0,0,r ^left::mousemove,-15,0,0,r ^right::mousemove,75,0,0,r ^right::mousemove,15,0,0,r ^s…

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88050234

解决meta quest2时间对不上问题

解决meta quest2时间对不上问题&#xff0c;与标准时间相差大于1min 最近游玩quest2时发现时间对不上导致一系列问题&#xff0c;遂搜索解决方案 步骤如下 使用sidequest &#xff0c;如果还没下可以到sidequest官网下载电脑版本 点此进入官网https://sidequestvr.com/使用us…

explain 是干嘛的

explain 是干嘛的 1.explain的作用 在MySQL中&#xff0c;EXPLAIN是一个用于查询优化的关键字。它可以用于分析查询语句的执行计划&#xff0c;帮助开发人员和数据库管理员理解查询的执行方式、查询涉及的表和索引、连接类型、查询优化器的决策等信息。 通过使用EXPLAIN关键…

fastapi初使用,构建自己的api

文章目录 1、安装2、api实现2.1、 app.get("/1")2.2、app.get("/{a}")2.3、app.get("/{a}{b}")2.4、函数和api分离 3、运行 原文链接&#xff1a;https://wangguo.site/posts/d98bb3c9.html fastapi 是一个基于 Python 的 API 构建框架&#xff…

青岛大学_王卓老师【数据结构与算法】Week05_12_队列的类型定义_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

Linux系统编程(守护进程)

文章目录 前言一、守护进程概念二、空洞文件三、创建守护进程总结 前言 本篇文章我们来讲解守护进程&#xff0c;守护进程在进程中是一个比较重要的概念&#xff0c;在笔试面试中也经常考到&#xff0c;这篇文章就带大家来学习一下什么是守护进程。 一、守护进程概念 守护进…