笔者相信大家对HTTP一定不能陌生。"HTTP协议的三次握手四次挥手"相信也略有耳闻。HTTP协议的优势相信大家都明白。不然他不会这流行。然而这并不能忽略他的缺点。最大的特点就是无状态。有没有人做过推送的业务。这个时候用HTTP协议显然是多么SB的事情。笔者有见过一款手机APP。他即然是在客户端那边开起一个后台线程然后每一段时间去请求一下服务器,来更新客户端的信息。不是说不行,可是你们不觉得这样做太伤了吗?HTTP协议是请求/响应的模式进行的。当然这样子很简单,但优缺点也很明显。也许可能这就是出现很多通信协议——XMAP协议、MQTT协议、CoAP协议等。最近笔者因为公司任务不得不去了解一下MQTT协议。所以才会有了这一系列的出现。

如果读者们在百娘上面查找MQTT的话,就会出现很多关于MQTT的介绍。下面是笔者常用的几个网站。

中文MQTT站点:https://www.gitbook.com/book/mcxiaoke/mqtt-cn/details

英文MQTT站点:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect

博客MQTT站点:http://www.steves-internet-guide.com/mqtt/

在这里笔者建议还是要去看英文的。中文的有一些解释看起来蛋疼。当然也有一些中文的博客介绍的也不错。

在很多的资料中介绍MQTT协议用于低端的产品比较适合。所以常常会看到他与物联网一起出现。他是以发布/订阅的模式进行的。如图下

从图上我们可以对MQTT有一个大概的了解。原来MQTT有要三种角色的存在。

Broker代理:很多人理解为中间件,当然可以这样子认为。他就是一个中间件。用于处理信息并发送到相应的订阅者。

发布者:用于发布信息到代理上面。注意:发布者也可以是订阅者。

订阅者:就是用于接受信息的客户端。

事实上,在他们通信之间,还需要用一叫“主题”的概念。主题就是用于订阅者需要什么信息。或是理解为订阅者对哪种信息感兴,然后就订阅对应的主题,这样子订阅者就能够接受到相应的主题信息。这样子相信大家对MQTT就了一个很深的概念了。

MQTT协议和HTTP协议一样子都是基于TCP/IP网络协议上来进行的。同时在消息的传输上又做了三种模式的规定——分别为:最多一次、至少一次、只有一次。即然是通信,那么通信包的设计是少不了的。通信包是以二进字流进行的。

我们都知道HTTP协议里面一个请求就是有一个对应的响应回来。而MQTT也可以这样子讲,只是这里要换另一种说法——一个请求就要一个确定。这一点可以从他相关的命令就可以看出。如图下。

我们可以看到连接(CONNECT),有一个连接确定(CONNACK)。发布(PUBLISH),有一个发布确定(PUBACK).只有最后的关闭(DISCONNECT)没有对应的确定。这个在协议里面已经说明了。当客户端发来一个关闭的请求的时候,服务端不必要回应一个确定给客户端。读者一定以为PINGGREQ也没有。不要误会!PINGRESP事实上也是一种确定。PINGGREQ用于确定客户端是不是还连接着。(注:ACK是Acknowledgement的缩写)

MQTT从宏观上来看的话,可以分为客户端和服务器。笔者在学习的过程试过几个。也试着去查看他的源码。只是可惜笔者只是对C#、JAVA比较在行。其他开发语言就不行了。所以笔者这里只介绍自己看过并了解过的服务器。至于客户端的话,你们可以随便找很多。

mosquitto:是用C/C++开发语言编写的。据说是目前最流行的MQTT代理。(https://mosquitto.org/)

ActiveMQ:不好意思。这个不是专门为MQTT协议而写的。是多个协议的。所以笔者不是很喜欢。同时有人说他是纯JAVA编写的。不要被骗了里面还是有SCALA语言的。(http://activemq.apache.org/)

Apollo:这是ActiveMQ的子项目。听说目前停止维护。笔者略看了一下代码。不好意思。又不是纯JAVA大部分是SCALA。(http://activemq.apache.org/apollo/index.html)

HiveMQ:是商业的MQTT。为什么笔者要提他呢?主要他有很多可以参考的意义。(https://www.hivemq.com/mqtt/)

想要了解更多的信息可以去网站(https://github.com/mqtt/mqtt.github.io/wiki/servers)里面相关MQTT客户端和服务端的开源介绍和说明。

学习MQTT最好的方式就是代一个开源的项目。不管是客户端还是代理端的都要。然后一边查看源码一边查看官方的协议文档。当然也有一些工具可以帮你略去写客户端的代码。如MQTTLens就是笔者常的。他是一个GOOGLE插件。

MQTT——入门介绍的更多相关文章

  1. (转)MQTT 入门介绍

    原文链接:https://blog.csdn.net/qq_2887... MQTT 入门介绍 一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测 ...

  2. MQTT 入门介绍——菜鸟教程

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  3. MQTT入门介绍

    一简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级&q ...

  4. MQTT 入门介绍

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  5. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  6. 初识Hadoop入门介绍

    初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...

  7. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...

  8. [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  9. JavaScript入门介绍(二)

    JavaScript入门介绍 [函数] 函数function 是Javascript的基础模块单元,用于代码的复用.信息影藏和组合调用. function a(){} 函数对象Function Lit ...

随机推荐

  1. 201521123110 《JAVA程序设计》第3周学习总结

    1.本章学习总结 ` ` 2.书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  2. Java程序设计第三周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  3. 201521123055 《Java程序设计》第2周学习总结

     1. 本章学习总结 (1)认识PATH和CLASSPATH (2)SET PATH/CLASSPATH和-cp的用法 (3)了解BigDecimal.BigInteger.ArrayList/Lis ...

  4. evak购物车--团队博客

    1. 团队名称.团队成员介绍(需要有照片) 团队名称:evak 团队成员介绍:陈凯欣,计算机工程学院网络工程1512,学号为201521123034:邱晓娴,计算机工程学院网络工程1512,学号为20 ...

  5. 201521123011《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  6. linux各类压缩解压命令大全

    01-.tar格式解包:[*******]$ tar xvf FileName.tar 打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩 ...

  7. 静态页面如何实现 include 引入公用代码

    一直以来,我司的前端都是用 php 的 include 函数来实现引入 header .footer 这些公用代码的,就像下面这样: <!-- index.php --> <!DOC ...

  8. 600集Python从入门到精通教程(懂中文就能学会)

    目录大纲: 本套教程15天 1-3   天内容为Linux基础命令 4-13  天内容为Python基础教程 14-15 天内容为 飞机大战项目演练 视频概括: 第一阶段(1-3天): 该阶段首先通过 ...

  9. 如何安装和配置 Rex-Ray?- 每天5分钟玩转 Docker 容器技术(74)

    Rex-Ray 是一个优秀的 Docker volume driver,本节将演示其安装和配置方法. Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上,安装方法很简单, ...

  10. C#的"?"修饰符和"??"运算符

    一.  ?  可空类型修饰符 “?”用来修饰为空的值类型,在加上“?”修饰符后,值类型也可以为空了,如: public int? CommandTimeout { get; }: var prop = ...