lora、nb-iot以及zigbee、蓝牙主要解决的是物体互联以及接入网络的问题,从网络协议分层来看,基本上都属于数据链路层协议。对于物联网的数据交换,主要依靠应用层协议来解决。
在移动互联网中,最常用的应用层协议就是http协议,http协议同样可以用于物联网系统中。http协议采取的是请求-响应(request-response)的通信机制,服务器没有办法主动给客户端发送消息。如果要实现这种消息推送,就需要借助websocket这种全双工的通信机制。
不过对于很多计算和存储资源有限的物联网节点,不太适合使用http协议。除了http协议以外,也有很多更适合于物联网应用的协议,比如mqtt、coap、amqp、stomp等。
各个物联网软件平台最常使用的物联网协议
发布-订阅机制
很多物联网应用层协议都是基于发布-订阅(publish-subscribe)机制,这种机制非常适合物联网系统应用。mqtt协议、stomp协议、amqp协议以及dds协议都属于这种发布-订阅的机制。
每个传感器节点,采集的数据需要上传到网络,相当于是一个消息的发布,这个消息需要基于某个主题,比如传感器的类型。所有关心这个主题的节点,都可以通过订阅这个主题的消息,实时获取最新的数据。
消息的发布和订阅是基于某个主题的,实现机制一般依赖于消息队列
mqtt协议
消息队列遥测传输协议(mqtt : message queuing telemetry transport)是为大量计算能力有限,工作带宽有限、网络环境不可靠的传感器或控制器而设计的协议。
mqtt协议基于tcp协议
mqtt协议原来是ibm开发的一个即时通讯协议,基于tcp协议实现。mqtt客户端需要通过消息代理(mqtt broker)来进行消息的发布和订阅。
mqtt协议的兼容性非常好,几乎支持所有平台,可以把各种物联网设备都连接起来。所以mqtt协议也是目前应用最广泛的物联网应用层协议。
coap协议
受限应用协议(coap:constrained application protocol)是6lowpan协议栈中的应用层协议,基于rest(表述性状态传递)架构风格,支持rest交互。
coap协议基于udp协议
coap基于udp协议,其设计初衷就是尽可能地方便地转换为http协议。coap让用户可以像使用http协议一样,在资源受限的物联网设备中使用coap协议。
amqp协议
高级消息队列协议(amqp:advanced message queuing protocol)是一个提供统一消息服务的应用层标准高级消息队列协议,为面向消息的中间件设计。
amqp的工作原理
amqp的工作原理与mqtt类似,也是基于发布-订阅机制。消息代理broker的交换机组件(exchange)会把接收到的消息,根据消息的主题,分配到不同的队列中,以便订阅者接收。
rabbitmq就是在amqp协议基础上实现的一个消息系统,遵循mozilla public license开源协议。rabbitmq在互联网应用中常被用作消息服务器。
stomp协议
简单(流)文本定向消息协议(stomp: simple (or streaming) text orientated messaging protocol),提供了一个可互操作的连接格式,允许stomp客户端与任意stomp消息代理(broker)进行交互。
stomp协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。当前非常流行的开源消息服务器activemq、apollo、rabbitmq(需要插件)都支持stomp协议。
activemq支持tcp、xmpp、stomp等协议进行消息传输
stomp基于tcp协议,客户端和服务器之间的通信是通过“帧”(frame)来实现,每个帧由多“行”(line)组成。stomp协议定义了帧结构。
stomp帧格式
stomp帧第一行是命令,紧跟着键值对形式的header内容。然后是一个空行,最后是body内容。
数据分发服务dds
数据分发服务(dds:data distribution service for real-time systems),是面向实时系统的数据分布服务,是由omg组织提出的协议。
dds的数据分发的实时效率非常高,能做到秒级内同时分发百万条消息到众多设备。dds在服务质量(qos)上提供非常多的保障途径,因此适用于国防军事、工业控制这些高可靠性、可安全性应用领域的原因。不过dds目前还只限于在有线网络部署,无线网络的可靠性可能满足不了dds的qos要求。
总结
上面列出了一些比较常见的物联网应用层协议,但并不全面,还有一些相对更加小众的协议,公开资料也比较少。目前很难说哪种物联网应用层协议会实现垄断局面,还要看各自生态和市场需求的未来发展。