浅谈物联网开发最热协议—MQTT协议

简介: 浅谈物联网开发最热协议—MQTT协议

 

MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。

目录

MQTT是什么?

什么是发布/订阅?

MQTT属于哪一层协议?

MQTT协议通信模型

消息主题

服务质量定义

MQTT客户端的功能

MQTT服务器的功能

MQTT协议会话

MQTT协议的报文详情


Hello,大家好,我是灰小猿!

最近在在物联网相关项目的开发的时候,有用到物联网常用的通信协议--MQTT协议,刚开始对这一块的知识并不是很了解,所以在这里一边学习一边记录,有不合理的地方还希望能多多指正。

MQTT是什么?

MQTT协议全称是(Message Queuing Telemetry Transport),即消息队列遥测传输协议

是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也是具有高可靠、低开销的特点,之所以低开销,是以为MQTT协议传输的最小的报文也只有两个字节。

什么是发布/订阅?

我们在上面说到,MQTT协议是一种基于发布/订阅模式的轻量级通讯协议,那么什么是订阅和发布呢?

订阅&发布

订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(Qos)等级,订阅与单个会话(Session)关联,会话可以包含多于一个的订阅,会话的每一个订阅都有一个不同的主题过滤器。

我们拿抖音平台来举个例子,我们每一个用户就都是一个客户端,而抖音就是MQTT协议中的服务器,当我们(用户一)关注某一个用户(用户二)时,这样一个关注的行为就可以理解为订阅;同时用户二也可以关注你,那么这就是相互订阅。当用户二发布作品的时候,这个作品是发布到了抖音平台,也就是我们现在的服务器,这个过程就是消息的发布。

在这里需要注意的是:用户二(客户端)发布的消息并不是直接发布给了用户一,而是发布到了抖音平台(服务器),由于用户一订阅了用户二的消息,所以抖音平台(服务器)就会向用户一推送。这就是MQTT协议订阅&发布的一个简单比喻。

image.gif编辑

MQTT属于哪一层协议?

MQTT协议是构建于TCP/IP协议之上的,同时TCP/IP参考模型可以分为四层:

应用层 传输层 网络层 链路层

image.gif编辑

而MQTT协议运行于TCP协议之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT协议。

MQTT协议通信模型

MQTT协议是基于<客户端-服务器>模型设计的,

主要有三种身份:发布者(publisher)、服务器(broker)、订阅者(subscriber)

同时“发布者”和“订阅者”均属于客户端的范畴。

image.gif编辑

消息主题

主题(Topic):是附加在消息上的一个标签,该标签与服务器中的所有订阅相匹配,服务器会将消息转发给与标签相匹配的每个客户端(订阅者)。

在这里主题(Topic)就可以理解为你抖音用户的“网名”,只有我们订阅了该“网名”,才能通过服务器进行数据的交互,所以在这里我们就可以将服务器理解为一个“中转枢纽”,用户一将“作品”(消息)发布到这个“中转枢纽”(服务器),之后服务器再将该作品推送给订阅了该用户一的粉丝用户二。

主题过滤器(Topic Filter):订阅中包含的一个表达式,用于表示相关的一个或多个主题,主题过滤器可以使用通配符。在这里我的理解就是存放订阅的主题的一个集合,集合中有该主题则推送消息给客户端,没有则不会推送。

服务质量定义

    1. QoS0:最多发送一次消息
    2. QoS1:最少发送一次消息(消息最少需要送达一次,也有可能送达多次)
    3. QoS2:最高等级的服务质量,有且只有一次

    MQTT协议服务质量定义

    Qos值 Bit2 Bit1 描述
    0 0 0 最多分发一次
    1 0 1 至少分发一次
    2 1 0 只分发一次

    MQTT客户端的功能

      1. 发布消息给其它相关客户端
      2. 订阅主题请求接收相关的应用消息
      3. 取消订阅主题请求移除接收应用消息
      4. 从服务器终止连接

      MQTT服务器的功能

        1. 接受来自客户端的网络连接请求
        2. 接受客户端发布的应用消息
        3. 处理客户端的订阅和取消订阅请求
        4. 转发应用消息给符合条件的已订阅客户端(包括发布者自身)

        MQTT协议会话

        客户端与服务器之间的状态交互

        一些会话的持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接之间扩展。

        MQTT协议的报文详情

        报文

        描述

        流向

        固定报头

        可变报头

        负载

        CONNECT

        客户端请求与服务器端建立连接

        C->S

        1

        CONNACK

        服务器端确认建立连接

        S->C

        2

        PUBLISH

        发布消息

        C<->S

        3

        PUBACK

        收到发布消息确认(QoS1等级)

        C<->S

        4

        PUBREC

        发布消息收到(QoS2等级)

        C<->S

        5

        PUBREL

        发布消息释放(QoS2等级)

        C<->S

        6

        PUBCOMP

        发布消息完成(QoS2等级)

        C<->S

        7

        SUBSCRIBE

        订阅请求

        C->S

        8

        SUBACK

        订阅确认

        S->C

        9

        UNSUBSCRIBE

        取消订阅

        C->S

        10

        UNSUBACK

        取消订阅确认

        S->C

        11

        PING

        客户端发送PING(连接保活)命令

        C->S

        12

        PINGRSP

        PING命令回复

        S->C

        13

        DISCONNECT

        断开连接

        C->S

        14

        好了,关于MQTT协议的这些基本概念就先分享这些。有错误的地方还希望大佬能够批评改正,之后关于MQTT的相关学习也会再继续更新。

        觉得不错记得点赞关注哟!

        大灰狼期待与你一同进步!

        image.gif编辑

        相关实践学习
        RocketMQ一站式入门使用
        从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
        消息队列 MNS 入门课程
        1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
        目录
        相关文章
        |
        2月前
        |
        消息中间件 物联网 网络性能优化
        MQTT常见问题之MQTT不支持5.0的协议如何解决
        MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
        |
        2月前
        |
        消息中间件 网络协议 物联网
        MQTT常见问题之物联网设备端申请动态注册时MQTT服务不可用如何解决
        MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
        |
        2月前
        |
        XML 编解码 JSON
        【开源视频联动物联网平台】协议包管理
        【开源视频联动物联网平台】协议包管理
        37 1
        |
        2月前
        |
        消息中间件 边缘计算 物联网
        【开源视频联动物联网平台】如何解决物联网协议多样性问题
        【开源视频联动物联网平台】如何解决物联网协议多样性问题
        61 0
        |
        2月前
        |
        负载均衡 网络协议 安全
        【开源视频联动物联网平台】SIP协议的特点
        【开源视频联动物联网平台】SIP协议的特点
        37 1
        |
        2月前
        |
        编解码 移动开发 流计算
        【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点
        【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点
        40 2
        |
        2天前
        |
        传感器 存储 物联网
        【C 言专栏】基于 C 语言的物联网开发
        【5月更文挑战第6天】C 语言在物联网发展中扮演关键角色,适用于开发嵌入式系统、通信协议及云平台后端服务。其高效、灵活、可移植的特性适应资源有限的环境,确保设备兼容性。尽管开发挑战较大,如代码可读性,但借助辅助工具可改善。随着物联网技术进步,C 语言将持续发挥重要作用,塑造智能未来。
        【C 言专栏】基于 C 语言的物联网开发
        |
        2月前
        |
        监控 网络性能优化 网络安全
        【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
        【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
        38 1
        |
        2月前
        |
        Java Maven
        【开源视频联动物联网平台】vertx写一个mqtt客户端
        【开源视频联动物联网平台】vertx写一个mqtt客户端
        42 1
        |
        2月前
        【开源视频联动物联网平台】vertx写一个mqtt服务端
        【开源视频联动物联网平台】vertx写一个mqtt服务端
        22 1

        相关产品

      1. 物联网平台