使用Vue连接Mqtt实现主题的订阅及消息发布

news2024/10/5 18:32:41

效果如下:
在这里插入图片描述
直接贴代码,本地创建一个html文件将以下内容贴入即可

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MQTT 客户端</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
	<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
        }
        h2 {
            margin-top: 20px;
        }
        form, .controls {
            margin-bottom: 20px;
        }
        .button {
            padding: 10px 20px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .button:disabled {
            background-color: #ccc;
            cursor: not-allowed;
        }
        .message-area {
            width: 100%;
            height: 300px;
            resize: none;
        }
    </style>
</head>
<body>
    <div id="app">
        <h2>MQTT服务器设置</h2>
        <form>
            <div class="controls">
                <label for="host">服务器地址:</label>
                <input type="text" v-model="host" id="host" placeholder="ws://broker.emqx.io">
                <label for="port">服务器端口:</label>
                <input type="text" v-model="port" id="port" placeholder="8083">
            </div>
            <div class="controls">
                <label for="path">服务器路径:</label>
                <input type="text" v-model="path" id="path" placeholder="/mqtt">
                <label for="clientID">客户端ID:</label>
                <input type="text" v-model="clientID" id="clientID" placeholder="随机生成">
            </div>
            <div class="controls">
                <label for="user">用户名:</label>
                <input type="text" v-model="user" id="user" placeholder="test">
                <label for="password">密码:</label>
                <input type="text" v-model="password" id="password" placeholder="123">
            </div>
        </form>
        <button class="button" @click="connectMQTT" :disabled="connected">连接</button>
        <button class="button" @click="connectEND" :disabled="!connected">已断开</button>

        <h2>MQTT订阅</h2>
        <div class="controls">
            <label for="subtopic">主题:</label>
            <input type="text" v-model="subtopic" id="subtopic" placeholder="test">
        </div>
        <button class="button" @click="subscribe_topic">订阅</button>

        <h2>MQTT消息发送</h2>
        <div class="controls">
            <label for="topic">主题:</label>
            <input type="text" v-model="topic" id="topic" placeholder="test">
            <label for="message">消息:</label>
            <input type="text" v-model="message" id="message" placeholder="test">
        </div>
        <button class="button" @click="sendMessage">发送</button>

        <h1>消息框</h1>
        <textarea class="message-area" id="messageTextArea" v-model="messageText" readonly></textarea>
    </div>

    <script>
        new Vue({
            el: '#app',
            data: {
                host: '',
                port: '8083',
                path: '/mqtt',
                clientID: '',
                user: 'test',
                password: 'test',
                connected: false,
                subtopic: 'test',
                topic: 'test',
                message: 'test',
                messageText: ''
            },
            methods: {
                connectMQTT() {
                    var url = this.host + ':' + this.port + this.path;
                    var options = {
                        clientId: this.clientID || this.randomID(),
                        username: this.user,
                        password: this.password
                    };
                    this.client = mqtt.connect(url, options);
                    this.client.on('connect', () => {
                        this.connected = true;
                        this.client.on('message', this.message_str);
                        this.messageText += '已连接\n';
                    });
                    this.client.stream.on('error', (err) => {
                        console.error('Connection error:', err);
                        this.connectEND();
                    });
                },
                connectEND() {
                    if (this.client && this.client.connected) {
                        this.client.end();
                        this.connected = false;
                        this.messageText += '已断开\n';
                    }
                },
                sendMessage() {
                    if (this.client && this.client.connected) {
                        this.client.publish(this.topic, this.message);
                        this.messageText += '已发送\n';
                    }
                },
                subscribe_topic() {
                    if (this.client && this.client.connected) {
                        this.client.subscribe(this.subtopic);
                        this.messageText += '已订阅' + this.subtopic + '\n';
                    }
                },
                message_str(topic, message) {
                    this.messageText += '收到来自主题:' + topic + '的消息:' + message.toString() + '\n';
                },
                randomID() {
                    return 'clientID_' + Math.random().toString(16).substr(2, 8);
                }
            }
        });
    </script>
</body>
</html>

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

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

相关文章

基于Linux中的 进程相关知识 综合讲解

目录 一、进程的基本概念 二、pid&#xff0c;ppid&#xff0c;fork函数 三、进程的状态讲解 四、进程的优先级 五、完结撒❀ 一、进程的基本概念 概念&#xff1a; ● 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 ● 内核观点&#xff1a;担当…

SSM【Spring SpringMVC Mybatis】——Mybatis

目录 1、初识Mybatis 1.1Mybatis简介 1.2 官网地址 2、搭建Mybatis框架 2.1 准备 2.2 搭建Mybatis框架步骤 1. 导入jar包 2. 编写核心配置文件【mybatis-config.xml】 3. 书写相关接口及映射文件 4. 测试【SqlSession】 2.3 添加Log4j日志框架 导入jar包 编写配置文…

CTF关于反序列化练习随笔记录

反序列化 php魔术方法 1、get、set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 get&#xff08; $property &#xff09; 当调用一个未定义的属性时访问此方法 set&#xff08; $property&#xff0c; $value &#xff09; 给一个未定义的属性赋值时调用 这里的…

华为eNSP中型企业局域网网络规划设计(上)

敲半天一个闪退全™给我干没了呜呜呜&#xff0c;eNSP&#xff0c;wcnm&#xff01;wcnm&#xff01;wcnm&#xff01; →b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;下&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩←…

带EXCEL附件邮件发送相关代码

1.查看生成的邮件 2.1 非面向对象的方式&#xff08;demo直接copy即可&#xff09; ​ REPORT Z12. DATA: IT_DOCUMENT_DATA TYPE SODOCCHGI1,IT_CONTENT_TEXT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,IT_PACKING_LIST TYPE TABLE OF SOPCKLSTI1 WITH HEADER LIN…

ansible------inventory 主机清单

目录 inventory 中的变量 2&#xff09;组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量&#xff0c;所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

数据湖与数据网格:引领组织数据策略的未来

十多年来&#xff0c;组织已经采用数据湖来克服数据仓库的技术限制&#xff0c;并发展成为更加以数据为中心的实体。虽然许多组织已经使用数据湖来探索新的数据用例并改进其数据驱动的方法&#xff0c;但其他组织发现所承诺的好处很难实现。因此&#xff0c;许多数据湖计划的有…

文件下载出现 IOExpcetion: closed

异常原因截图 : 异常代码位置 : 出现的原因是 使用 try-with-resources, downloadFile 方法执行完毕, 文件流被关闭了...导致前面读取文件字节, 异常提示已经关闭... try (Response response OkHttpUtils.getInstance().client.newCall(new Request.Builder().url(fileUrl)…

Etcd集群选举细节

日志级别 在 etcd 集群中&#xff0c;领导者选举是 Raft 协议的一部分&#xff0c;用于在当前领导者失败或无法与集群中的其他节点通信时选出新的领导者。以下是您提供的日志中与领导者选举相关的一些关键条目&#xff0c;以及对它们的详细说明&#xff1a; 节点失去领导者&am…

python分析预测退休后养老金金额

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.总结 一.前言 养老金,也称为退休金或退休费,是一种主要的社会养老保险待遇。它旨在保障职工退休后的基本生活需要,根据劳动者对社会所作的贡献和所具备的享受养老保险资格或退休条件,按月或一次…

电脑屏幕监控软件有哪些?8款受欢迎的电脑屏幕监控软件

电脑屏幕监控软件有哪些&#xff1f;8款受欢迎的电脑屏幕监控软件 市场上有很多监控软件&#xff0c;因为太多&#xff0c;很多老板不知道怎么选&#xff0c;今天小编从它们各自的特点、优势、未来发展趋势几方面&#xff0c;介绍8款受欢迎的电脑屏幕监控软件。 第一是&#x…

【优选算法】——Leetcode——611. 有效三角形的个数

目录 ​编辑 1.题目 2 .补充知识 3.解法⼀&#xff08;暴⼒求解&#xff09;&#xff08;可能会超时&#xff09;&#xff1a; 算法思路&#xff1a; 算法代码&#xff1a; 4.解法⼆&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 以输入: nums …

还有谁不想薅云渲染的羊毛?五种云渲染优惠知道就是省到

不管你是效果图设计师还是动画设计师&#xff0c;在面对紧急或大量的渲染任务时&#xff0c;总会有云渲染的需要。然而&#xff0c;现在的云渲染越来越贵&#xff0c;我们该如何尽可能地节约成本完成渲染任务呢&#xff1f;本文将为你介绍云渲染的五种优惠形式&#xff0c;看完…

Compose 生命周期和副作用

文章目录 Compose 生命周期和副作用生命周期副作用APIDisposableEffectSIdeEffectLaunchedEffectrememberCoroutineScoperememberUpdatedStatesnapshotFlowproduceStatederivedStateOf Compose 生命周期和副作用 生命周期 OnActive&#xff1a;添加到视图树。即Composable被首…

传闻不断!TCL紧急澄清 | 百能云芯

TCL科技5月7日晚间发布澄清公告称&#xff0c;近日关注到有媒体发布《TCL华星年内投630亿元加入8代oled线竞逐&#xff01;》《TCL华星计划年内投资第八代OLED》等相关报道。公司目前无新建8代或8.6代OLED产线的投资计划&#xff0c;公司不存在通过定增募集资金新建显示产线的计…

期权和期货有什么区别?

今天期权懂带你了解期权和期货有什么区别&#xff1f;期权和期货是两种常见的衍生金融工具&#xff0c;它们在结构和盈利方式上存在一些关键的区别&#xff1a; 期权 期权是一种给予持有者在未来某个时间以特定价格买入或卖出基础资产的权利&#xff0c;但不是义务。期权的主要…

直播报名 | 珈和科技携手潍柴雷沃共探“现代农场”未来式

数据赋农季系列直播第四期&#xff0c;我们将以“未来农业发展趋势之农场智慧化、管理数据化”为主题展开&#xff0c;此次系列直播由珈和科技及湖北珞珈实验室共同主办&#xff0c;第四期直播很荣幸邀请到潍柴雷沃参与其中&#xff0c;双方将就智慧农服平台和数据交易SaaS平台…

C#里如何设置输出路径,不要net7.0-windows

官网介绍&#xff1a; 更改生成输出目录 - Visual Studio (Windows) | Microsoft Learn <PropertyGroup> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendRuntimeIdentifierToOutputPath>false</Appen…

RabbitMQ基础入门

初识MQ 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能跟多个人同…

Python自动化下载指定公开页面文件

示例代码如下&#xff0c;但你拿到本地之需要做两件事才能运行 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time# 设置Se…