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);

超级详细的MQTT协议教学:
百度网盘链接:https://pan.baidu.com/s/1beAq8LlHRxjVIXe9it_jKA
提取码:qtzs

MQTT协议(概括与详解)相关推荐

  1. STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

    STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解 上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法 上一篇地址https ...

  2. MQTT协议及安全详解

    1.MQTT概念 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协 ...

  3. HTTP协议状态码详解(HTTP Status Code)

    HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成功返回网页 ...

  4. SSL / TLS 协议运行机制详解

    转载自  SSL / TLS 协议运行机制详解 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想 ...

  5. 虚拟路由器冗余协议VRRP原理详解!

    虚拟路由器冗余协议VRRP原理详解! https://virtual.51cto.com/art/201905/596666.htm?pc 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前 ...

  6. HTTP协议状态码详解(HTTP Status Code)(转)

    原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为:  200 – 服务器 ...

  7. 流媒体协议之RTMP详解

    流媒体协议之RTMP详解 文章目录 流媒体协议之RTMP详解 1 RTMP概述 2 RTMP交互过程 2.1 握手协议 2.2 RTMP分块(chunk) 2.3 协议控制消息(Protocol Co ...

  8. 流媒体协议之RTSP详解

    1 流媒体协议之RTSP详解 文章目录 1 流媒体协议之RTSP详解 1.1 RTSP概述 1.2 RTSP协议交互过程 1.2.1 RTSP基于TCP交互过程 1.2.2 RTSP基于HTTP的交互 ...

  9. 传输协议之ICMP详解

    文章目录 TCP和UDP ICMP 简介 ICMP出现的原因 ICMP的用途 ICMP作为IP的上层协议在工作(报文) ICMP实现之MTU探索 ICMP实现之改变路由 ICMP实现之源点抑制 ICM ...

最新文章

  1. java url加密解密,java URL 编码解码,该如何解决
  2. R 中的哪些命令或者包让你相见恨晚?--转载知乎
  3. 【Java】Integer.valueOf()
  4. 用WebCollector爬取新浪微博数据
  5. C++98C++11的区别
  6. 一种User Mode下访问物理内存及Kernel Space的简单实现
  7. 如何使用jstack分析线程状态
  8. 实现tomcat的https单向认证及双向认证
  9. 关于ArcGIS动态图层空间内栅格数据,JS前端显示颜色不正确的解决方案
  10. sync是同步还是非同步_高速AD项目学习笔记——实现sync同步的经验
  11. SWD离线烧写器(完全开源)
  12. easypanel b.php,KangleWebServer Easypanel API接口详解
  13. 圣科车衣,给予您的爱车完美守护
  14. 2022人才市场洞察及薪酬指南
  15. BUU刷题记录(四)
  16. Matlab幂律变换及直方图均衡化
  17. fstream用法总结
  18. 一张图认识IPSec,区分IKE SA(ISAKMP SA)和IPSec SA
  19. 刚开始学java ,java代码开头的几行都是什么意思?
  20. Python编程:从入门到实践 课后习题-第十一章 测试代码

热门文章

  1. Symbian 模拟器在Vista Win7下无法正常启动
  2. 交叉编译openblas库
  3. Ubuntu与WIndows桌面间切换
  4. CoinRobots的马丁格尔是怎么实现的?
  5. php实现图片上传和显示,上传和显示图片 - php - 生活点滴
  6. 【Vegas转帖】外企九年
  7. Docker安装halo
  8. Solidity学习记录——第二章
  9. PMP的在国内有用吗?含金量多高?
  10. CSS常用技巧(元素显示隐藏、用户界面样式、垂直对齐、溢出文字省略号显示、精灵技术、滑动门、margin负值之美和css三角之美)