前言
本文是探讨的是"物联网平台emqx和mqtt在Vue和Nodejs里面的使用"
学习归纳,如有不对, 还望斧正, 感谢!
最近搞过物联网相关的,也顺带归纳一下,我的个人Go项目还在进行中,欢迎关注
mqtt协议的粗识
MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,专为物联网设备和应用程序之间的通信而设计。它是一种发布/订阅模式的协议,允许设备和应用程序通过一个中间代理(broker)进行通信。
- 轻量级:MQTT协议非常轻量级,协议头部只有几个字节,传输数据量小,适合在带宽有限的网络环境中使用。
- 发布/订阅模式:MQTT使用发布/订阅模式进行消息传递。设备可以发布(publish)消息到一个特定的主题(topic),而其他设备可以订阅(subscribe)这个主题,以接收相关的消息。
- 可靠性:MQTT协议支持三种级别的消息传递质量(QoS):QoS 0表示最多一次的传递,QoS 1表示至少一次的传递,QoS 2表示只有一次的传递。通过选择适当的QoS级别,可以确保消息的可靠性和传递保证。
- 异步通信:MQTT协议支持异步通信,设备可以在不同的时间发送和接收消息,而不需要实时的连接。
- 灵活的连接方式:MQTT协议支持多种连接方式,包括TCP/IP、WebSocket等,可以适应不同的网络环境和设备类型。
- 安全性:MQTT协议支持基于TLS/SSL的加密通信,可以确保消息的安全性和隐私性。
- 低功耗:MQTT协议设计时考虑了物联网设备的低功耗需求,能够有效地利用设备的能源。
MQTT协议的工作原理如下:
- 设备通过TCP/IP或WebSocket等协议与MQTT代理(broker)建立连接。
- 设备可以发布消息到一个特定的主题(topic),或者订阅一个主题以接收相关的消息。
- MQTT代理负责接收和路由消息,将消息传递给订阅了相应主题的设备。
- 订阅了某个主题的设备会收到与该主题相关的消息。
- 设备可以根据需要选择适当的QoS级别来确保消息的可靠性。
MQTT非常适用于物联网设备和应用程序之间通信的协议,已经被广泛应用于物联网领域,为设备之间的通信提供了一种高效和可靠的解决方案。
关于mqtt细解
- 主题(Topic)和通配符: MQTT使用主题(Topic)来标识消息的内容。主题类似于一个路径,可以是层级结构的字符串,用斜杠(/)分隔。例如,"home/livingroom/temperature"是一个主题。
MQTT还支持通配符来进行更灵活的订阅。有两种通配符:单层级通配符( )和多层级通配符(#)。单层级通配符可以匹配一个层级,而多层级通配符可以匹配零个或多个层级。例如,订阅"home/ /temperature"可以匹配"home/livingroom/temperature"和"home/bedroom/temperature"等主题。
- 连接和会话: MQTT协议使用基于会话的连接模型。设备在连接到MQTT代理时可以选择保持会话。会话可以跟踪设备的订阅和发布状态,以便在断开连接后重新连接时恢复之前的订阅和发布。
会话还可以设置清除标志,用于指示代理是否应该保留设备的订阅和发布状态。如果清除标志被设置为true,则断开连接后会话将被删除,设备的订阅和发布状态将被清空。
- QoS级别: MQTT协议支持三种级别的消息传递质量(QoS):
- QoS 0:最多一次的传递。消息发送后不进行确认,不保证消息的可靠性和传递。
- QoS 1:至少一次的传递。消息发送后需要收到确认,如果没有收到确认,则会重新发送消息,确保消息至少被传递一次。
- QoS 2:只有一次的传递。消息发送后需要进行两次确认,确保消息只被传递一次。这是最高的可靠性级别,但也会带来更多的网络开销。
设备可以根据需要选择适当的QoS级别。较高的QoS级别会带来更多的网络开销。
- 消息保留(Retained Messages): MQTT支持消息保留机制,即设备可以发布一个保留消息。当有设备订阅了某个主题时,代理会将最新的保留消息发送给订阅者。这样,订阅者可以获取到最新的状态或信息,即使在订阅之前已经有消息发布。
- 服务质量和延迟: MQTT协议通过控制QoS级别来实现服务质量和延迟的平衡。较高的QoS级别可以提供更可靠的消息传递,但会增加网络开销和延迟。较低的QoS级别可以减少网络开销和延迟,但可能会牺牲消息的可靠性。
- 安全性: MQTT协议支持基于TLS/SSL的加密通信,确保消息的安全性和隐私性。设备和代理之间的通信可以通过安全套接字层(SSL)进行加密,防止数据的窃听和篡改。
- MQTT代理(Broker): MQTT代理是MQTT协议的核心组件,负责接收和路由消息。代理可以处理多个设备的连接和消息传递,并确保消息按照订阅关系进行正确的传递。代理还可以支持订阅和发布的身份验证、访问控制等功能。
关于emqx平台
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的安装
首先就是下载emqx,下载好了之后是压缩包,然后解压就行
安装好了之后,到bin目录,输入emqx start然后回车启动服务,这个emqx实际上就是在你本地上搭建了一个mqtt服务器
验证是否启动成功,我们可以在本地浏览器输入http://localhost:18083/ ,看到如下图,就说明服务启动成功了,然后输入用户名和密码 默认用户名是admin,默认密码是public,进去之后会让你设置用户名和密码,你自己看着办
进去之后就是
我们可以在里面测试链接
然后在客户端可以看到我们自己的链接
使用 Vue2中链接本地emqx服务端
首先先安装mqtt,
npm官网地址如下:
mqtt - npm (npmjs.com)
代码语言:txt复制npm i mqtt
安装好了之后,在Vue组件中导入,这是es6的语法
代码语言:html复制import * as mqtt from 'mqtt'
导入之后,就封装函数,在methods里面,封装一个init函数,然后在生命周期函数mounted里面进行调用
代码语言:html复制 // 链接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生命周期函数中调用
代码语言:html复制end(){
this.client.end()
this.client = null
console.log('已断开连接');
}
现在我们运行项目,然后可以在控制台看到如下
emqx中也可以看到
然后我们再封装一个函数sub,用于订阅消息,也在mounted里面调用
代码语言:html复制 //订阅一个信息
sub() {
let str = 'text'
this.client.subscribe(str, { qos: 0 }, (err) => {
if (!err) {
console.log(`主题为:"${str}" 的消息订阅成功`)
} else {
console.log('消息订阅失败')
}
})
},
然后运行之后,可以看到
使用 nodejs中连接本地emqx服务器
原理和上面类似,具体请直接看代码,我写了注释的,就在此不做解释了,要先安装mqtt,然后此处的导入,我是通过npm i mqtt 之后,然后把mqtt包中的mqtt文件单独复制出来使用了,其中监听函数可以多次使用,方便在其他地方进行数据的监听和使用
代码语言:txt复制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平台提供的免费云服务器
值得一提的是,我们可以使用emqx平台提供的云服务,就是说我们只要用npm的安装了mqtt的包之后,就可以进行进行云服务,然后双方都链接这个免费的云服务,然后双方订阅同一个主题,就可以实现信息交互了。
如果是连本地的mqtt服务器的话,要求双方在同一个局域网下面,而云服务的方便许多,无视距离的限制
上面的都是基于本地的,其实比较不方便,而且emqx平台也提供给个人一个免费的个人专有的云服务器,也可以进行连接,下面将演示使用免费的云服务,在vue中,其实也就是把本地的,改为云地址
代码语言:html复制 this.client = mqtt.connect("ws://broker.emqx.io:8083/mqtt", options); //调用连接的api
在nodejs中,地址如下,有所差异
代码语言:javascript复制 mqttClient = mqtt.connect('mqtt://broker.emqx.io:1883', options)
注意,这两种方式连接之前,都需要先安装好前面所提到的依赖。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!