Vue整合
依賴環境
- nodejs 版本 >=
18
- 安裝
element plus
npm install element-plus
- 安裝
mqtt
npm install mqtt
初始化Vue項目
- 使用
vite
創建項目
- 執行命令
npm create vite@latest
- 輸入項目名稱
vue-mqtt-demo
MQTT連接
連接組件代碼
components/MqttDemo.vue
<script setup>
import { ref } from "vue";
import mqtt from "mqtt";// 消息質量取值數組
const qosList = [0, 1, 2];/* -------建立和關閉連接-------*/
// 定義鏈接信息對象
const connectionInfo = ref({protocol: 'ws',host: "192.168.40.128",port: 8083,clientId: "mqtt_vue_" + Math.random().toString(16).substring(2, 8),username: "admin",password: "admin123456",clean: true,connectTimeout: 10 * 1000, // 單位:msreconnectPeriod: 4000, // 單位:ms
})// 創建鏈接對象
const client = ref({})
// 鏈接初始化相關數據
const clientInitData = ref({ connnected: false
})// 建立連接事件處理函數
const createConnection = () => {const { protocol, host, port , ...options } = connectionInfo.value;const connectUrl = `${protocol}://${host}:${port}/mqtt`;console.log(connectUrl)// 建立連接client.value = mqtt.connect(connectUrl , options); clientInitData.value.connnected = true ;console.info("create connection successful...")}// 關閉連接
const closeConnection = () => {// 如果設置為true:立即關閉套接字,不發送MQTT DISCONNECT包。// 如果設置為false(默認值):先發送MQTT DISCONNECT包給代理,然后關閉套接字client.value.end(false , () => {clientInitData.value.connnected = false;console.info("close connection successful...")})
}
</script><template><div class="mqtt-demo"><el-card><h1>配置信息</h1><el-form label-position="top"><el-row :gutter="20"><el-col :span="8"><el-form-item prop="protocol" label="選擇協議"><el-select v-model="connectionInfo.protocol"><el-option label="ws://" value="ws"></el-option><el-option label="wss://" value="wss"></el-option></el-select></el-form-item></el-col><el-col :span="8"><el-form-item prop="host" label="主機地址"><el-input v-model="connectionInfo.host"></el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="port" label="端口號"><el-input type="number" placeholder="8083/8084" v-model="connectionInfo.port"></el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="clientId" label="客戶端ID"><el-input v-model="connectionInfo.clientId"> </el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="username" label="用戶名"><el-input v-model="connectionInfo.username"></el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="password" label="密碼"><el-input v-model="connectionInfo.password"></el-input></el-form-item></el-col><el-col :span="24"><el-button type="primary" @click="createConnection" v-bind:disabled="clientInitData.connnected">建立連接</el-button><el-button type="danger" @click="closeConnection" v-bind:disabled="!clientInitData.connnected">斷開連接</el-button></el-col></el-row></el-form></el-card></div>
</template><style>
.mqtt-demo {max-width: 1200px;margin: 32px auto 0 auto;
}h1 {font-size: 16px;margin-top: 0;
}.el-card {margin-bottom: 32px;
}
.el-card__body {padding: 24px;
}.el-select {width: 100%;
}.text-right {text-align: right;
}.sub-btn {margin-top: 30px;
}
</style>
首頁引入連接組件
App.vue
<template><MqttDemo />
</template><script setup>
import MqttDemo from "./components/MqttDemo.vue";</script><style></style>
運行項目
npm run dev
訪問頁面
http://localhost:5173/
建立連接
斷開連接
MQTT訂閱
訂閱相關代碼
components/MqttDemo.vue
- JS 代碼
// 消息質量取值數組
const qosList = [0, 1, 2];/* -----訂閱和取消訂閱------ */const receivedMessages = ref(null);
const subscriptionInfo = ref({// 訂閱參數數據模型topic: "",qos: 0,
});
const subscriptionInitData = ref({// 訂閱初始化數據subscription: false,
});// 訂閱主題的事件處理函數
const subscriptionTopicHandler = () => {const { topic, qos } = subscriptionInfo.value;console.info(qos);client.value.subscribe(topic, { qos }, (error, res) => {if (error) {console.info("subscribe topic error:", error);return;}subscriptionInitData.value.subscription = true;console.info("subscribe topic successful.... ");// 訂閱成功以后,監聽發送消息事件client.value.on("message", (topic, message) => {console.info("topic -----> " + topic + ", message -----> " + message);receivedMessages.value ="topic -----> " + topic + ", message -----> " + message;});});
};// 取消訂閱的事件處理函數
const unSubscriptionTopicHandler = () => {const { topic, qos } = subscriptionInfo.value;client.value.unsubscribe(topic, { qos }, (error, res) => {if (error) {console.info("unSubscriptionTopic Error:", error);return;}subscriptionInitData.value.subscription = false;console.info("unSubscriptionTopic successful.... ");});
};
- HTML 頁面
<el-card><h1>訂閱主題</h1><el-form label-position="top"><el-row :gutter="20"><el-col :span="8"><el-form-item prop="topic" label="Topic"><el-input v-model="subscriptionInfo.topic"></el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="qos" label="QoS"><el-select v-model="subscriptionInfo.qos"><el-optionv-for="qos in qosList":key="qos":label="qos":value="qos"></el-option></el-select></el-form-item></el-col><el-col :span="8"><el-button type="primary" class="sub-btn" @click="subscriptionTopicHandler"v-bind:disabled="subscriptionInitData.subscription">訂閱主題</el-button><el-button type="primary" class="sub-btn" @click="unSubscriptionTopicHandler"v-bind:disabled="!subscriptionInitData.subscription">取消訂閱</el-button></el-col></el-row></el-form></el-card><el-card><h1>接收到的消息</h1><el-col :span="24"><el-input type="textarea" :rows="3" readonly v-model="receivedMessages"></el-input></el-col></el-card>
運行訪問
訂閱主題
取消訂閱
MQTT 發布
發布相關代碼
- JS 代碼
/* ----- 發布消息 ----- */
// 定義發布消息對象
const publishInfo = ref({topic: '' ,qos: 0,payLoad: ''
})// 發布消息的事件處理函數
const publishMsg = () => {const {topic , payLoad , qos } = publishInfo.value ;client.value.publish(topic , payLoad , { qos } , (error , res) => {if(error) {console.info("publish msg info error...." , error)return ;}console.info("publish msg info successful....")}) ;}
- HTML 代碼
<el-card><h1>發布消息</h1><el-form label-position="top"><el-row :gutter="20"><el-col :span="8"><el-form-item prop="topic" label="Topic"><el-input v-model="publishInfo.topic"></el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="payload" label="Payload"><el-input v-model="publishInfo.payLoad"></el-input></el-form-item></el-col><el-col :span="8"><el-form-item prop="qos" label="QoS"><el-select v-model="publishInfo.qos"><el-optionv-for="qos in qosList":key="qos":label="qos":value="qos"></el-option></el-select></el-form-item></el-col></el-row></el-form><el-col :span="24" class="text-right"><el-button type="primary" @click="publishMsg">發布消息</el-button></el-col></el-card>
運行訪問
訂閱主題 test
發送接收消息
點擊發送后,接收消息框立馬收到發布的消息