文章目录
- 1、什么是MQTT?
- [2、 MQTT在整个物联网通信中的位置](#2、 MQTT在整个物联网通信中的位置)
-
- [2.1 系统架构与MQTT位置详解](#2.1 系统架构与MQTT位置详解)
- [2.2 水泵MCU ⇄ WiFi模组(无MQTT)](#2.2 水泵MCU ⇄ WiFi模组(无MQTT))
- [2.3 WiFi模组 ⇄ 阿里云物联网平台(MQTT的核心)](#2.3 WiFi模组 ⇄ 阿里云物联网平台(MQTT的核心))
- [2.4 阿里云物联网平台(MQTT Broker)](#2.4 阿里云物联网平台(MQTT Broker))
- [2.5 阿里云物联网平台 ⇄ 手机App(通常无MQTT)](#2.5 阿里云物联网平台 ⇄ 手机App(通常无MQTT))
1、什么是MQTT?
MQTT到底是什么呢?
先附上百度百科的解释:
MQTT(消息队列遥测传输,Message Queuing Telemetry Transport)是一种基于发布/订阅范式的轻量级消息传输协议,由 IBM 与 Eurotech 于 1999 年提出,现已成为国际标准(ISO/IEC 20922:2016) 。该协议专为计算资源受限、带宽有限以及网络连接不稳定的设备设计,具有报文结构简洁、功耗低、传输可靠等特点,能够在复杂环境中实现高效通信。凭借其轻量、高效、易实现的特性,MQTT 已成为物联网(IoT)与机器到机器(M2M)通信领域的主流协议之一,广泛应用于智能家居、车联网、工业控制、远程医疗等场景。
下面我用个人的方法简单介绍一下MQTT(谨代表个人观点):
其实用一个简单的例子进行概括:MQTT可以看作是一种为物联网设备设计的"微信群"协议。 它可以让设备之间能高效、可靠地互相传递消息。
如果把一个物联网比作一个微信群,那么
-
群主(MQTT Broker):
- 这是一个服务器(比如阿里云物联网平台),所有信息都汇总到这里,再由它分发。它负责管理整个"群"。
-
群成员(MQTT Clients):
- 这可以是我的水泵WiFi模组 ,也可以是手机App后台,或者其他任何设备。它们都加入了这个群。
-
话题(Topic):
- 群里可以有很多话题 ,比如
#水泵状态汇报和#水泵控制命令。 - 设备不用直接互相联系,只需要关注自己感兴趣的话题。
- 群里可以有很多话题 ,比如
-
发布消息(Publish):
- 比如如果我的的水泵 想汇报状态了,它就在
#水泵状态汇报这个话题下发布一条消息:"我当前压力是1.2,一切正常"。 - 它只管发出去,不用管谁在看。
- 比如如果我的的水泵 想汇报状态了,它就在
-
订阅消息(Subscribe):
- 云端服务或者手机App后台订阅 了
#水泵状态汇报这个话题。一旦有设备在这个话题下发布新消息,群主(Broker)就会立刻把消息推送给所有订阅者。 - 同样,手机App想控制水泵时,就在
#水泵控制命令这个话题下发布一条"请把压力调到1.5"。而我的水泵WiFi模组订阅了这个话题,所以它能立刻收到这条命令。
- 云端服务或者手机App后台订阅 了
那么,MQTT为什么适合物联网呢?
- 轻量高效:协议设计得非常简洁,数据包很小,特别适合(比如水泵上)这种计算能力和网络带宽都有限的设备。
- 发布/订阅模式 :设备之间不直接连接,解耦了发送方和接收方。发送者不知道也不关心谁接收,接收者也不知道消息来自哪台具体设备,非常灵活。
- 可靠传递:它有"服务质量"等级。比如,对于重要的命令,可以设置为"确保对方收到",防止因网络问题丢失指令。
- 适合弱网络:专门为不稳定的网络(如移动网络、WiFi)设计,连接断了会自动尝试重连。
2、 MQTT在整个物联网通信中的位置
以我的应用场景(水泵)为例,水泵上有MCU和庆科的wifi模组,,MCU向wifi模组发消息,wifi模组将消息发送给阿里云物联网平台,然后再云智能手机app中就能看到相关的状态信息了。如下图所示,那么mqtt是存在于哪一部分呢?

从图中可以看到,MQTT是存在于wifi模组向阿里云通信的过程中。
2.1 系统架构与MQTT位置详解
其实我的系统架构可以划分为以下几个部分,
[水泵MCU] <---> [WiFi模组] <---(MQTT over WiFi)---> [阿里云物联网平台] <---(非MQTT)---> [手机App]
│ │ │ │
│ │ │ │
(串口通信) (实现MQTT客户端) (MQTT Broker) (通常使用HTTP/WebSocket)
2.2 水泵MCU ⇄ WiFi模组(无MQTT)
- 通信方式 :串口通信,通常是UART。
- 通信协议 :自定义的简单数据协议。
- 具体过程 :
- MCU通过串口发送一条简单的数据帧给WiFi模组。例如,它可能只发送:
TEMP:25.6,PRESS:1.2,STATUS:OK\n。 - 这个阶段没有MQTT。MCU完全不需要知道MQTT是什么,它只负责采集数据和执行控制,并通过最简单的方式与WiFi模组"对话"。
- wifi模组的固件会解析这条串口指令,将其转换为内部数据结构。
- MCU通过串口发送一条简单的数据帧给WiFi模组。例如,它可能只发送:
2.3 WiFi模组 ⇄ 阿里云物联网平台(MQTT的核心)
这是整个系统中最关键的一环,MQTT就运行在这里。
- 通信方式 :WiFi → 互联网 → 阿里云。
- 通信协议 :MQTT over TCP/IP。
- WiFi模组的角色 :它是一个内置了MQTT客户端的智能模组 。
- 它内部已经烧录了固件,这个固件完成了所有复杂的网络和MQTT协议处理。
- 它的工作流程如下 :
- 初始化 :上电后,模组根据预置的或MCU下发的
ProductKey,DeviceName,DeviceSecret(设备三元组)等信息。 - 建立连接 :模组通过WiFi连接到互联网,然后作为一个MQTT客户端,与阿里云的MQTT Broker(消息代理服务器)建立TCP连接,并进行鉴权登录。
- 数据转换与发布 :
- 当它从串口收到MCU发来的
"TEMP:25.6..."数据后,固件程序会将这些数据打包成一个符合阿里云格式的JSON对象。 - 例如:
{"params": {"Temperature": 25.6, "Pressure": 1.2, "Status": "OK"}} - 然后,模组的MQTT客户端将这个JSON数据发布 到一个特定的MQTT Topic 上,比如
/sys/${productKey}/${deviceName}/thing/event/property/post。
- 当它从串口收到MCU发来的
- 命令接收与转发 :
- 同时,模组的MQTT客户端会订阅 另一个用于接收云端命令的Topic,比如
/sys/${productKey}/${deviceName}/thing/service/property/set。 - 当手机App下发控制命令时,阿里云Broker会通过这个Topic将消息推送给模组。
- 模组收到MQTT消息后,解析出其中的命令(例如
{"Pressure": 1.5}),然后将其转换回简单的串口指令 发送给MCU,比如SET_PRESS:1.5。
- 同时,模组的MQTT客户端会订阅 另一个用于接收云端命令的Topic,比如
- 初始化 :上电后,模组根据预置的或MCU下发的
所以,WiFi模组其实就是一个"协议转换器",它把简单的串口协议"翻译"成了标准的、复杂的MQTT协议,并与云端通信。
2.4 阿里云物联网平台(MQTT Broker)
- 角色 :它是整个MQTT通信的中枢大脑(Broker)。
- 功能 :
- 接受所有设备的MQTT连接。
- 验证每个设备的身份(通过三元组)。
- 接收设备发布到某个Topic的消息。
- 将消息转发给所有订阅了该Topic的客户端(在这个场景里,订阅者不是另一个设备,而是云端的后台服务)。
2.5 阿里云物联网平台 ⇄ 手机App(通常无MQTT)
- 通信方式 :HTTP/HTTPS 或 WebSocket。
- 原因 :
- 手机App运行在用户多变的网络环境下(移动网络、WiFi切换),直接维护一个长连接的MQTT客户端比较复杂且耗电。
- 对于"查询状态"这类操作,HTTP的"请求-响应"模型更简单直接。
- 对于"实时推送"控制命令或状态更新,App通常会建立一个到应用服务器的WebSocket长连接,或者使用苹果/谷歌的原生推送服务。
- 具体过程 :
- 手机App通过调用阿里云提供的HTTP API向云端服务请求设备的最新状态。
- 云端服务收到请求后,可以去阿里云IoT平台查询,或者从平台已经持久化到数据库的数据中获取,再返回给App。
- 当App下发控制命令时,也是通过HTTP API将命令发送到云端服务,云端服务再通过调用阿里云IoT平台的API,最终以MQTT消息的形式下发到设备。