Vue3連接MQTT作為客戶端

先下載依賴

npx --yes --registry https://registry.npmmirror.com npm install mqtt

在src的api創建? ?mes.js

// 導入axios
import axios from 'axios';// 定義一個變量,記錄公共的前綴, baseURL
const baseURL = 'http://localhost:8080';
const instance = axios.create({ baseURL });// 添加響應攔截器
instance.interceptors.response.use((response) => {return response.data; // 直接返回響應的數據部分},(error) => {alert('服務異常');return Promise.reject(error); // 異步的狀態轉化成失敗的狀態}
);// 定義 meslist 函數,使用定制的 Axios 實例發送請求
export const meslist = async (topic) => {try {const response = await instance.get('/getmes', {params: {topic: topic}});return response; // 返回整個響應對象,因為攔截器已經提取了 data 部分} catch (error) {console.error('API 請求失敗:', error);throw error;}
};export default instance;

創建一個vue文件,然后填自己的ip,如果設置了用戶名密碼也填上

<script setup>
import { ref, onMounted, onUnmounted, watch } from 'vue';
import { ElMessage, ElButton, ElInput, ElTable, ElTableColumn } from 'element-plus';
import mqtt from 'mqtt'; // 導入 mqtt,默認導出的是客戶端工廠函數
import { meslist } from '@/api/mes'; // 引入 meslist API// 響應式變量
const SelectTopic = ref(''); // 可以動態修改的選擇項(如輸入框內容)
const results = ref([]);     // 用來存儲搜索結果
const loading = ref(false);  // 用于控制加載狀態
const error = ref(null);     // 用于顯示錯誤信息給用戶
let client;// 搜索函數
const search = async () => {if (!SelectTopic.value.trim()) {ElMessage.warning("請輸入有效的搜索內容");return;}loading.value = true; // 開始加載error.value = null;   // 清除之前的錯誤信息try {const response = await meslist(SelectTopic.value);console.log('API Response:', response); // 輸出原始響應以便調試// 如果是數組,則按照新邏輯處理if (Array.isArray(response)) {if (response.length > 0) {results.value = response;console.log('搜索成功:', results.value);} else {ElMessage.info('未找到相關結果');results.value = [];}} // 如果都不是,則拋出異常else {throw new Error('API 返回的數據格式不正確');}} catch (err) {// 更詳細的錯誤信息記錄console.error('搜索失敗:', err);ElMessage.error('搜索失敗,請稍后重試或檢查網絡連接');results.value = [];} finally {loading.value = false; // 搜索完成,結束加載狀態}
};// MQTT 連接配置
const connectMqtt = () => {const brokerUrl = 'ws://ip/mqtt'; // 使用提供的主機名、端口和路徑const clientId = 'emqx_MTgwND'; // 客戶端 IDconst options = {username: 'web', // 替換為實際的用戶名~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~password: '123',   // 替換為實際的密碼~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~keepalive: 60,          // Keepalive 時間clean: true,            // Clean StartsessionExpiryInterval: 0, // 會話過期時間protocolVersion: 5,     // 協議版本 MQTT 5};client = mqtt.connect(brokerUrl, options);client.on('connect', () => {console.log('Connected to MQTT broker');if (SelectTopic.value.trim()) {client.subscribe(SelectTopic.value, (err) => {if (err) {console.error('Failed to subscribe:', err);} else {console.log('Subscribed to topic:', SelectTopic.value);}});}});client.on('message', (topic, message) => {console.log('Received message:', topic, message.toString()); // 調試信息try {const msg = JSON.parse(message.toString());// 更新結果列表results.value = [...results.value, {id: msg.id || 0,topic: topic,payload: msg.payload || message.toString(),qos: msg.qos || 0,timestamp: new Date().toLocaleString()}];} catch (e) {console.error('Failed to parse message:', e);// 如果解析失敗,直接將原始消息作為字符串處理results.value = [...results.value, {id: -1,topic: topic,payload: message.toString(),qos: 0,timestamp: new Date().toLocaleString()}];}});client.on('error', (err) => {console.error('MQTT connection error:', err);});client.on('close', () => {console.log('MQTT connection closed');});
};// 斷開 MQTT 連接
const disconnectMqtt = () => {if (client) {client.end();client = null;}
};// 監聽 SelectTopic 的變化
watch(SelectTopic, (newVal) => {if (newVal.trim()) {disconnectMqtt();connectMqtt();} else {disconnectMqtt();}
});// 在組件掛載時啟動 MQTT 連接
onMounted(() => {if (SelectTopic.value.trim()) {connectMqtt();}
});// 在組件卸載時斷開 MQTT 連接
onUnmounted(() => {disconnectMqtt();
});
</script><template><div class="container"><h1 class="title">歷史數據查看</h1><div class="input-container"><el-inputv-model="SelectTopic"placeholder="請輸入搜索內容"size="large"clearableclass="input-box"/></div><div class="button-container"><el-buttontype="primary"@click="search":loading="loading"class="search-button">{{ loading ? "加載中..." : "搜索" }}</el-button></div><!-- 搜索結果表格 --><el-table v-if="results.length > 0" :data="results" style="width: 100%" border><el-table-column prop="id" label="ID" width="100"></el-table-column><el-table-column prop="qos" label="QoS" width="100"></el-table-column><el-table-column prop="payload" label="Payload"></el-table-column><el-table-column prop="timestamp" label="Timestamp" width="200"><template #default="scope">{{ scope.row.timestamp }}</template></el-table-column></el-table><!-- 如果沒有數據或錯誤時的提示 --><div v-else-if="!loading && SelectTopic.trim()"><p class="error-message">{{ error || '沒有找到相關結果' }}</p></div><div v-else-if="!loading"><p class="placeholder-message">請輸入搜索內容</p></div></div>
</template><style scoped>
/* 設置容器樣式 */
.container {padding: 40px;max-width: 1000px;margin: 0 auto;background-color: #f7f7f7;border-radius: 8px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}/* 標題樣式 */
.title {font-size: 28px;font-weight: bold;color: #333;text-align: center;margin-bottom: 30px;
}/* 輸入框容器樣式 */
.input-container {display: flex;justify-content: center;margin-bottom: 20px;
}/* 輸入框樣式 */
.input-box {width: 50%;font-size: 16px;
}/* 按鈕容器樣式 */
.button-container {display: flex;justify-content: center;margin-bottom: 20px;
}/* 按鈕樣式 */
.search-button {width: 200px;height: 40px;font-size: 16px;
}/* 錯誤消息樣式 */
.error-message {color: red;text-align: center;font-size: 16px;
}/* 占位符消息樣式 */
.placeholder-message {text-align: center;font-size: 16px;color: #888;
}
</style>

在輸入框輸入,就可以訂閱相應的主題了,然后其他客戶端發送此主題的內容,就可以訂閱接收到了。因為我的代碼里面還有給后端發請求的部分,所以相關后端接口需要你們自己完成或者把這部分的代碼刪掉。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75385.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

主服務器和子服務器之間通過NFS實現文件夾共享

背景&#xff1a; 子服務器想做一個備份服務器 但是之前有很多文件是上傳到本地的&#xff0c;于是服務要從本地讀取文件 但是在不在同一臺服務器中&#xff0c;讀取就會有問題&#xff0c;想 實現在兩者之間創建一個共享文件夾 一 NFS掛載步驟&#xff1a; 在主服務器&#…

LeetCode算法題(Go語言實現)_39

題目 給定一個二叉樹的根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 一、代碼實現 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func rightSideView(root *TreeNode) []int {i…

【AI提示詞】長期主義助手提供規劃支持

提示說明 長期主義是一種關注長期利益和持續學習的思維模式&#xff0c;幫助個人和組織在快速變化的環境中保持耐心和系統性思考。 提示詞 # Role: Long-termist Assistant## Profile - language: 中文 - description: 長期主義是一種關注長期利益和持續學習的思維模式&…

數組 array

1、數組定義 是一種用于存儲多個相同類型數據的存儲模型。 2、數組格式 &#xff08;1&#xff09;數據類型[ ] 變量名&#xff08;比較常見這種格式&#xff09; 例如&#xff1a; int [ ] arr0&#xff0c;定義了一個int類型的數組&#xff0c;數組名是arr0&#xff1b; &am…

基于JavaAPIforKml實現Kml 2.2版本的全量解析實踐-以兩步路網站為例

目錄 前言 一、關于兩步路網站 1、相關功能 2、數據結構介紹 二、JAK的集成與實現 1、JAK類圖簡介 2、解析最外層數據 3、解析擴展元數據和樣式 4、遞歸循環解析Feature 5、解析具體的數據 三、結論 前言 隨著地理信息技術的快速發展&#xff0c;地理空間數據的共享…

腦科學與人工智能的交叉:未來智能科技的前沿與機遇

引言 隨著科技的迅猛發展&#xff0c;腦科學與人工智能&#xff08;AI&#xff09;這兩個看似獨立的領域正在發生深刻的交匯。腦機接口、神經網絡模型、智能機器人等前沿技術&#xff0c;正帶來一場跨學科的革命。這種結合不僅推動了科技進步&#xff0c;也在醫療、教育、娛樂等…

3.1.3.2 Spring Boot使用Servlet組件

在Spring Boot應用中使用Servlet組件&#xff0c;可以通過注解和配置類兩種方式注冊Servlet。首先&#xff0c;通過WebServlet注解直接在Servlet類上定義URL模式&#xff0c;Spring Boot會自動注冊該Servlet。其次&#xff0c;通過創建配置類&#xff0c;使用ServletRegistrati…

《AI大模型應知應會100篇》第10篇:大模型的涌現能力:為什么規模如此重要

第10篇&#xff1a;大模型的涌現能力&#xff1a;為什么規模如此重要 摘要 在人工智能領域&#xff0c;“規模"始終是大模型發展的核心關鍵詞。隨著參數量從百萬級躍升至萬億級&#xff0c;大模型展現出令人驚嘆的"涌現能力”&#xff1a;這些能力在小模型中幾乎不可…

安寶特案例 | Fundació Puigvert 醫院應用AR技術開創尿石癥治療新紀元

案例介紹 在醫療科技不斷進步的今天&#xff0c;Fundaci Puigvert 醫院邁出了重要一步&#xff0c;成功應用AR技術進行了全球首例同時使用兩臺內窺鏡的ECIRS手術&#xff08;內鏡腎內聯合手術&#xff09;&#xff0c;由Esteban Emiliani M.D. PhD F.E.B.U 博士主刀。這標志著…

從數據海洋中“淘金”——數據挖掘的魔法與實踐

從數據海洋中“淘金”——數據挖掘的魔法與實踐 在這個數據飛速膨脹的時代&#xff0c;每天產生的數據量可以用“天文數字”來形容。如果將數據比作金礦&#xff0c;那么數據挖掘&#xff08;Data Mining&#xff09;就是在數據的海洋中挖掘黃金的技術。作為一門結合統計學、機…

kotlin的takeIf使用

takeIf用于判斷指定對象是否滿足條件&#xff0c;滿足就返回該對象自身&#xff0c;不滿足返回null。因為可以返回對象自身&#xff0c;所以可以用作鏈式調用&#xff0c;以簡化代碼&#xff0c;又因takeIf可能返回空&#xff0c;所以常常和let結合使用&#xff0c;示例如下&am…

[定位器]晶藝LA1823,4.5V~100V, 3.5A,替換MP9487,MP9486A,啟燁科技

Features ? 4.5V to 100V Wide Input Range ? 3.5A Typical Peak Current Limit ? Integrated 500mΩ low resistance high side power MOS. ? Constant On Time Control with Constant Switching Frequency. ? 180μA Low Quiescent Current ? 150kHz/240kHz/420kHz Swi…

火山RTC 4 音視頻引擎 IRTCVideo,及 音視頻引擎事件回調接口 IRTCVideoEventHandler

一、IRTCVideo、IRTCVideoEventHandler 音視頻引擎 IRTCVideo&#xff0c;及 音視頻引擎事件回調接口 IRTCVideoEventHandler 負責音視頻管理、創建房間/獲得房間實例 1、創建引擎、及事件回調示例 如&#xff1a; void VideoConfigWidget::initRTCVideo() {m_handler.res…

前端獲取不到后端新加的字段 解決方案

前端獲取不到后端新加的字段 解決方案 sql 返回的是 FileInfo 對象 private String lastUpdateTimeStr;// 自定義 setLastUpdateTime 方法&#xff0c;確保在設置 lastUpdateTime 時自動格式化為字符串public void setLastUpdateTime(LocalDateTime lastUpdateTime) {this.las…

30天學Java第九天——線程

并行與并發的區別 并行是多核 CPU 上的多任務處理&#xff0c;多個任務在同一時間真正的同時執行并發是單核 CPU 上的多任務處理&#xff0c;多個任務在同一時間段內交替執行&#xff0c;通過時間片輪轉實現交替執行&#xff0c;用于解決 IO 密集型任務的瓶頸 線程的創建方式…

論壇系統(測試報告)

文章目錄 一、項目介紹二、設計測試用例三、自動化測試用例的部分展示用戶名或密碼錯誤登錄成功編輯自己的帖子成功修改個人信息成功回復帖子信息成功 四、性能測試總結 一、項目介紹 本平臺是用Java開發&#xff0c;基于SpringBoot、SpringMVC、MyBatis框架搭建的小型論壇系統…

智膳優選 | AI賦能的智慧食堂管理專家 —— 基于飛書多維表格和扣子(Coze)的智能解決方案

智膳優選 | AI賦能的智慧食堂管理專家 基于飛書多維表格和扣子&#xff08;Coze&#xff09;的智能解決方案 數據驅動餐飲管理&#xff0c;讓每一餐都是營養與經濟的完美平衡&#xff01; “智膳優選”通過整合飛書與Coze&#xff0c;將數據智能引入校園餐飲管理&#xff0…

練習(含指針數組與數組指針的學習)

數組指針是一個指向數組的指針&#xff0c;而指針數組是一個存儲指針的數組。 ?數組指針?&#xff1a;是一個指針&#xff0c;指向一個數組的首地址&#xff0c;它用于指向整個數組&#xff0c;而不是數組中的某個元素。例如&#xff0c;int (*p)表示 p 是一個指向包含 5 個整…

NSS#Round30 Web

小桃的PHP挑戰 <?php include jeer.php; highlight_file(__FILE__); error_reporting(0); $A 0; $B 0; $C 0;//第一關 if (isset($_GET[one])){$str $_GET[str] ?? 0;$add substr($str, 0, 1); $add;if (strlen($add) > 1 ) {$A 1;} else {echo $one; } } else…

MCP基礎學習二:MCP服務搭建與配置

文章目錄 MCP服務搭建與配置一&#xff0c;學習目標&#xff1a;二&#xff0c;學習內容&#xff1a;1. 如何搭建MCP服務端服務端初始化與配置MCP服務架構與數據流交互圖核心實現注冊服務功能服務器啟動與API暴露 2. 本地應用與MCP服務的集成客戶端SDK實現客戶端應用實現功能演…