在vue中使用mqtt.js

本文介绍了如何在JavaScript项目中,特别是Vue应用里,使用mqtt.js库进行MQTT通信。包括安装mqtt.js、建立连接、订阅和发布消息的详细步骤,以及在实际案例中的应用,如连接配置和消息处理函数。

mqtt.js 官网地址: MQTT
若是采用JS使用MQTT,详见

1. 脚手架中安装mqtt

npm install mqtt --save

官网例子:

const mqtt = require('mqtt')
const client  = mqtt.connect('mqtt://test.mosquitto.org')

client.on('connect', function () {
	client.subscribe('presence', function (err) {
		if (!err) {
			client.publish('presence', 'Hello mqtt')
		}
	})
})

client.on('message', function (topic, message) {
	// message is Buffer
	console.log(message.toString())
	client.end()
})

2. 在vue文件中引入mqtt

import mqtt from 'mqtt'

3. 在data中声明client对象

data() {
	return {
		client: {},
		mtopic: '订阅的主题',
		msg: '返回的消息'
	};
},

4. 在mounted钩子中建立连接

mounted() {
	this.client = mqtt.connect("ws://ip:port", {
		username: "admin",
		password: "password",
		keepalive: 15 //心跳保持时间(秒)
	});
	
	this.client.on("packetreceive", (e) => {
		if (e.cmd == "pingresp") {
			//console.log("发送心跳", e);
		}
	});
	
	// 连接成功后 - 订阅主题
	this.client.on("connect", e =>{
		console.log("连接成功");
		this.client.subscribe(this.mtopic, (err) => {
			if (!err) {
				console.log("订阅成功:" + this.mtopic);
			}
		});
	});
	
	// 连接成功后 - 返回的订阅内容
	this.client.on("message", (topic, message) => {
		this.msg = message;
	});
}

5. 发布消息

<el-button @click="publishTopic()"></el-button>
publishTopic() {
	this.client.publish('订阅的主题名称', JSON.stringify(
		{
			// 条件
			"deptAreaId": this.currentUser.deptAreaId,
			"code": 1,
		}
	));
},

6. 实际案例

data() {
	return {
		client: {},
		parkTopic: "",
		parkPrefix: "parking/",
	};
},
mounted() {
	// 订阅的主题
	this.parkTopic = this.parkPrefix + this.currentUser.parkingId;
	// 连接MQTT
	this.connectMqtt();
},
methods: {
	connectMqtt() {
		// "ws://192.168.0.101:15675/ws"
		let wsUrl = process.env.VUE_APP_WS_URL || "ws://" + location.hostname + ":15675/ws";
	
		// MQTT 连接
		this.client = mqtt.connect(wsUrl, {
			username: process.env.VUE_APP_WS_USER || "admin",
			password: process.env.VUE_APP_WS_PWD || "123456",
			keepalive: 15//心跳保持时间(秒)
		});
		
		this.client.on("packetreceive", (e) => {
			if (e.cmd == "pingresp") {
				//console.log("发送心跳", e);
			}
		});
	
		// 连接成功后 - 订阅主题
		this.client.on("connect", e => {
			console.log("连接成功", Date.now());
			this.onSubscribe();
		});
	
		// 连接成功后 - 返回的订阅内容
		this.client.on("message", (topic, message) => {
			this.onMessage(topic, message);
		});
	},
	// 订阅主题
	onSubscribe() {
		
		this.client.subscribe(this.parkTopic, (err) => {
			if (!err) {
				console.log("订阅派车单成功:" + this.parkTopic);
			}
		});
	},
	// 接收消息
	onMessage(topic, message) {
		if (topic.indexOf(this.parkTopic) > -1) {
			var msg = JSON.parse(message);
			...
		}
	},
},
		

### 使用 Vue.jsMQTT.js 连接到 MQTT 服务器 为了实现 Vue.js 应用程序与 MQTT 服务器之间的通信,可以按照如下方法操作: #### 安装依赖库 首先,在项目中安装 `mqtt` 包作为客户端库来处理消息队列遥测传输协议(MQTT)。 ```bash npm install mqtt --save ``` #### 创建 MQTT Service 文件 接着创建一个服务文件用于管理所有的 MQTT 订阅和发布逻辑。这有助于保持组件的整洁,并使代码更易于维护。 ```javascript // src/services/mqttService.js import { createNamespacedHelpers } from 'vuex'; const mqtt = require('mqtt'); let client; export function initMqtt(brokerUrl, clientId) { client = mqtt.connect(brokerUrl, {clientId}); client.on('connect', () => console.log(`Connected to broker ${brokerUrl}`)); client.on('error', (err) => console.error(err)); return client; } export function subscribe(topic, callback) { if (!client || !client.connected) throw new Error('Not connected'); client.subscribe(topic); client.on('message', (receivedTopic, message) => { const payload = JSON.parse(message.toString()); callback(receivedTopic, payload); }); } ``` 此部分展示了如何初始化一个新的异步 MQTT 客户端实例[^1]。 #### 配置 Vuex Store 来存储状态 如果应用程序较大,则可能希望利用 Vuex 存储来自订阅的主题更新的状态数据。 ```javascript // store/index.js import Vue from 'vue'; import Vuex from 'vuex'; import { initMqtt, subscribe } from '../services/mqttService'; Vue.use(Vuex); export default new Vuex.Store({ state: {}, mutations: {}, actions: { async initialize({ commit }) { try { await initMqtt(process.env.VUE_APP_MQTT_BROKER_URL, process.env.VUE_APP_CLIENT_ID); // 假设有一个名为 "sensorData" 的主题被监听 subscribe('sensorData', (topic, data) => { commit('updateSensorData', data); }); } catch(error){ console.error("Failed initializing MQTT", error); } }, }, }) ``` 上述配置允许通过环境变量设置代理 URL 和客户端 ID,从而提高灵活性和安全性[^2]。 #### 组件内调用 Action 初始化连接 最后一步是在应用加载时触发该 action 方法完成实际的网络请求。 ```javascript // App.vue 或者其他入口组件 <template> <!-- ... --> </template> <script> export default { name: 'App', mounted() { this.$store.dispatch('initialize'); } }; </script> ``` 这样就完成了整个流程:从建立到接收信息的过程都封装好了,可以在任何地方轻松地访问这些功能而无需重复编写相同的代码片段。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值