最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

uni-app實現(xiàn)本地MQTT連接的方法步驟

 更新時間:2026年03月05日 11:22:21   作者:李劍一  
這篇文章主要介紹了uni-app實現(xiàn)本地MQTT連接的相關資料,文中通過代碼介紹的非常詳細,包括安裝必要的插件、生成連接ID和消息ID、修改封裝Js文件以及在頁面中使用MQTT連接,需要的朋友可以參考下

最近接到安卓端的需求,要求使用MQTT連接實現(xiàn)設備信息的收發(fā)。

可能有兄弟不太清楚 MQTT協(xié)議 是什么,簡單地說它是一種輕量級的、基于發(fā)布/訂閱模式的消息傳輸協(xié)議,廣泛用于物聯(lián)網(IoT)領域。

常見的操作就是連接后有N個設備訂閱了主題A,這時候任意一臺設備對主題A發(fā)布了一條信息,則當前N個設備都能收到這條消息。

至于其他的也不用知道的太清楚,反正知道一般是這么玩的就行。

假如你想知道的更為詳細,可以詢問 Trae。

需求

  1. 實現(xiàn)MQTT連接
  2. 實現(xiàn)主題(Topic)訂閱
  3. 能夠發(fā)送消息
  4. 能夠接收消息

實現(xiàn)方案

首先是安裝 mqtt.js 插件和 uuid.js 插件。

npm i mqtt@3.0.0 uuid

注意: 這里一定要安裝 mqtt v3.0 版本,我之前裝了一個 v5.x 版本,有比較大的 API 改動。項目上時間緊張,遂沒有再嘗試。(有興趣的朋友可以考慮用最新版實現(xiàn))

uuid 只是起到生成 連接ID 和 消息ID 的作用,這里也可以直接使用時間戳的方式,但是為了保證不重復,這里便不再更換了。

// mqttClient.js 對 MQTT 的簡單封裝
let client = null;
/**
 * 初始化 MQTT 連接
 * @param {Object} options
 * @param {string} options.host - 服務器地址(不帶協(xié)議)
 * @param {number} options.port - 端口(通常 WebSocket 是 8083、8084 或 443)
 * @param {string} options.clientId - 客戶端 ID(建議唯一)
 * @param {string} [options.username] - 用戶名
 * @param {string} [options.password] - 密碼
 * @param {boolean} [options.useWss=false] - 是否使用 wss(HTTPS)
 */
export function initMqtt(options) {
	const {
		host,
		port,
		clientId,
		username = '',
		password = '',
		useWss = false
	} = options;

	// 根據平臺選擇協(xié)議(App 和 H5 用 ws/wss,小程序用 wxs/wss)
	let protocol = 'ws';
	if (useWss) protocol = 'wss';

	// #ifdef MP-WEIXIN
	protocol = useWss ? 'wxs' : 'wxs';
	// #endif

	const url = `${protocol}://${host}:${port}/mqtt`; // 注意:路徑可能是 / 或 /mqtt,根據你的 broker 配置

	const connectOptions = {
		clientId: clientId,
		username: username,
		password: password,
		keepalive: 60, // 心跳間隔(秒)
		reconnectPeriod: 5000, // 自動重連間隔(毫秒)
		connectTimeout: 10000, // 連接超時
		clean: true // 是否清除會話
	};

	// 引入 mqtt(必須用 min 版本,否則小程序報錯)
	const mqtt = require('mqtt/dist/mqtt.min.js');

	client = mqtt.connect(url, connectOptions);

	// 監(jiān)聽連接事件
	client.on('connect', () => {
		console.log('MQTT 連接成功');
	});

	client.on('reconnect', () => {
		console.log('MQTT 正在重連...');
	});

	client.on('error', (err) => {
		console.error('MQTT 連接錯誤:', err);
	});

	client.on('close', () => {
		console.log('MQTT 連接已關閉');
	});

	return client;
}

/**
 * 訂閱主題
 * @param {string} topic
 * @param {Function} callback - (topic, message) => {}
 */
export function subscribe(topic, callback) {
	if (!client) {
		console.warn('MQTT 客戶端未初始化');
		return;
	}

	client.subscribe(topic, (err) => {
		if (!err) {
			console.log(`訂閱主題成功: ${topic}`);
		} else {
			console.error('訂閱失敗:', err);
		}
	});

	// 監(jiān)聽消息(全局監(jiān)聽,需配合 topic 過濾)
	client.on('message', (receivedTopic, message) => {
		// if (receivedTopic === topic) {
			try {
				// 嘗試解析 JSON
				const payload = JSON.parse(message.toString());
				callback(receivedTopic, payload);
			} catch (e) {
				// 非 JSON 消息
				callback(receivedTopic, message.toString());
			}
		// }
	});
}

/**
 * 發(fā)布消息
 * @param {string} topic
 * @param {string|object} message
 */
export function publish(topic, message) {
	if (!client) {
		console.warn('MQTT 客戶端未初始化');
		return;
	}

	const payload = typeof message === 'object' ? JSON.stringify(message) : message;
	client.publish(topic, payload, {
		qos: 1
	}, (err) => {
		if (err) {
			console.error('發(fā)布失敗:', err);
		} else {
			console.log(`發(fā)布成功: ${topic}`, payload);
		}
	});
}

/**
 * 斷開連接
 */
export function disconnect() {
	if (client) {
		client.end(true); // true 表示強制斷開
		client = null;
		console.log('MQTT 已斷開');
	}
}

我讓 Trae 基于網上的封裝簡單進行了修改,生成了上述封裝Js文件。

注意:在監(jiān)聽消息的部分,如果你的 Topic 是固定的,則請將 if (receivedTopic === topic)注釋打開,如果不是,則注釋掉,后續(xù)有詳解。

現(xiàn)在進入到 page/index/index.vue 文件中

import {initMqtt, subscribe, publish, disconnect} from './mqttClient.js';
export default {
    data() {
        return {
            host: 'broker.emqx.io',
            messages: []
        }
    },
    mounted() {
        this.connect()
    },
    beforeDestroy() {
        this.disconnect()
    },
    methods: {
        // 連接
        connect() {
            const uuid = uuidv4();
            const client = initMqtt({
                host: this.host,
                port: 8083,
                clientId: uuid,
                username: '',
                password: '',
                useWss: false // 如果是 HTTPS/WSS,設為 true
            });
            if (client) {
                this.subscribeTopic();
            }
        },
        // 訂閱 test/topic 主題
        subscribeTopic() {
            subscribe('test/topic', (topic, message) => {
                // 接收到的消息
                const msg = JSON.stringify(message);
                this.messages.unshift(msg);
            });
        },
        // 訂閱 帶通配符 的主題
        subscribeTopics() {
            subscribe('+/topic', (topic, message) => {
                // 接收到的消息
                const msg = JSON.stringify(message);
                this.messages.unshift(msg);
            });
        },
        // 發(fā)送消息到 test/topic 主題
        publishMessage() {
            publish('test/topic', {
                name: 'uni-app',
                time: new Date().toISOString(),
                msg: '測試信息'
            });
        },
        disconnect() {
            disconnect();
        }
    }
}

注意:在卸載頁面的時候建議將 MQTT連接 斷開,或者在 uni-app 中使用也可以使用 unload 方法斷開連接。

另外訂閱主題可以采用常規(guī)的,確定性的 Topic 主題名稱,也可以采用 通配符(+) 的主題名稱。

Trae還提醒我一定要注意,假如你的 Topic 為:

123/456/report 則你的通配符主題名稱為 +/+/report

假如你的 Topic 為:

/123/456/report 則你的通配符主題名稱為 +/+/+/report,因為他的第一位是 空字符串。

結論

在開發(fā) IoT 設備時這個協(xié)議用的比較廣泛,如果不接觸這個方面一般不會用上這個。

另外 MQTT 本身自帶心跳和自動重連機制,大致上相當于 WebSocket,這個部分一般不需要做特殊開發(fā)。

到此這篇關于uni-app實現(xiàn)本地MQTT連接的文章就介紹到這了,更多相關uni-app本地MQTT連接內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

滁州市| 响水县| 历史| 远安县| 普宁市| 油尖旺区| 阿巴嘎旗| 璧山县| 独山县| 佛山市| 师宗县| 紫云| 鲜城| 砀山县| 嵩明县| 韩城市| 运城市| 济南市| 天全县| 合阳县| 旬邑县| 六盘水市| 彩票| 台东市| 顺义区| 霍山县| 喀喇沁旗| 抚松县| 乌兰浩特市| 凭祥市| 万盛区| 平舆县| 成安县| 高唐县| 德化县| 高雄县| 丁青县| 蓬莱市| 麻阳| 武冈市| 舟曲县|