物联网(Internet of Things),顾名思义就是物物相连的互联网。它可以将物体之间通过互联网进行链接,这些物体便能够互相协作,而MQTT就是这些物体之间数据通信的一个基于TCP/IP的协议。
每个终端都和实现了MQTT协议的代理/服务器相连。
通过published MQTT代理服务器的某个主题 发送数据。
通过subscription从MQTT代理服务器获取自己订阅的主题数据。
代理服务器本身不产生数据,数据全是由链接到这个代理服务器的终端产生。
终端往服务器发送数据,在服务器订阅了主题的终端,接受另外一个终端发送到服务器,并通过服务器转发到自己。
MQTT协议是一种轻量级的、灵活的网络协议。并且非常适合IOT的场景。
首先IOT协议的定义非常小巧,不会像HTTP、HTTPS那么重量级。
一般支持IOT的设备的网络传输环境和自身的计算能力都比价薄弱,正好合适MQTT对网络和数据要求不高的轻量级协议。
那么,MQTT为什么如此轻便且灵活?MQTT协议的一个关键的特性是发布/订阅模型。它将数据的发布者和接受者分离。
一个设备终端既可以是数据的发布者(published) 也可以是数据的订阅者(subscription)。
一个设备如果要发布数据,只需要往代理服务器中相应的主题发布数据内容即可。
一个设备如果需要接受到数据,只需要在代理服务器中,提前订阅自己需要关注的主题即可。
大多数开发人员已经熟悉了HTTP WEB协议。那么为什么不让IOT设置链接到WEB服务?
设备可以采用HTTP请求的形式发送数据,并采用HTTP响应的形式从服务器获取数据,接受更新。
因为对于IOT的设备来说,这种主动请求–>被动等待应答的数据传输模型存在严重的局限性:
HTTP是一种同步协议。客户端需要等待服务器的响应。Web浏览器具有这样的要求,但它的代价是牺牲了可伸缩性。在 IoT领域,大量的设备以及很可能不可靠或者高延迟的网络使得同步通信成为问题。异步消息协议更适合IoT应用程序。传感器只负责发送数据,让网络确定将其传送到目标设备和服务器的最佳路线和时间。
HTTP是单向的。客户端必须主动的发起请求。在IoT应用程序中,设备或传感器通常是客户端,这就意味着,除非用户或应用程序主动请求,否则无法接受来自服务器的数据。
HTTP是一个1-1的协议。客户端发出请求,服务器进行相应。它们是一对一的对应关系。但是需要把HTTP这种1-1的关系,改进程IOT中很常见的一对多的关系,实现起来很困难,而且成本也很高。而一对多在IoT中很常见。
HTTP相对于MQTT来说,是一个比较重的协议,它不适合IOT终端设备受限的网络和较差的计算能力。