【MQTT】从理解到精通"MQTT协议"即时通讯前言 什么是MQTT? MQTT(Message Queuing Tel
前言
什么是MQTT? MQTT(Message Queuing Telemetry Transport)协议是一种基于发布/订阅模式的轻量级消息传输协议,它被设计用于提供采集传感器数据的服务、远程地点的数据收集和管理中心的通讯,以及对网络不可靠的应用程序联网。MQTT是基于客户端-服务器架构的发布/订阅模式,这意味着数据发送者(发布者)不会直接向特定接收者(订阅者)发送消息,而是将定制的消息发送到一个主题,而订阅了该主题的接收者将会接收到消息。
通俗解释: 想象一下,你正在组织一场大型派对,你需要确保所有的嘉宾都能及时获得最新的活动信息,比如食物准备好了、舞池开放了等。为了有效地传达这些信息,你可以使用一种类似于“公告板”的系统,这就是MQTT协议的工作原理。
- 客户端发布者:派对工作人员发现蛋糕已经准备好了,于是发布了一条消息到主题“食物准备好了”。
- MQTT服务器:接收到了这条消息,并把它保存下来。
- 客户端订阅者:所有对“食物准备好了”这一主题感兴趣的派对嘉宾都会收到通知,告诉他们蛋糕已经准备好了。
MQTT协议的特点? MQTT协议之所以被广泛采用,主要是因为它具备以下几个特点:
- 轻量级:适用于资源受限的设备,如传感器和嵌入式系统。
- 低带宽:设计上考虑了低带宽的需求,适合不稳定的网络环境。
- 发布/订阅模式:支持异步通信,简化了客户端的通信逻辑。
- 可靠性:支持不同级别的消息服务质量(QoS),确保消息的可靠传输。
了解MQTT 的基本操作指令
MQTT协议支持多种操作方法,主要包括:
connect
:客户端连接到服务器。publish
:客户端向服务器发布消息。subscribe
:客户端向服务器订阅主题。unsubscribe
:客户端取消订阅主题。disconnect
:客户端断开与服务器的连接。 代码截图如下:
源代码如下:
<script>
import mqtt from 'mqtt'
export default {
data() {
return {
client: {},
unreadMessageTotal: 0, /**未读消息总条数 */
dialogVisible: false, /**CMS消息通知弹窗 */
messageContent: "",/**cms内容 */
messageTitle: "",/**cms标题 */
sendTime: "",/**发布时间 */
};
},
mounted(){
this.getAccountInfo();
this.getMqttAuthTokenFn();
},
methods: {
//连接服务器
connect(e) {
let options = {
username: e.userName,
password: e.token,
cleanSession : false,
keepAlive:60,
clientId: e.clientId,
connectTimeout: 4000,
port: 443
}
this.client = mqtt.connect('wss://post-cn-8ed2k943d14.mqtt.aliyuncs.com',options);
this.client.on("connect", (e)=>{
console.log("成功连接服务器:",e);
});
//重新连接
this.reconnect()
//是否已经断开连接
this.mqttError()
//监听获取信息
this.getMessage()
},
//发布消息@topic主题 @message发布内容
publish(topic,message) {
if (!this.client.connected) {
console.log('客户端未连接')
return
}
this.client.publish(topic,message,{qos: 1},(err) => {
if(!err) {
console.log('主题为'+topic+ "发布成功")
}
})
},
//监听接收消息
getMessage() {
this.client.on("message", (topic, message) => {
if(message) {
console.log('收到来着',topic,'的信息',message.toString())
const res = JSON.parse(message.toString())
this.categoryMessageList[res.messageType].unreadCategoryTotal += 1;
this.categoryMessageList[res.messageType].messageList.unshift(res);
this.categoryMessageList[res.messageType].messageList = this.categoryMessageList[res.messageType].messageList.slice(0,5);
this.unreadMessageTotal += 1;
this.$notify({
title: res.messageType==0?"通知":(res.messageType==1?"待办":"下载"),
message: res.messageTitle,
duration: 5000,
onClick:()=>{
this.handleRouter(res,res.messageType)
}
})
}
});
},
//监听服务器是否连接失败
mqttError() {
// console.log(this.client)
this.client.on('error',(error) => {
console.log('连接失败:',error)
this.client.end()
})
},
//断开连接
unconnect() {
this.client.end()
this.client = null
console.log('服务器已断开连接!')
},
//监听服务器重新连接
reconnect() {
this.client.on('reconnect', (error) => {
console.log('正在重连:', error)
});
}
},
beforeDestroy () {
this.unconnect();
},
};
</script>
使用mqtt 来实现客户端代码
安装MQTT 客户端库
npm install mqtt --save 或
yarn add mqtt
如何建立连接
//连接服务器
connect(e) {
let options = {
username: e.userName,
password: e.token,
cleanSession : false,
keepAlive:60,
clientId: e.clientId,
connectTimeout: 4000,
port: 443
}
this.client = mqtt.connect('wss://post-cn-8ed2k943d14.mqtt.aliyuncs.com',options);
this.client.on("connect", (e)=>{
console.log("成功连接服务器:",e);
});
//重新连接
this.reconnect()
//是否已经断开连接
this.mqttError()
//监听获取信息
this.getMessage()
},
如何发布消息
//发布消息@topic主题 @message发布内容
publish(topic,message) {
if (!this.client.connected) {
console.log('客户端未连接')
return
}
this.client.publish(topic,message,{qos: 1},(err) => {
if(!err) {
console.log('主题为'+topic+ "发布成功")
}
})
},
如何接收消息
//监听接收消息
getMessage() {
this.client.on("message", (topic, message) => {
if(message) {
console.log('收到来着',topic,'的信息',message.toString())
const res = JSON.parse(message.toString())
}
});
},
监听服务器是否连接失败
mqttError() {
this.client.on('error',(error) => {
console.log('连接失败:',error)
this.client.end()
})
},
如何断开连接:
//断开连接
unconnect() {
this.client.end()
this.client = null
console.log('服务器已断开连接!')
},
结尾
希望本文能帮助你更好地理解MQTT,并在实际项目中灵活应用MQTT协议。无论是智能家居、远程监控还是工业自动化,MQTT都能为你提供一个可靠的数据传输平台。Happy coding!
逐字稿:
MQTT为现代物联网应用提供了高效的实时通信能力,为开发者们带来了更多可能性。作为一种轻量级的消息传输协议,MQTT允许客户端既作为消息的接收方,也作为消息的发送方,实现双向数据交换。尽管可以直接使用MQTT协议提供的原生API进行连接、发布和订阅消息,但在实际开发中,使用像mqtt
这样的库会更加便捷。只需初始化一个客户端实例,然后通过client.publish
方法发送消息,并使用client.on
方法监听特定主题的消息,即可实现消息的发布与订阅。“example/topic”这样的主题名称可以根据实际需求进行更改。
转载自:https://juejin.cn/post/7412955032092688435