分享

MQTT协议(概括与详解)

 yliu277 2022-05-15

I概括

一,MQTT协议

1、MQTT协议可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

2、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
对负载内容屏蔽的消息传输。
使用 TCP/IP 提供网络连接。

3、实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
在这里插入图片描述

4、MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)。
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
在这里插入图片描述

II详解

一、MQTT是什么?

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。

当然,在物联网开发中,MQTT不是唯一的选择,与MQTT互相竞争的协议有XMPP和CoAP协议等,

应用消息 Application Message

MQTT协议通过网络传输应用数据。应用消息通过MQTT传输时,它们有关联的服务质量(QoS)和主题(Topic)。

客户端Client
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。
它可以发布应用消息给其它相关的客户端。
订阅以请求接受相关的应用消息。取消订阅以移除接受应用消息的请求。从服务端断开连接。
一般情况,云下设备==客户端

服务端 Server
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。
服务端接受来自客户端的网络连接。接受客户端发布的应用消息。处理客户端的订阅和取消订阅请求。转发应用消息给符合条件的已订阅客户端。
(服务端不是数据的终点,它只是数据的中转站)
(一般情况下,云平台==服务端)

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

主题名 Topic
Name附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。

主题过滤器 Topic Filter
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。

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

控制报文 MQTT Control Packet
通过网络连接发送的信息数据包。MQTT规范定义了十四种不同类型的控制报文,其中一个(PUBLISH报文)用于传输应用消息。

ASCII:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

GBK:汉字内码扩展规范(国标)。
采用单/双字节变长编码,完全兼容AsCH字符编码英文使用单字节编码,中文部分采用双字节编码。

UTF-8:是一种针对 Un i code的可变长度字符编码,又称万国码。

UTF-8用1到6个字节编码 Uni code字符。
可以表示中文简体繁体及其它语言(如英文,日文,韩文)。

注意:即使是同一个汉字,在不同的编码中所对应的数值/长度是不同的(如:GBK/UTF-8安信可IDE默认是GBK编码,MTT规定为UTF-8编码。
如果使用安信可编译器编程发送汉字,需将安信可IDE的编码方式设为UTF-8。

清理会话 Clean Session
当MTT客户端接入MTT服务端时,选择是否继续之前的会话。
如果不清理会话,MTT服务端会在之前交互的基础上,继续交互如果清理会话,MTT服务端必须新建一个全新的会话。

二、MQTT的特点

消息质量(QoS)

MQTT消息质量有三个等级,QoS 0,QoS 1和 QoS 2。

QoS 0:最多分发一次。消息的传递完全依赖底层的TCP/IP网络,协议里没有定义应答和重试,消息要么只会到达服务端一次,要么根本没有到达。
QoS 1:至少分发一次。服务器的消息接收由PUBACK消息进行确认,如果通信链路或发送设备异常,或者指定时间内没有收到确认消息,发送端会重发这条在消息头中设置了DUP位的消息。
QoS 2:只分发一次。这是最高级别的消息传递,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。

eg.
目前流行的共享单车智能锁,智能锁可以定时使用QoS level 0质量消息请求服务器,发送单车的当前位置,如果服务器没收到也没关系,反正过一段时间又会再发送一次。之后用户可以通过App查询周围单车位置,找到单车后需要进行解锁,这时候可以使用QoS level 1质量消息,手机App不断的发送解锁消息给单车锁,确保有一次消息能达到以解锁单车。最后用户用完单车后,需要提交付款表单,可以使用QoS level 2质量消息,这样确保只传递一次数据,否则用户就会多付钱了。

MQTT的消息类型(Message Type)

固定报文头中的第一个字节包含连接标志(Connect Flags),连接标志用来区分MQTT的消息类型。MQTT协议拥有14种不同的消息类型(如表2),可简单分为连接及终止、发布和订阅、QoS 2消息的机制以及各种确认ACK。至于每一个消息类型会携带什么内容。

在这里插入图片描述
异步发布/订阅实现

发布/订阅模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。
这个模式有以下好处:

  1. 发布者与订阅者只需要知道同一个消息代理即可

  2. 发布者和订阅者不需要直接交互

  3. 发布者和订阅者不需要同时在线

JSON

JSON中文全称是JavaScript对象标记语言,在这门语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。其语法规则是:

对象表示为键值对;
数据由逗号分隔;
花括号保存对象;
方括号保存数组。

JSON层次结构简洁清晰,易于阅读和编写,同时也易于机器解析和生成,有效提升网络传输效率。

对于单片机开发者,主流的微控制器软件开发工具Keil有提供JSON库,可以用于STC、STM32等微控制器开发,所以在微控制器上解析JSON不需要自己写一个JSON解析器或者移植了。

如果实在懒得使用JSON库生成或解析,也可以直接使用C语言中的sprintf生成JSON字符串,比如:

sprintf(buf, '{\'String\':\'%s\', \'Value\':%d}', 'Hello World!', 12345);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多