CoAP(受限应用协议 2018年5月24日,51job上有167条职位)RFC 7252 - The Constrained Application Protocol (CoAP)。CoAP支持内在的服务和资源发现,有URI和媒体类型的概念,为机器到机器的应用(M2M)而设计,应用端点之间使用查询/响应模型进行交互。是一个简化的Web传输协议,开销极低。可以很容易和HTTP互联,和Web集成。基于UDP传输。而CoAP同HTTP一样具有REST(Representational State Transfer)设计风格,也支持GET/PUT/POST/DELETE方法。CoAP加密使用DTLS (Datagram Transport Layer Security)。通知机制:CoAP扩展了HTTP GET,加入了一个observe flag,使得CoAP Server能主动回传CoAP Client所observe的资源状态。NAT Issue:如果设备在NAT后方,则必须先送出请求到外部,使路由器可以接受来自外面CoAP Client的请求。
消息类型:
CON:需要被确认的请求。
NON:不需要被确认的请求。
ACK:应答消息,接受到CON消息的响应。
RST:复位消息,当接收者接受到的消息有错误,或者接收者不再关心发送者发送的内容,那么发送复位消息。
Message Queuing Telemetry Transport
基于TCP长连接。加密使用SSL/TSL。
MQTT是一种机器对机器(M2M)/“物联网”连接协议。它被设计成一个非常轻量级的发布/订阅消息传输机制。这对于与需要较小代码占用、运算能力有限和/或网络带宽非常昂贵、网络可靠性低的远程位置的连接很有用。
实现一对多通信。发布者和订阅者通过中介来通信。中介是服务器,发布者和订阅者是客户端。每个消息都有“主题”,中介根据“主题”将消息发送给订阅者。主题使用URL来标识。/Sensor/temperature/#指定所有以/Sensor/temperature/开头的主题。/Sensor/+/room1指定所有开头是/Sensor/,结尾是/room1的主题。
在设备和服务器的通信中,设备是发布者,服务器是订阅者。
订阅者和中介总是处于连接状态。发布者只需要在发布消息时建立连接。
控制报文有:CONNECT、CONNACK、PUBLISH、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK、PINGREQ、PINGRESP、DISCONNECT。
QoS等级。
发布者和中介之间指定QoS等级。订阅者和中介之前指定QoS等级。如果后者指定的等级高于前者,则降级为前者。
QoS 0:尽力而为。
QoS 1:中介收到消息时回复发布者“PUBACK”消息。如果发布者没有收到“PUBACK”则会重新发送消息。如果“PUBACK”丢失,则中介会收到重复的消息。所以QoS 1保证可靠性,但是消息可能重复。
QoS 2:中介收到消息时回复发布者“PUBREC”消息。发布者丢弃消息,回复“PUBREL”(释放)。然后中介发送“PUBCOMP”(完成)给发布者,发布者收到后丢弃消息的状态。之所以需要双向确认,是因为没有维持会话,消息只有ID,而不是像TCP一样的序列号。中介并不知道之前接收了哪些ID的消息,不像TCP,根据当前的seq,就知道有内容重复了。QoS 2保证可靠性,同时保证消息不重复。中介向订阅者发送消息,也是遵照上面的流程。
Retain标志置位的消息,即使订阅者在消息发布之后才订阅,也能收到该消息。
Will(遗言)消息。当发布者意外掉线时,中介会将发布者注册的will消息发送给订阅者。
Clean session标志。如果Clean session为0时,并且QoS等级是1或者2时,则中介在订阅者断开连接时,仍然保留它订阅状态和相关消息,等订阅者再次连接时发送给订阅者。如果clean session为1时,则中介在订阅者断开连接时,丢弃相关消息。
RabbitMQ和ActiveMQ都实现了MQTT。
控制服务器可以通过MQTT发送控制指令给执行设备。控制服务器向中介发布消息。如果设备在休眠,中介会保存消息。等设备醒来后,将消息发送给设备。
MQTT是多对多通讯协议。CoAP主要是一个点对点协议。
MQTT使用TCP长连接,需要保活消息,所以功耗大一点,但是实时性好,适合执行器。CoAP使用UDP,功耗小,适合于传感器设备,数据发完就休眠了。
MQTT通信双方必须知道数据格式以允许通讯,CoAP内置支持内容发现与协商,允许设备相互探测以找到交换数据的方式。