消息队列遥测传输(MQTT)。采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与设备之间消息的转发。
优点:
缺点:
实时性差,延时在秒级。
任何一个MQTT协议的系统都有两个组成部分:代理(broker)和客户(client)。
客户端既可以发布消息也可以订阅消息。客户端发布的消息会首先传递给代理,每个消息都对应一个主题,代理向订阅了某主题的客户端推送这个主题的消息。
主题详情:
MQTT消息按主题分类,主题是编码到每个消息中的字符串。客户端订阅主题,当代理收到消息时,它会将其传输给订阅它的任何客户端。MQTT主题具有与文件系统类似的结构,并使用/字符作为分隔符。一些示例主题是:
home/kitchen/light
home/lounge/lamp
home/lounge/light
通配符(#)可用于订阅级别上的所有消息。例如,订阅home/lounge/#的客户将收到‘家庭/休息室/灯’ 和 ‘家庭/休息室/灯光’消息。订阅home/#的客户将收到以上所有订阅。
DDS: data distribution service数据分发服务。 DDS信息发布中间件是一种轻便的、能够提供实时信息传送的中间件技术。
DDS采用发布/订阅体系架构,以数据为中心,提供丰富的Qos服务质量策略。
DDS以数据为中心的发布-订阅模型为所有的分布式节点之间创建了一个虚拟共享的全局数据空间。
DDS在服务质量(QoS)上提供非常多的保障途径,这也是它适用于国防军事、工业控制这些高可靠性、可安全性应用领域的原因。但这些应用都工作在有线网络下,在无线网络,特别是资源受限的情况下,没有见到过实施案例。
OpenDDS是使用C++语言针对OMG数据分发服务(DDS)的一种开源实现。由OCI公司设计和维护,可从OpenDDS社区门户中获得帮助。
OpenDDS的安装可以从这篇博文(OpenDDS系列(2) —— OpenDDS 安装)参考。
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
一个Virtual Host可持有一些Exchange和Message queue。它是一个虚拟概念可以是一台服务器,也可以是多个服务器组成的集群。
Message的产生者和消费者可能是同一个应用。整个AMQP定义的就是Client application与Broker之间的交互。
发布者(Publisher)发布消息(Message),经由交换机(Exchange)。
交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue)。
最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。
AMQP协议是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。从整体来看,AMQP协议可划分为三层:
这种分层架构类似于OSI网络协议,可替换各层实现而不影响与其它层的交互。AMQP定义了合适的服务器端域模型,用于规范服务器的行为(AMQP服务器端可称为broker)。在这里Model层决定这些基本域模型所产生的行为,这种行为在AMQP中用”command”表示。Session层定义客户端与broker之间的通信(通信双方都是一个peer,可互称做partner),为command的可靠传输提供保障。Transport层专注于数据传送,并与Session保持交互,接受上层的数据,组装成二进制流,传送到receiver后再解析数据,交付给Session层。Session层需要Transport层完成网络异常情况的汇报,顺序传送command等工作。
RabbitMQ是基于AMQP协议实现的开源消息代理软件。广为使用。
这个链接 是知乎上对RabbitMQ的一个不错的讲解。
这个链接 是RabbitMQ的中文文档
RabbitMQ(官网)不但支持AMQP协议,还有各种协议插件:
例如MQTT插件
XMPP来源于Jabber开源社区,基于XML,提供准实时的传递消息、在线状态和请求/响应服务。XMPP使用客户/服务模式,服务器之间能够相互连接,建立在面向连接的协议上,通常是TCP。
XML基于HTTP, 客户端与服务器之间使用HTTP数据传输协议进行信息交互,客户端以HTTP协议中的POST请求方式将XML数据提交至服务器,服务器响应客户端同样也以POST数据流方式传输XML数据。客户端和服务器端发送和解析XML数据时要遵循数据传输协议。
每一个请求、响应消息包都是一个XML字符串,包含消息头和消息体两部分,对于不同类型的请求、响应,消息头的格式都相同的,而消息体会携带具体类型的请求、响应信息。
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的 路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过 TCP/IP连接到单服务器,然后在之上传输XML。
是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器甚至可支持上万并发用户。
Openfire官网
安装使用参考教程
Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252。COAP名字翻译来就是“受限应用协议”,顾名思义,使用在资源受限的物联网设备上。比如物联网设备的ram,rom非常小,运行TCP和HTTP是不可以接受的,就可以使用CoAP协议。CoAP协议可以视为HTTP协议的简化版。但是由于很多物联网设备隐藏在局域网内部,coap设备作为服务器无法被外部设备寻址,但是在ipv6没有普及之前,coap只能适用于局域网内部(如wifi)通信,这也很大限制了它的发展。
可使用消息服务器EMQ X,支持MQTT、CoAP等协议。
EMQ的开源版也提供了一个Generic CoAP的实现
EMQ X官方文档
HTTP协议是典型的CS通讯模式,由客户端主动发起连接,向服务器请求XML或JSON数据。该协议最早是为了适用web浏览器的上网浏览场景和设计的,目前在PC、手机、pad等终端上都应用广泛,但并不适用于物联网场景。
在物联网场景中其有三大弊端:
由于必须由设备主动向服务器发送数据,难以主动向设备推送数据。对于单单的数据采集等场景还勉强适用,但是对于频繁的操控场景,只能推过设备定期主动拉取的的方式,实现成本和实时性都大打折扣。
安全性不高。web的不安全都是妇孺皆知,HTTP是明文协议,在很多要求高安全性的物联网场景,如果不做很多安全准备工作(如采用https等),后果不堪设想…
不同于用户交互终端如pc、手机,物联网场景中的设备多样化,对于运算和存储资源都十分受限的设备,http协议实现、XML/JSON数据格式的解析,都是“mission impossible”
在设备资源允许的情况下,可以使用websocket避免数据推送实时性低和单向通信的问题。
Websocket是HTML5新出的一种协议,属于应用层协议,使用简单。
知乎上Ubuntu系统上Websocket的使用教程
JMS (Java Message Service),即消息服务,这是JAVA平台中著名的消息队列协议。
Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
从易于实现的角度来讲,HTTP和websocket不需要搭建消息中间件,客户端直接和服务器通信,但是HTTP是单向通信,这两者推荐使用WebSocket。由于物联网设备资源受限和低功耗的需求,出现了CoAP协议,基于UDP的,但是其常常和NB-IoT搭配(见补充知识),咱们采用4G无线网络的话发挥不出低功耗的优势,而且咱们的设备计算资源应该还是够的,这个协议我认为优先级不高。
剩下的几种协议都是需要中间服务器的,XMPP用于即时的消息传递,缺点是这个协议比较老,存在流量冗余、重复转发的问题,对网络可靠性要求高。
AMQP和MQTT定位相似,相比之下AMQP功能更加完善,安全性更好;MQTT适用于小型设备,轻量级,内存和网络带宽占用小。二者都支持设备间相互的信息传递。
DDS实时性最好,数据分发的实时效率非常高,能做到秒级内同时分发百万条消息到众多设备,而且QoS具有丰富的保障,常用于国防军事、工业控制这些高可靠性、可安全性应用领域的,但是在无线网络特别是资源受限的情况下基本没见到实施案例。
查找到的一个专利,在人脸识别系统中实际使用的边云协同方法。链接:https://www.ixueshu.com/document/4eb5d095a73dae36e01a4aedd1c119fa318947a18e7f9386.html。这里使用的消息服务软件是Apache-apollo
这个结构里的算法分析服务器可以换成我们的RK3399PRO人脸识别终端,这个结构里的人脸库存储在web服务器上,这点不用变。这个结构里算法分析服务器直接传输人脸图片给消息服务器,在我们的项目中可以替换为人脸ID,并且算法分析服务器不需要存储人脸图片,存储特征即可。这里是使用websocket先建立长连接,然后使用STOMP协议进行消息转发,这里的STOMP可以替换为MQTT(即使用MQTT over websocket的方式),支持3种QOS和加密服务。