likes
comments
collection
share

【MQTT】从理解到精通"MQTT协议"即时通讯前言 什么是MQTT? MQTT(Message Queuing Tel

作者站长头像
站长
· 阅读数 55

前言

什么是MQTT? MQTT(Message Queuing Telemetry Transport)协议是一种基于发布/订阅模式的轻量级消息传输协议,它被设计用于提供采集传感器数据的服务、远程地点的数据收集和管理中心的通讯,以及对网络不可靠的应用程序联网。MQTT是基于客户端-服务器架构的发布/订阅模式,这意味着数据发送者(发布者)不会直接向特定接收者(订阅者)发送消息,而是将定制的消息发送到一个主题,而订阅了该主题的接收者将会接收到消息。

【MQTT】从理解到精通"MQTT协议"即时通讯前言 什么是MQTT? MQTT(Message Queuing Tel

通俗解释: 想象一下,你正在组织一场大型派对,你需要确保所有的嘉宾都能及时获得最新的活动信息,比如食物准备好了、舞池开放了等。为了有效地传达这些信息,你可以使用一种类似于“公告板”的系统,这就是MQTT协议的工作原理。

  • 客户端发布者:派对工作人员发现蛋糕已经准备好了,于是发布了一条消息到主题“食物准备好了”。
  • MQTT服务器:接收到了这条消息,并把它保存下来。
  • 客户端订阅者:所有对“食物准备好了”这一主题感兴趣的派对嘉宾都会收到通知,告诉他们蛋糕已经准备好了。

MQTT协议的特点? MQTT协议之所以被广泛采用,主要是因为它具备以下几个特点:

  • 轻量级:适用于资源受限的设备,如传感器和嵌入式系统。
  • 低带宽:设计上考虑了低带宽的需求,适合不稳定的网络环境。
  • 发布/订阅模式:支持异步通信,简化了客户端的通信逻辑。
  • 可靠性:支持不同级别的消息服务质量(QoS),确保消息的可靠传输。

了解MQTT 的基本操作指令

MQTT协议支持多种操作方法,主要包括:

  • connect:客户端连接到服务器。
  • publish:客户端向服务器发布消息。
  • subscribe:客户端向服务器订阅主题。
  • unsubscribe:客户端取消订阅主题。
  • disconnect:客户端断开与服务器的连接。 代码截图如下:

【MQTT】从理解到精通"MQTT协议"即时通讯前言 什么是MQTT? MQTT(Message Queuing Tel

源代码如下:

<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
评论
请登录