vue3中如何使用mqtt數(shù)據(jù)傳輸
使用版本
"mqtt": "^5.8.0",
安裝指令
npm install mqtt --save ------ yarn add mqtt
配置
connection: { protocol: "ws", host: "broker.emqx.io", port: 8083, endpoint: "/mqtt", clean: true, connectTimeout: 30 * 1000, // ms reconnectPeriod: 4000, // ms clientId: "emqx_vue_" + Math.random().toString(16).substring(2, 8), // 隨機(jī)數(shù) 每次不能重復(fù) username: "emqx_test", password: "emqx_test", },
連接
import mqtt from "mqtt"; let client = {} client = mqtt.connect(url, options) client.on('connect', (e) => { // 訂閱主題 })
訂閱主題
client.subscribe(topic, { qos: 1 }, (err) => { if (!err) { console.log('訂閱成功') } else { console.log('消息訂閱失??!') } })
消息發(fā)布
給后端發(fā)送格式,是和后端約定好的數(shù)據(jù)格式,一般為JSON傳輸。
client.publish(publishTopic, `{"messageType":1,"messageContent":""}`, { qos: 0 }, (err) => { if (!err) { console.log('發(fā)送成功') client.subscribe(topic, { qos: 1 }, (err) => { if (!err) { console.log('訂閱成功') } else { console.log('消息訂閱失??!') } }) } else { console.log('消息發(fā)送失?。?) } })
取消訂閱
client.unsubscribe(topicList, (error) => { console.log('主題為' + topicList + '取消訂閱成功', error) })
斷開連接
export function unconnect() { client.end() client = null // Message.warning('服務(wù)器已斷開連接!') console.log('服務(wù)器已斷開連接!') }
mqtt封裝使用(ts版)
import type { IClientOptions, MqttClient } from 'mqtt'; import mqtt from 'mqtt'; interface ClientOptions extends IClientOptions { clientId: string; } interface SubscribeOptions { topic: string; callback: (topic: string, message: string) => void; subscribeOption?: mqtt.IClientSubscribeOptions; } interface PublishOptions { topic: string; message: string; } class Mqtt { private static instance: Mqtt; private client: MqttClient | undefined; private subscribeMembers: Record<string, ((topic: string, message: string) => void) | undefined> = {}; private pendingSubscriptions: SubscribeOptions[] = []; private pendingPublications: PublishOptions[] = []; private isConnected: boolean = false; private constructor(url?: string) { if (url) { this.connect(url); } } public static getInstance(url?: string): Mqtt { if (!Mqtt.instance) { Mqtt.instance = new Mqtt(url); } else if (url && !Mqtt.instance.client) { Mqtt.instance.connect(url); } return Mqtt.instance; } private connect(url: string): void { console.log(url, clientOptions); if (!this.client) { this.client = mqtt.connect(url, clientOptions); this.client.on('connect', this.onConnect); this.client.on('reconnect', this.onReconnect); this.client.on('error', this.onError); this.client.on('message', this.onMessage); } } public disconnect(): void { if (this.client) { this.client.end(); this.client = undefined; this.subscribeMembers = {}; this.isConnected = false; console.log(`服務(wù)器已斷開連接!`); } } public subscribe({ topic, callback }: SubscribeOptions): void { if (this.isConnected) { this.client?.subscribe(topic, { qos: 1 }, error => { if (error) { console.log(`客戶端: ${clientOptions.clientId}, 訂閱主題: ${topic}失敗: `, error); } else { console.log(`客戶端: ${clientOptions.clientId}, 訂閱主題: ${topic}成功`); } }); this.subscribeMembers[topic] = callback; } else { this.pendingSubscriptions.push({ topic, callback }); } } public unsubscribe(topic: string): void { if (!this.client) { return; } this.client.unsubscribe(topic, error => { if (error) { console.log(`客戶端: ${clientOptions.clientId}, 取消訂閱主題: ${topic}失敗: `, error); } else { console.log(`客戶端: ${clientOptions.clientId}, 取消訂閱主題: ${topic}成功`); } }); this.subscribeMembers[topic] = undefined; } public publish({ topic, message }: PublishOptions): void { if (this.isConnected) { this.client?.publish(topic, message, { qos: 1 }, e => { if (e) { console.log(`客戶端: ${clientOptions.clientId}, 發(fā)送主題為: ${topic} 的消息, 發(fā)送失敗: `, e); } }); } else { this.pendingPublications.push({ topic, message }); } } private onConnect = (e: any): void => { console.log(`客戶端: ${clientOptions.clientId}, 連接服務(wù)器成功:`, e); this.isConnected = true; this.processPendingSubscriptions(); this.processPendingPublications(); }; private onReconnect = (): void => { console.log(`客戶端: ${clientOptions.clientId}, 正在重連:`); this.isConnected = false; }; private onError = (error: Error): void => { console.log(`客戶端: ${clientOptions.clientId}, 連接失敗:`, error); this.isConnected = false; }; private onMessage = (topic: string, message: Buffer): void => { // console.log( // `客戶端: ${clientOptions.clientId}, 接收到來自主題: ${topic} 的消息: `, // message.toString(), // ); const callback = this.subscribeMembers?.[topic]; callback?.(topic, message.toString()); }; private processPendingSubscriptions(): void { while (this.pendingSubscriptions.length > 0) { const { topic, callback, subscribeOption } = this.pendingSubscriptions.shift()!; this.subscribe({ topic, callback, subscribeOption }); } } private processPendingPublications(): void { while (this.pendingPublications.length > 0) { const { topic, message } = this.pendingPublications.shift()!; this.publish({ topic, message }); } } } const clientOptions: ClientOptions = { clean: true, connectTimeout: 500, protocolVersion: 5, rejectUnauthorized: false, username: 'admin', password: 'Anjian-emqx', clientId: `client-${Date.now()}` }; // export default Mqtt.getInstance("ws://192.168.11.14:8083/mqtt"); // export default Mqtt.getInstance("ws://192.168.11.14:8083/mqtt"); // export default Mqtt.getInstance(JSON.parse(import.meta.env.VITE_OTHER_SERVICE_BASE_URL).mqtt); const { protocol, host } = window.location; export default Mqtt.getInstance(`${protocol.replace('http', 'ws')}//${host.replace('localhost', '127.0.0.1')}/mqtt/`);
注意:
1.環(huán)境配置
.env.test VITE_OTHER_SERVICE_BASE_URL= `{ "mqtt": "ws://192.168.11.14:8083/mqtt" }`
2.qos設(shè)置 前后端統(tǒng)一為1
以上就是vue3中如何使用mqtt數(shù)據(jù)傳輸?shù)脑敿?xì)內(nèi)容,更多關(guān)于vue3 mqtt數(shù)據(jù)傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VUE多個下拉框?qū)崿F(xiàn)雙向聯(lián)動效果
這篇文章主要為大家詳細(xì)介紹了VUE多個下拉框?qū)崿F(xiàn)雙向聯(lián)動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07使用vuedraggable實(shí)現(xiàn)從左向右拖拽功能
這篇文章主要為大家詳細(xì)介紹了使用vuedraggable實(shí)現(xiàn)從左向右拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04vue3+vite項目配置ESlint、pritter插件過程
這篇文章主要介紹了vue3+vite項目配置ESlint、pritter插件過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08vue實(shí)現(xiàn)自定義公共組件及提取公共的方法
這篇文章主要介紹了vue實(shí)現(xiàn)自定義公共組件及提取公共的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05一文詳解Vue3中簡單diff算法的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹Vue3中簡單diff算法的實(shí)現(xiàn)與使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下2022-09-09vue3實(shí)現(xiàn)問卷調(diào)查的示例代碼
本文主要介紹了vue3實(shí)現(xiàn)問卷調(diào)查的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Vue-pdf實(shí)現(xiàn)在線預(yù)覽PDF文件
這篇文章主要為大家詳細(xì)介紹了Vue-pdf實(shí)現(xiàn)在線預(yù)覽PDF文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05