今天你跟同事闲聊说到,现在的前端很卷,居然卷到了MQTT,但是同事很蒙,说什么是MQTT???接下来 手把手教学~

136 阅读8分钟

MQTT技术:开启物联网高效通信新时代

一、引言

在当今数字化飞速发展的时代,物联网(IoT)已经成为推动各行业变革的关键力量。设备之间的高效、可靠通信是实现物联网愿景的基石。在众多通信协议中,MQTT(Message Queuing Telemetry Transport)凭借其轻量级、灵活、可靠等特性,成为了物联网领域的热门选择。今天,我们就来简单了解一下MQTT协议。

二、MQTT的起源与发展历程

MQTT协议诞生于1999年,由IBM的Andy Stanford - Clark和Cirrus Link公司的Arlen Nipper共同开发。当时他们面临石油管道传感器与卫星通信难题,需要一种能在低带宽、不稳定网络环境下高效传输数据的协议,MQTT应运而生。

其发展历程中,最初版本功能简单,随后不断迭代。2014年,MQTT 3.1.1版本发布并成为OASIS协议标准和国际物联网标准;2018年,MQTT 5.0版本首次发布,2019年正式成为OASIS标准,为物联网行业发展提供了更强大支持。

三、MQTT的核心概念与工作原理

3.1 核心概念

  • 发布/订阅模式:这是MQTT的核心。存在发布者、订阅者和代理三个角色。发布者将消息发布到特定主题,订阅者订阅感兴趣的主题,代理负责接收发布者消息并分发给订阅者,实现了发布者和订阅者的解耦。例如智能家居系统中,温度传感器作为发布者将室内温度数据发布到“home/temperature”主题,智能空调作为订阅者订阅该主题,获取数据并调整状态。
  • 主题(Topic):是消息的标识符,分层字符串,用斜杠分隔不同层级。如“factory/area1/machine1/status”。订阅者可用通配符“+”和“#”订阅多个相关主题。
  • 服务质量(QoS)
    • QoS 0:最多一次交付,消息可能丢失但不重复,适用于环境传感器数据等对消息丢失不太敏感的场景。
    • QoS 1:至少一次交付,消息不丢失但可能重复。
    • QoS 2:仅一次交付,保证消息只到达一次,适用于计费系统、即时通讯类APP推送等对消息准确性要求高的场景。
  • 遗嘱消息(Last Will and Testament):客户端连接代理时可指定遗嘱消息,若客户端非正常断开连接,代理会将遗嘱消息发布到指定主题,通知其他订阅者该客户端离线,在实时监控设备状态场景中很有用。
  • 保留消息(Retained Messages):消息发布时设置“保留标志”,代理会保留该消息,新订阅者订阅该主题可立即获取最新保留消息。

3.2 工作原理

  1. 连接建立:客户端通过TCP/IP协议与MQTT代理建立连接,可发送包含客户端ID、用户名、密码、遗嘱消息等信息的连接请求。
  2. 订阅主题:订阅者向代理发送订阅请求,指定主题和服务质量等级,代理将订阅者加入相应主题的订阅列表。
  3. 发布消息:发布者将消息发送到代理,指定主题和服务质量等级,代理根据主题和订阅列表将消息分发给订阅者。
  4. 消息接收:订阅者接收代理转发的消息,根据服务质量等级处理,QoS 1或QoS 2等级的消息需向代理发送确认消息。
  5. 断开连接:客户端完成通信后可向代理发送断开连接请求,释放连接;若客户端异常断开连接,代理通过遗嘱消息通知其他客户端。

MQTT的工作模式可以用以下图示说明: MQTT通信架构

四、MQTT的特点与优势

4.1 特点

  • 轻量级:消息头小,最小报文仅2字节,减少网络带宽使用和设备资源占用,适合资源受限设备和低带宽网络环境。
  • 开放消息协议:开放标准协议,定义了客户端与服务器通信规则,开放性和兼容性好,不同厂商设备和系统可基于此协议开发集成。
  • 双向通信:基于发布/订阅模式,允许设备和云双向消息传递,任何设备、事物或应用程序可发布或订阅代理处理的主题,实现全向通信。
  • 消息无关性:不关心消息负载内容格式,负载可以是任何类型数据,开发者可根据需求选择数据格式,通用性强。
  • 会话感知:提供心跳机制和遗嘱消息机制,确保代理与客户端连接稳定。客户端定期发送心跳消息确认连接有效性,客户端异常断开时,代理通过遗嘱消息通知其他客户端。

4.2 优势

  • 可靠性高:通过三种服务质量等级和重发机制,在不同网络环境下保证消息可靠传输。
  • 可扩展性强:支持大量客户端同时连接和通信,能应对物联网设备数量快速增长,一些MQTT服务器可处理数百万个并发连接。
  • 易于实现和使用:协议设计简洁,社区提供大量客户端库和服务器实现,开发者可轻松集成到项目中,如使用Python的paho - mqtt库几行代码就能实现简单MQTT客户端。
  • 安全性好:支持TLS/SSL加密保护客户端与服务器通信,确保数据安全传输,同时支持用户名和密码认证、客户端证书等多种认证方式,防止未授权访问。
  • 成本低:轻量级特性对设备硬件要求低,降低设备采购成本,减少网络带宽使用,降低通信成本。

五、MQTT的应用场景

5.1 物联网(IoT)

  • 智能家居:各种智能设备通过MQTT协议与中央控制器或云平台高效、可靠通信,实现远程控制、状态监测等功能。如智能灯泡、智能插座、智能门锁等。 智能家居中MQTT的应用
  • 工业自动化:用于设备间数据交换和远程监控,生产线上传感器通过MQTT将采集数据发送给监控系统,实现实时监测和远程控制,提高生产效率和设备可靠性。
  • 农业领域:监测和控制农田灌溉系统、温室环境等,农民通过智能手机或电脑远程监控农田状态,根据信息调整灌溉和通风设备,提高农作物产量和质量。

5.2 实时数据流

  • 金融交易:低延迟特性适合实时更新股票价格、交易信息等金融数据,金融机构通过MQTT协议将市场行情数据快速推送给交易员和投资者,帮助决策。
  • 在线游戏:用于实现游戏中的状态更新和玩家交互,实时同步玩家位置、得分、技能状态等信息,确保玩家游戏体验流畅。

5.3 远程监控

  • 环境监测:监测空气质量、温湿度、水质等环境参数,分布在不同地区的环境监测设备通过MQTT协议将数据实时上传到云端服务器,环保部门通过监控平台了解环境状况,采取措施应对环境污染问题。
  • 设备维护:对各种设备运行状态进行实时监控,如电力设备、通信设备、交通运输设备等,设备出现异常时及时发出警报,通知维护人员检修,减少设备故障影响。

六、MQTT在VUE中的使用实例

6.1 环境准备

首先,我们需要创建一个新的Vue项目。可以选择使用Vue CLI创建项目,命令如下:

vue create vue-mqtt-test

接下来,安装MQTT客户端库,通过命令行使用npm安装:

npm install mqtt --save

6.2 代码实现

以下是一个简单的Vue组件示例,展示了如何在Vue中使用MQTT进行连接、订阅和发布消息:

<template>
  <div>
    <h2>MQTT Example</h2>
    <p v-if="message">{{ message }}</p>
    <input v-model="inputMessage" placeholder="请输入要发布的消息">
    <button @click="publishMessage">发布消息</button>
  </div>
</template>

<script>
import mqtt from 'mqtt'

export default {
  data() {
    return {
      message: '',
      client: null,
      inputMessage: ''
    }
  },
  created() {
    // 连接到MQTT代理
    this.client = mqtt.connect('mqtt://test.mosquitto.org')

    // 订阅主题
    this.client.on('connect', () => {
      this.client.subscribe('test/topic')
    })

    // 处理接收到的消息
    this.client.on('message', (topic, payload) => {
      this.message = payload.toString()
    })
  },
  beforeDestroy() {
    // 断开与MQTT代理的连接
    if (this.client) {
      this.client.end()
    }
  },
  methods: {
    publishMessage() {
      if (this.client && this.inputMessage) {
        // 发布消息到指定主题
        this.client.publish('test/topic', this.inputMessage)
        this.inputMessage = ''
      }
    }
  }
}
</script>

6.3 代码解释

  • 连接到MQTT代理:在created钩子中,使用mqtt.connect方法连接到MQTT代理。这里使用了公共的测试服务器mqtt://test.mosquitto.org
  • 订阅主题:在连接成功后,使用client.subscribe方法订阅test/topic主题。
  • 处理接收到的消息:使用client.on('message')监听接收到的消息,并将消息内容赋值给message变量。
  • 发布消息:在publishMessage方法中,使用client.publish方法将用户输入的消息发布到test/topic主题。
  • 断开连接:在组件销毁前,使用client.end方法断开与MQTT代理的连接。

通过以上步骤,我们就可以在Vue项目中使用MQTT进行实时消息的订阅和发布了。

七、结语

MQTT作为轻量级、高效、可靠的通信协议,在物联网领域广泛应用。其发布/订阅模式、多种服务质量等级和灵活主题机制,为物联网设备通信提供强大支持。随着物联网技术发展和应用场景拓展,MQTT协议将不断优化完善,在未来数字化世界发挥更重要作用。无论是开发者还是企业,都应积极关注和掌握MQTT技术,适应物联网时代发展需求。