话说很久很久以前有个叫做IBM的部落里生活着一个年青的猎人小明,他深深的爱上了100公里外一个部落酋长的女儿小红。为了追求小红,小明每天都用兽皮写上一封情书然后翻山越岭的给小红送去。刚开始的时候小明每每想到小红的花容月貌浑身上下就充满了动力,唱着山歌足不点地一路奔驰在通往爱情的山道上。
MQTT是 Message Queuing Telemetry Transport 的英文缩写意思是 消息队列遥测传输 是IBM开发的一个即时通讯协议。它是一种轻量级的、基于代理的 发布/订阅 模式的消息传输协议。其具有协议简洁、小巧、可扩展性强、省流量、省电等优点,而且已经有PHP,JAVA,Python,C,C#等多个语言版本,基本可以使用在任何平台上,几乎可以把所有联网物品和外部连接起来,所以特别适合用来当做物联网的通信协议。
我想大部分读者在第一次看到MQTT这个概念的时候都会和笔者一样一头雾水不知所云。那么这个充满神秘色彩的词语到底是个什么东东呢?基于MQTT协议的网络通信和传统的网络通信有什么区别呢?先别着急下面笔者先跟大家分享个小故事。
话说很久很久以前有个叫做IBM的部落里生活着一个年青的猎人小明,他深深的爱上了100公里外一个部落酋长的女儿小红。为了追求小红,小明每天都用兽皮写上一封情书然后翻山越岭的给小红送去。刚开始的时候小明每每想到小红的花容月貌浑身上下就充满了动力,唱着山歌足不点地一路奔驰在通往爱情的山道上。
可是时间久了小明开始发现自己打猎的时间变少了, 服不服猎手排行榜 也已经好几期没有上榜了。 没关系,和伟大的爱情比起来生活苦一点又算得了什么呢! 小明这样安慰自己。
但是没多久事情起了变化,小红的父王在一次打猎的时候被老虎咬死了,小红在悲伤之后也只好让出了以前住的固定的房子(固态IP)。因为那个时候房子建造不易,但是部落中每天都有人会外出打猎,剩余的人就分着住部落中的房子,所以每个人住的房子可能会随着时间的不同而产生变化的。小红的父王死后小红不再享有特权也只好跟着大家出去打猎,每天动态的住着房子(动态IP)。
于是小明的送信过程开始变得复杂起来,他每天送信来的时候都需要先跑到部落的卫兵那里问, 小红在吗? 如果小红外出打猎了小明只能满载着忧伤一步一回头的返回自己的部落,如果正好小红回来了还需要卫兵帮忙打听小红现在住在哪个房间,这样小明满载着浓浓爱意的情书才能送达小红的手里。
也许是小红开始慢慢的体会到了生活的艰辛想要找一个宽厚的肩膀依靠了吧,又或是她终于被小明的诚意打动,小红开始慢慢的给小明回信了。可是坚贞的爱情总需要历尽坎坷,有时候小明来送信的时候小红有可能已经出去打猎了,又有时候小红想给小明回信却总是因为刮风、下雨、泥石流小明没办法来。
渐渐的,小红和小明的爱情感动了卫兵,卫兵很想帮助他们,于是就跟他们说,如果以后小明来的时候小红不在你就把信交给我吧,我帮你转达,如果小红出去打猎也可以把信给我等小明来的时候我一起交给他。这样虽然你们还是经常见不了面,但看看信也总是可以稍解相思之苦埃自此以后小红和小明的通信终于又再次恢复了正常。
时光荏苒,小明和小红终于到了谈婚论嫁的地步了,可是小明总是奔波在送信取信的路上都没什么时间打猎了,如果小明一直这样的话估计是永远也不可能攒够十头牛的彩礼了。于是小明和小红商议, 我该为我们的幸福努力了,从今以后我找一个信差为我们送信吧。短暂的别离是为了长久的相遇,红红等着我,我会尽快来娶你! 小红满含着泪水在石头上刻下两行字 两情若是久长时,又岂在朝朝暮暮 ,然后在夕阳的余晖中送走了她的小明明。很久很久的以后有一位考古学家在一个后世叫做鹊桥的地方发现了这块石刻,从此成为千古名句,当然,这是后话。
因为不用每天跑上两百公里的山路送信,小明有了足够的时间进山打猎,所以小明很快就用猎物换取了十头牛迎娶了小红。很多被他们的爱情感动的人们都来参加他们的婚礼,就连IBM部落的酋长也亲自为这一对新人送来了祝福。酋长觉得在这场爱情当中为他们送信的信使也有着很大的功劳,所以决定赐他一个封号。但是小明说给他送信的信使是不固定的,有时是李雷,有时候是汤姆,还有时候是韩梅梅。酋长想了想然后说既然这样那就叫 MQTT协议 吧!
自此 MQTT协议 名扬天下!
以上故事纯属胡诌,如有雷同估计也是瞎扯!所以大家当个乐呵看看就好。但是我想应该会有细心的读者发现这个小故事里的一个概念,MQTT协议是信使!
对了,从某种意义上来说 MQTT协议 充当的角色就是信使!
前文已经交待MQTT协议是一种轻量级的,基于代理的 发布/订阅 模式的消息传输协议。那么它和传统的TCP/IP网络通信有什么区别呢?下面笔者还以小明和小红举例。
传统的TCP/IP网络通信最典型和最基础的模式就是客户端/服务器模式,两个计算机通信,一台计算机上部署客户端,一台计算机上部署服务器。可以把这个过程想象成小明追求小红的第一阶段。通信总是由客户端主动发起,客户端主动向服务器发送信息,同时轮询服务器是否有消息返回。
使用这种模式时客户端每次发起连接都必须知道服务器的IP地址,但是因为IP地址资源的紧张,所以现在从网络运营商处分配到的IP地址基本上都是动态的(可以申请固态IP,但价格较为昂贵),所以现在有些解决方案是使用域名服务器,客户端通过域名服务器得到服务器的地址再发起访问。读者可以想象小红的父王死后住的房子就不固定了,所以小明每次送信都要先去问卫兵,然后才能找到小红。域名服务器大部分都是收费的,但是现在也有一些免费的域名服务器,比如花生壳,现在世面上卖的IP摄像头有好多都是使用花生壳分配域名的,有兴趣的读者可以研究一下。
可能有的人会问了,我平时使用的好多软件比如QQ和别人通信大家都是客户端啊,我们之间是怎么通信的呢?
我们生活中使用的一些大型即时通信软件如果还是使用一个客户端一个服务器这种方式显然是不现实的,所以一般都是由软件运营商架设服务器,然后由用户下载客户端,同时还需要用户申请一个具有唯一标识的帐号,比如申请帐号小明和帐号小红。小明想要发送消息给小红首先要连接服务器,并把消息发送给服务器,同时要标明消息发送给小红,服务器接收到消息后查看小红是否和服务器建立着连接,如果在线则交由小红取走,如果不在线则存储到数据库中等待小红再次连接服务器后重新取走。反之,如果小明想从服务器获取小红发来的消息也需要先连接服务器,并轮询服务器是否有自己的信息到达,如果有则接收过来。当然为了保证通信的即时性还需要使用各种算法来优化连接、轮询等过程。
由上可以看到如果使用传统的TCP/IP通信机制开发一套通信系统,程序开发者需要编写客户端程序、服务器程序,同时还需要考虑用户不在线、网络延迟、数据处理、即时性等各种问题,单单网络通信的工作量也已经非常庞大了。
这个时候使用MQTT协议的优点就可以体现出来了。再回顾下前面提到的概念,MQTT协议是一种基于代理的消息传输协议。所以在我们需要通过网络发送数据的时候直接将需要发送的内容交由MQTT代理发送,需要通过网络接收数据的时候直接交由MQTT代理收取即可。而且MQTT协议在通信质量、数据开销、掉线处理、负载、安全等各方面都已经做了充分的考虑。就像小明把送信跑腿的工作转交给了信差,这样程序开发者就可以节省出大量时间从而把精力放在其它功能的开发和完善上了。
同时MQTT协议是一种基于 发布/订阅 模式的消息传输协议。MQTT协议抛弃了 客户端 , 服务器 的概念,每个用户都可以是发布端或订阅端,也可以既是发布端也可以是订阅端。用户填好主题以后就可以将数据发布到具有相同主题的订阅端上,同理,用户填好订阅主题以后就可以接收到使用相同主题发布的数据了。
说到这里我想再给大家普及下 推送 这个概念,我想推送这个词大部分人都会有印象的。比如PC端的推送广告,比如安卓的推送服务,还有一些即时通信软件如微信、易信等也是采用的推送技术。
现在的推送实现的方式已经非常多了,主流的有C2DM服务(Google Cloud Messaging),基于XML协议的通讯协议XMPP协议(Openfire + Spark + Smack), 轻量级的、基于代理的 发布/订阅 模式的消息传输协议MQTT协议,还可以通过嵌入SDK使用第三方提供的推送服务,如百度云推送、极光推送、智游推送、腾讯信鸽等。
推送利用的也是类似于上面提到的代理技术,从而将数据源源不断地推向客户机。笔者对其它协议了解不多所以也不敢多做妄言,但是现在国内很多企业都已经广泛使用MQTT作为Android手机客户端与服务器端推送消息的协议。其中Sohu,Cmstop手机客户端中均有使用到MQTT作为消息推送消息。
MQTT协议还有一个不得不说的重要特质,它是一种轻量级的消息传输协议。MQTT协议的开销非常小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量,所以可以很好的解决物联网在使用GPRS等方式连接网络时存在的网络不稳定,网络流量较为昂贵等问题。同时MQTT协议目前已经扩展出了数十个MQTT服务器端程序,可以通过PHP,JAVA,Python,C,C#等系统语言来向MQTT发送相关消息,就像我在前文中开玩笑说的不管是李雷,汤姆还是韩梅梅都可以实现MQTT协议的传输。该协议几乎支持所有平台,可以把所有联网物品和外部连接起来,特别适合用来当做传感器和执行器的通信协议。所以有人说MQTT协议很有可能会成为物联网的重要组成部分。