发布 - 订阅模式协议
MQTT
MQTT(MQ Telemetry Transport)协议,是 IBM 公司在 1999 年开发的轻量级网络协议,采用的是发布 - 订阅通信模式,它有三个主要特点:
- 采用二进制的消息内容编码格式,所以二进制数据、JSON 和图片等负载内容都可以方便传输。
- 协议头很紧凑,协议交互也简单,保证了网络传输流量很小。
- 支持 3 种 QoS(Quality of Service,服务质量)级别,便于应用根据不同的场景需求灵活选择。
什么是 QoS?它是指通信双方关于消息传送可靠程度的协商。
QoS 0级别,消息只发送一次,消息可能丢失;
QoS 1级别 ,发送方会接收反馈,保证消息的送达,但是可能消息会重复。
QoS 2 级别,通过发送方和接收方的多次交互,保证消息有且只有一次。
MQTT 协议非常适合计算能力有限、网络带宽低、信号不稳定的远程设备,所以它成为了物联网系统事实上的网络协议标准。
AMQP
除了 MQTT 协议以外,也有其他采用发布 - 订阅模式的网络协议,比如 AMQP 协议。虽然 AMQP 协议拥有庞大的特性集,比较重,不适合计算资源有限、对功耗要求严苛的物联网设备,但是它可以满足后台系统对于可靠性和可扩展性的要求。因此,它在物联网的平台系统中应用广泛。比如,在分布式系统中应用广泛的 RabbitMQ 消息中间件软件,就是基于 AMQP 实现的。
AMQP 和 MQTT 一样,也是基于 TCP 协议,采用二进制消息格式,也支持 3 个 QoS 级别。现在被广泛使用 AMQP 1.0 和 AMQP 0.9.1 这两个版本,在设计上有很大的差异。你在查询资料或者应用这两个版本的 AMQP 协议时,一定要注意看版本,避免用错。
请求 - 响应模式
发布 - 订阅模式的很多好处,但是凡事都有例外,也有一些物联网应用场景,并不适合使用这种模式。比如,现在小区里面都有智能快递柜,当你输入取件码后,服务器会向对应的柜门发送开门指令。在发布 - 订阅模式下,服务器知道指令发送成功了,但是它无法知道柜门是否真的打开了。这时,你就需要让柜门能够向服务器反馈一下命令的执行结果。当然,你也可以让服务器订阅一个“柜门关闭”的主题消息,然后等待柜门发布这个消息。但是这样的话就非常繁琐、不够直接。在这种场景下,另一种通信模式就能派上用场了,那就是请求 - 响应模式。
请求 - 响应模式有两个角色,一个是客户端(Client),另一个是服务器(Server)。客户端是请求数据或者服务的一方。服务器则用来接收客户端的请求,并提供相应的数据或者服务。服务器在收到请求后,会获取数据,对资源数据(比如数据库)进行加工处理,准备好响应,然后返回给客户端。
请求 - 响应模式是无状态的通信方式,每个完整的请求 - 响应都是相互独立的。进一步细分的话,它还可以分为同步和异步两种。你可以看下这张图片。
HTTP
HTTP 就是采用请求 - 响应模式典型的代表。HTTP/2 协议还引入了异步请求 - 响应模式,客户端可以对请求设置不同的优先级,服务器可以根据优先级决定先响应哪个请求。虽然 HTTP 协议的报文格式非常重,光是报文头就能达到 KB 大小,不太适合资源有限的嵌入式设备。但在一些计算资源和网络资源都比较充足的物联网设备上,HTTP 协议仍然是一个可选项。而且它和现有的 Web 系统兼容,可以利用已有的 Web 服务器资源。
CoAP
CoAP(Constrained Application Protocol)协议,跟 HTTP 协议一样,CoAP 协议同样有 GET、POST、PUT、DELETE 等方法和响应状态码,同样使用 URI 而不是 Topic 来标识资源。比如我们需要访问服务器 iotdemo.com 下面的 bedroom/temp 这个资源,那完整的资源地址是:
coap://iotdemo.com:5683/bedroom/temp
CoAP 的消息采用二进制格式,支持可确认消息和不可确认消息两种 QoS 级别。可确认消息(Confirmable Message)与 MQTT 协议的 QoS 1 类似,不可确认消息(Non-confirmable Message)对应 MQTT 协议的 QoS 0 级别。
另外,CoAP 协议基于的传输层协议是 UDP,而不是 HTTP 、 MQTT 协议的 TCP 协议,所以对于设备的计算资源要求更低。传感器设备一般只需要上传数据,不用随时接收服务器的控制命令,这都说明 CoAP 协议适合电池供电的传感器设备。
LwM2M
LwM2M(Lightweight M2M)协议。LwM2M 协议定义在 CoAP 协议之上,不过它在消息传输的基础上更进一步。因为它基于 IPSO (IP-base Smart Object)对设备模型进行了标准化,提供了一组轻量级设备管理和交互接口协议。
LwM2M 协议目前主要的实现是 C 语言的 Wakaama 和 Java 语言的 Leshan,相对来说应用还比较少。CoAP 协议的应用场景同样适合 LwM2M 协议,如果你希望在 CoAP 协议的基础上更方便地实现设备的管理,可以考虑 LwM2M 协议。
通信模式的共存
MQTT 5.0 中增加了请求 - 响应模式的新特性;AMQP 1.0 版本也定义了请求 - 响应模式。而 CoAP 协议呢,在新的初稿版本(Draft)中也增加了发布 - 订阅模式特性。这种网络协议中的通信模式的共存,相比单一模式的设计都大大方便了具体场景中的应用,代表了一种网络协议的发展方向。
小结
物联网应用是一个复杂的综合性系统,这要求你了解不同网络协议的功能特性和局限,并且为系统的不同部分做出合适的选择。这些选择原则,我总结为下面三点:
- 物联网设备通常需要运行在网络不太可靠的环境中,而且在功耗、体积和计算资源方面也有诸多限制,所以我们在设备的开发中可以考虑使用 MQTT 和 CoAP 协议。
- 云平台各服务之间需要快速、可靠地进行消息转发,这种情况可以选择 AMQP 协议。
- 一些应用需要兼容 Web 系统的 RESTful 架构,比如通过 REST 开放物联网中的资源能力,供其他应用调用,这时 HTTP 和 CoAP 协议是合适的选择。