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

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

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

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

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

常見(jiàn)的操作就是連接后有N個(gè)設(shè)備訂閱了主題A,這時(shí)候任意一臺(tái)設(shè)備對(duì)主題A發(fā)布了一條信息,則當(dāng)前N個(gè)設(shè)備都能收到這條消息。

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

假如你想知道的更為詳細(xì),可以詢問(wèn) Trae。

需求

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

實(shí)現(xiàn)方案

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

npm i mqtt@3.0.0 uuid

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

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

// mqttClient.js 對(duì) MQTT 的簡(jiǎn)單封裝
let client = null;
/**
 * 初始化 MQTT 連接
 * @param {Object} options
 * @param {string} options.host - 服務(wù)器地址(不帶協(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;

	// 根據(jù)平臺(tái)選擇協(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,根據(jù)你的 broker 配置

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

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

	client = mqtt.connect(url, connectOptions);

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

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

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

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

	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)聽(tīng)消息(全局監(jiān)聽(tīng),需配合 topic 過(guò)濾)
	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);
		}
	});
}

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

我讓 Trae 基于網(wǎng)上的封裝簡(jiǎn)單進(jìn)行了修改,生成了上述封裝Js文件。

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

現(xiàn)在進(jì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,設(shè)為 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: '測(cè)試信息'
            });
        },
        disconnect() {
            disconnect();
        }
    }
}

注意:在卸載頁(yè)面的時(shí)候建議將 MQTT連接 斷開(kāi),或者在 uni-app 中使用也可以使用 unload 方法斷開(kāi)連接。

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

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

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

假如你的 Topic 為:

/123/456/report 則你的通配符主題名稱為 +/+/+/report,因?yàn)樗牡谝晃皇?空字符串。

結(jié)論

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

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

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

相關(guān)文章

最新評(píng)論

渑池县| 额济纳旗| 崇州市| 涪陵区| 吉林省| 台安县| 肥东县| 绥芬河市| 开阳县| 防城港市| 枝江市| 石门县| 石门县| 龙井市| 林甸县| 汶川县| 浮山县| 桃源县| 娄烦县| 昭通市| 沙坪坝区| 五台县| 东乡族自治县| 邵阳县| 武邑县| 于都县| 宣武区| 明溪县| 九龙坡区| 贵南县| 太湖县| 黎平县| 百色市| 同德县| 洱源县| 汾西县| 抚远县| 文登市| 来安县| 龙海市| 辽宁省|