本文是探讨的是"物联网平台emqx和mqtt在Vue和Nodejs里面的使用"
学习归纳,如有不对, 还望斧正, 感谢!
最近搞过物联网相关的,也顺带归纳一下,我的个人Go项目还在进行中,欢迎关注
MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,专为物联网设备和应用程序之间的通信而设计。它是一种发布/订阅模式的协议,允许设备和应用程序通过一个中间代理(broker)进行通信。
MQTT协议的工作原理如下:
MQTT非常适用于物联网设备和应用程序之间通信的协议,已经被广泛应用于物联网领域,为设备之间的通信提供了一种高效和可靠的解决方案。
MQTT还支持通配符来进行更灵活的订阅。有两种通配符:单层级通配符(+)和多层级通配符(#)。单层级通配符可以匹配一个层级,而多层级通配符可以匹配零个或多个层级。例如,订阅"home/+/temperature"可以匹配"home/livingroom/temperature"和"home/bedroom/temperature"等主题。
会话还可以设置清除标志,用于指示代理是否应该保留设备的订阅和发布状态。如果清除标志被设置为true,则断开连接后会话将被删除,设备的订阅和发布状态将被清空。
设备可以根据需要选择适当的QoS级别。较高的QoS级别会带来更多的网络开销。
EMQ X 是一个开源的分布式 MQTT 消息代理服务器,它实现了 MQTT 协议的 V3.1 和 V3.1.1 版本,并支持 MQTT over WebSocket、MQTT over TLS、MQTT over TCP 等多种协议。
EMQ X 的设计目标是为物联网(IoT)和实时消息传输提供高性能、可靠性和可伸缩性。它支持数百万级别的并发连接,能够处理大量的消息流量。
EMQ X 的架构采用了分布式的设计,可以通过水平扩展来增加容量和吞吐量。它提供了多种集群模式,包括主从模式、多主模式和集群模式,可以根据实际需求选择合适的模式。
EMQ X 还提供了强大的消息路由和消息转发功能,可以根据不同的规则将消息路由到不同的主题或者客户端。它支持基于主题的通配符订阅,可以实现灵活的消息过滤和订阅模式。
EMQ X 还提供了丰富的插件系统,可以扩展其功能。它提供了很多常用的插件,包括数据库插件、认证插件、WebHook 插件等,可以满足不同场景下的需求。
综上,EMQ X 是一个高性能、可靠性和可扩展性的分布式 MQTT 消息代理服务器,适用于物联网和实时消息传输场景。它提供了丰富的功能和灵活的架构设计,可以满足不同规模和需求的应用场景。
首先就是下载emqx,下载好了之后是压缩包,然后解压就行
安装好了之后,到bin目录,输入emqx start然后回车启动服务,这个emqx实际上就是在你本地上搭建了一个mqtt服务器
验证是否启动成功,我们可以在本地浏览器输入http://localhost:18083/ ,看到如下图,就说明服务启动成功了,然后输入用户名和密码 默认用户名是admin,默认密码是public,进去之后会让你设置用户名和密码,你自己看着办
进去之后就是
我们可以在里面测试链接
然后在客户端可以看到我们自己的链接
首先先安装mqtt,
npm官网地址如下:
npm i mqtt
安装好了之后,在Vue组件中导入,这是es6的语法
import * as mqtt from 'mqtt'
导入之后,就封装函数,在methods里面,封装一个init函数,然后在生命周期函数mounted里面进行调用
// 链接mqtt
init() {
console.log('启动了');
// 连接配置选项
let options = {
connectTimeout: 4000, // 超时时间
// 认证信息
clientId: "111", //不填默认随机生成一个ID
username: "adminVue", //用户名
password: "123456", //密码
};
this.client = mqtt.connect("ws://localhost:8083/mqtt", options); //调用连接的api
//连接成功
this.client.on("connect", (e) => {
console.log("连接成功", e);
});
//重连提醒
this.client.on("reconnect", (error) => {
console.log("正在重连", error);
});
//连接失败提醒
this.client.on("error", (error) => {
console.log("连接失败", error);
});
},
再封装一个函数end,用于断开链接,然后在组件销毁前的beforeDestroy生命周期函数中调用
end(){
this.client.end()
this.client = null
console.log('已断开连接');
}
现在我们运行项目,然后可以在控制台看到如下
emqx中也可以看到
然后我们再封装一个函数sub,用于订阅消息,也在mounted里面调用
//订阅一个信息
sub() {
let str = 'text'
this.client.subscribe(str, { qos: 0 }, (err) => {
if (!err) {
console.log(`主题为:"${str}" 的消息订阅成功`)
} else {
console.log('消息订阅失败')
}
})
},
然后运行之后,可以看到
原理和上面类似,具体请直接看代码,我写了注释的,就在此不做解释了,要先安装mqtt,然后此处的导入,我是通过npm i mqtt 之后,然后把mqtt包中的mqtt文件单独复制出来使用了,其中监听函数可以多次使用,方便在其他地方进行数据的监听和使用
const express = require('express')
const server = new express()
const mqtt = require('mqtt') //此处导入,请参考npm官网中的mqtt导入方式,我这不是规范的
// 链接配置
const options = {
clean: true, // true: 清除会话, false: 保留会话
connectTimeout: 4000, // 超时时间
// 认证信息
clientId: '222222',
username: 'test',
password: '1234'
}
//ws://localhost:8083/mqtt
const connectUrl = 'mqtt://localhost:8083/mqtt'
const client = mqtt.connect(connectUrl, options)
client.on('connect', () => {
console.log('连接成功')
})
client.on('reconnect', (error) => {
console.log('正在重连:', error)
})
client.on('error', (error) => {
console.log('连接失败:', error)
})
const i = ['setM2','setM3']
//订阅setM3消息
// client.subscribe(i, (err) => {
// console.log('订阅setM2成功')
// })
// client.on('message', (topic, message) => {
// // const formattedTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
// console.log('收到消息:', topic, message.toString())
// const data = JSON.parse(message)
// console.log(data)
// })
server.listen(6666, () => {
console.log('正在监听6666端口');
})
值得一提的是,我们可以使用emqx平台提供的云服务,就是说我们只要用npm的安装了mqtt的包之后,就可以进行进行云服务,然后双方都链接这个免费的云服务,然后双方订阅同一个主题,就可以实现信息交互了。
如果是连本地的mqtt服务器的话,要求双方在同一个局域网下面,而云服务的方便许多,无视距离的限制
上面的都是基于本地的,其实比较不方便,而且emqx平台也提供给个人一个免费的个人专有的云服务器,也可以进行连接,下面将演示使用免费的云服务,在vue中,其实也就是把本地的,改为云地址
this.client = mqtt.connect("ws://broker.emqx.io:8083/mqtt", options); //调用连接的api
在nodejs中,地址如下,有所差异
mqttClient = mqtt.connect('mqtt://broker.emqx.io:1883', options)
注意,这两种方式连接之前,都需要先安装好前面所提到的依赖。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。