I摘要1,MQTT协议
1、MQTT协议能以极少的代码和有限的带宽为连接远程设备提供实时、可靠的消息服务。
2 .使用递送/订阅消息模式来提供消息传递以解除APP应用的耦合。
屏蔽了负载内容的消息传输。
使用TCP/IP提供网络连接。
3、要实现MQTT协议,客户端和服务器端的通信必须完成。 在通信期间,MQTT协议有三种身份:发布者Publish )、代理)、服务器)和订阅。 这里,消息的发布者和订阅者都是客户端,消息代理是服务器,消息的发布者可以同时是订阅者。
4、MQTT转发的消息分为主题和负载两部分。
)1) Topic可以理解为消息的类型,当订阅者订阅时,它将接收该主题的消息内容payload )。
) payload可以理解为消息的内容,是指读者具体使用的内容。
详解一、什么是MQTT? 消息队列嵌入式传输端口MQTT )构建在TCP/IP协议上,MQTT是一种基于1999年发布/订阅模式的轻量级通信协议,它的最大优点是较少作为低开销、低带宽的即时消息传递协议,MQTT广泛用于物联网、小型设备、移动APP应用等方面。
当然,在物联网开发中,MQTT不是唯一的选择,与MQTT竞争的协议包括XMPP和CoAP协议。
应用消息 Application Message
MQTT协议通过网络传输APP应用数据。 当通过MQTT传输APP应用程序消息时,它们具有相关的服务质量QoS )和主题Topic )。
客户端Client
使用MQTT的程序或设备。 客户端始终通过网络连接到服务端。
可以向其他相关客户端发布APP应用程序消息。
订阅并请求接受相关的APP应用程序消息。 要删除应用消息的请求,请取消订阅。 从服务端断开连接。
一般来说,云下的设备==客户端
服务端 Server
充当发送消息的客户机和请求订阅的客户机之间的中介的程序或设备。
服务端接受客户端的网络连接。 接受来自客户端的APP应用程序消息。 处理来自客户端的订阅/取消订阅请求。 将应用消息转发到相应的订阅客户端。
服务端不是数据的终点,只是数据的中继站。)
一般来说,云平台==服务端)
订阅 Subscription
订阅包括“主题过滤器”Topic Filter )和最大服务质量)级别。
订阅与单个“会话”Session )相关联。 会话可以包含多个订阅。 的每个订阅都有不同的主题过滤器。
主题名 Topic
Name是附加到服务端已知且与订阅匹配的APP应用程序消息的标签。 服务端向每个匹配的客户端发送APP应用程序消息的副本。
主题过滤器 Topic Filter
订阅中包含的表达式。 表示相关的一个或多个主题。 主题过滤器可以使用通配符。
会话 Session
客户端和服务端之间的状态交换。 一些会话的时间与网络连接相同。 它还可以在客户端和服务器端的多个连续网络连接之间扩展。
控制报文 MQTT Control Packet
通过网络连接发送的信息包。 MQTT规范定义了14种不同的控制消息,其中一种消息是PUBLISH消息,用于传输APP应用程序消息。
ASCII:0~31和127 共计33个字符)为控制字符或通信专用字符其余为可显示字符32~126 共计95个字符)为字符) 32为空格),其中48~57为0~90个阿拉伯数字。 65~90为英语大写26个字符,97~122号为英语小写26个字符,剩下的为标点符号、运算符号等。 GBK :汉字内码扩展规范国标)。 采用单/双字节可变长度编码,完全兼容的AsCH字符编码英语采用单字节编码,中文部分采用双字节编码。 utf-8 :面向unicode的可变长度字符编码,也称为万国码。 UTF-8以1到6个字节对uni代码字符进行编码。 它可以表示简体中文和其他语言英语、日语、韩语等)。 注意:即使是同一汉字,对应的数值/长度也因代码而异。 例如,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。至于每一个消息类型会携带什么内容。
异步发布/订阅实现
发布/订阅模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。
这个模式有以下好处:
发布者与订阅者只需要知道同一个消息代理即可发布者和订阅者不需要直接交互发布者和订阅者不需要同时在线
JSON
JSON中文全称是JavaScript对象标记语言,在这门语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。其语法规则是:
对象表示为键值对;数据由逗号分隔;花括号保存对象;方括号保存数组。
JSON层次结构简洁清晰,易于阅读和编写,同时也易于机器解析和生成,有效提升网络传输效率。
对于单片机开发者,主流的微控制器软件开发工具Keil有提供JSON库,可以用于STC、STM32等微控制器开发,所以在微控制器上解析JSON不需要自己写一个JSON解析器或者移植了。
如果实在懒得使用JSON库生成或解析,也可以直接使用C语言中的sprintf生成JSON字符串,比如:
sprintfbuf, “{\”String\”:\”%s\”, \”Value\”:%d}”, “Hello World!”, 12345);
超级详细的MQTT协议教学:
百度网盘链接:https://pan.baidu.com/s/1beAq8LlHRxjVIXe9it_jKA
提取码:qtzs