物联网中的网络分为设备到设备的网络与设备到物联网服务的网络。其中,设备到物联网服务的网络通信协议有HTTP,Websocket,MQTT等。
HTTP协议
HTTP(超文本传输协议)是一个负责从万维网服务器获取超文本到本地浏览器的传输协议。HTTP协议工作在应用层,在下层使用了TCP传输控制协议作为其运输层协议。HTTP协议由请求和响应两部分组成,其端口号为80。使用HTTP协议在设备与物联网服务之间传输数据时,物联网服务不能主动向设备发送请求,只能在被动接收设备发送的请求并在响应中返回数据,因此设备通常采用轮询的方式定期向服务器发送请求以获取来自服务器的数据。
HTTP协议内容
HTTP请求
# 请求行
GET /api/articles?type=more&category=home&shown_offset=1602317230800527 HTTP/2
# 请求头
Host: www.csdn.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
请求行内容:
- GET:请求类型,GET表示读取请求,POST表示向服务器发送信息
- /api/articles?type=more&category=home&shown_offset=1602317230800527:网站路径与携带参数
-
HTTP/2:请求使用的HTTP版本号为2.0
请求头内容: - Host:HTTP请求的目的主机
- UserAgent:用户代理,请求源主机的操作系统信息与浏览器信息
- Accept:用户希望接收的数据类型
- Accept-Language:用户希望接收的语言类型
- Accept-Encoding:用户希望接收的编码格式
- Connection:连接后是否断开
HTTP相应
# 状态行
HTTP/2 200 OK
# 响应头
date: Sat, 10 Oct 2020 08:07:11 GMT
content-type: application/json
# 响应体
状态行内容:
HTTP/2:响应使用的HTTP版本号为2.0
200 OK:响应状态码,200表示成功处理请求
响应头内容:
content-type:响应体内容类型,application/json表示返回一个json格式数据
date:服务器响应时间
轮询
相隔很短时间向服务器发出请求,判断服务器是否有发给客户端的新消息。
setInterval(() => {
$.ajax({
type: 'post',
url: http + "interface/index/get_warning_info.php",
// data: obj,
dataType: 'json',
success (res) {
...
}
})
}, 1000);
WebSocket协议
由于在HTTP协议中,服务器不能主动向设备推送信息。设备使用轮询的方式向服务器请求数据时会消耗大量的设备运行资源与网络资源,因此WebSocket协议诞生。
WebSocket协议是建立在运输层协议TCP上进行全双工通信的协议,可以实现设备与物联网协议之间的平等传输,即客户端可以主动向服务器发送请求,服务器也可以向客户端推送信息。
在建立WebSocket连接时,客户端与服务器要先进行握手,即客户端向服务器发送一个HTTP请求。客户端发送的请求报文如下:
GET / HTTP/2.0
Host: server.example.com
Upgrade: websocket // 要求将通信协议转换为WebSocket
Connection: Upgrade // 要求将通信协议转换为WebSocket
Sec-WebSocket-Key: eH2kIHNhbVCsdsfSS2AjZQ== // 客户端每次请求时将生成一个唯一的Key
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat // 通信协议
Sec-WebSocket-Version: 13 // 通信版本
在服务端收到客户端的HTTP请求时,将发回以下报文:
HTTP/2.0 101 Switching Protocols
Upgrade: websocket // 将通信协议转换为WebSocket
Connection: Upgrade // 将通信协议转换为WebSocket
Sec-WebSocket-Accept: dGFlIZNhSXAsRSTTuCFG2RjFK== // 服务端采用于客户端一致的密钥加密
之后建立连接,其中Sec-WebSocket-Accept为服务端通过算法校验客户端发送的Sec-WebSocket-Key后得出的,客户端在收到响应报文后会对Sec-WebSocket-Key进行验证。该机制是为了防止恶意连接或无意连接。
在建立连接后,WebSocket发送数据的单位为frame(帧)。客户端将长消息分为多个帧,并发送给服务端。服务端接收来自客户端的帧,并组装成完整的数据。此外,客户端还与服务器进行心跳检测,来确定连接是否持续。
MQTT协议
MQTT(消息队列遥测传输协议)是一种基于发布者/订阅者模式的通信协议,可以实现一对多的通信,该协议建立在传输层协议TCP之上,为应用层协议。此外,该协议具有轻量、低开销、低带宽占用的优点,因此在物联网领域具有广泛的应用。
MQTT客户端可以是使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接,其功能为:
- 向MQTT中介发布主题
- 订阅来自其它客户端发布的主题
- 退订主题或删除应用程序的消息
-
断开与服务器连接
MQTT中介又称为MQTT服务器,可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,其功能为: - 接受来自客户的网络连接
- 接受客户发布的主题
- 处理来自客户端的订阅和退订请求
- 向订阅的客户转发主题
MQTT主要特性
-
Qos(服务质量):通信线路的品质保证,这里以发布者发布主题为例。
Qos0最多发送一次消息,不保证消息到达。
Qos1至少发送一次消息,若发布者向中介发布主题A之后,中介没有返回PUBACK(Qos1发布消息确认),则发布者重复发布主题A,直到收到来自中介的PUBACK。
Qos2准确发送一次消息。在Qos2中,发布者先发送一次主题A,若中介收到主题A,则返回PUBREC(发布消息已接收),发布者在收到PUBREC之后,发送PUBREL(发布消息释放),中介收到后,回复PUBCOMP(发布消息完成)。
订阅者收到MQTT消息的的Qos取决于发布消息的Qos和订阅主题的Qos,当两者不同时会使用级别较低的Qos。 -
Retain(MQTT中介缓存客户端发布的主题)
发布者发布带有Retain标志的消息后,消息便被缓存在MQTT中介,订阅者在订阅后可以立即收到带有Retain标志的消息(也可以收到订阅该主题前已经发布的消息)。 -
Will(客户端与服务端的连接意外断开时发送的消息)
若连接意外断开,Will消息就被传送给订阅者,若使用Disconnect消息明确表明连接已断开时(正常情况),则Will消息不会发给订阅者。 -
Clean Session(是否清除之前的Session)
用于指定中介是否保留了订阅者的已订阅状态,0表示保留Session,1表示不保留Session。
Session中存储的信息有:客户端Id,客户端订阅的主题,已经发送或正在发送且没有确认的Qos1与Qos2消息,在发送中的Qos0消息。
MQTT支持框架
MQTT服务端支持框架:mosquitto、 emqttd、 Apache ActiveMQ、 RabbitMQ
MQTT客户端支持框架:Eclipse Paho
XMPP
XMPP是基于XML的协议,相对HTTP,XMPP在通讯的业务流程上是更适合物联网系统的,开发者不用花太多心思去解决设备通讯时的业务通讯流程,相对开发成本会更低。但是HTTP协议中的安全性以及计算资源消耗的硬伤并没有得到本质的解决,且无法适应物联网设备的多样性和低功耗的特性。
CoAP
Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252。COAP名字翻译来就是“受限应用协议”,顾名思义,使用在资源受限的物联网设备上。物联网设备的ram,rom都通常非常小,运行TCP和HTTP是不可以接受的,因此CoAP选择了简单的UDP作为其运输层协议。
CoAP基于RESTful风格请求,客户端可以用GET,POST,PUT,DELETE等请求方法对同一个资源的url发起请求。CoAP的数据传输格式为二进制,最小长度为4B。CoAP支持可靠传输,IP多播等特性,且不是长连接通信,更适用于低功耗的物联网场景。