Message Dispatcher 消息中间件
需求:实现消息的点对点、点对多、发布-订阅通信模型
调研方案
DBus
UBus
DDS
uMCN
Mosquitto
ZeroMQ
D-Bus
D-Bus(英文全称 Desktop Bus)是一个进程间通信及远程过程调用机制,可以让多个不同的计算机程序在同一台电脑上同时进行通信。D-Bus 作为 freedesktop.org 项目的一部分,其设计目的是使 Linux 桌面环境提供的服务标准化。
D-Bus 是一种高级的进程间通信机制,它由 freedesktop.org 项目提供,使用 GPL 许可证发行。D-Bus 最主要的用途是在 Linux 桌面环境为进程提供通信,同时能将 Linux 桌面环境和 Linux 内核事件作为消息传递到进程。D-Bus 的主要概念为总线,注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。D-Bus 已被大多数 Linux 发行版所采用,开发者可使用 D-Bus 实现各种复杂的进程间通信任务。
D-Bus 总线中的消息可分为以下四类:
Methodcall 消息:将触发一个函数调用;
Methodreturn 消息:触发函数调用返回的结果;
Error 消息:触发的函数调用返回一个异常;
Signal 消息:通知,可以看作为事件消息。
D-Bus 提供了一种高效的进程间通信机制,因此主要用于进程间函数调用以及进程间信号广播。
函数调用
D-Bus 可以实现进程间函数调用,进程 A 发送函数调用的请求(Methodcall 消息),经过总线转发至进程 B。进程 B 将应答函数返回值(Method return 消息)或者错误消息(Error 消息)。
消息广播
进程间消息广播(Signal 消息)不需要响应,接收方需要向总线注册感兴趣的消息类型,当总线接收到 “Signal 消息” 类型的消息时,会将消息转发至希望接收的进程。
相关链接
D-Bus 教程:https://dbus.freedesktop.org/doc/dbus-tutorial.html
GitHub 地址:https://github.com/freedesktop/dbus
UBus
UBus 是 μ bus(micro bus)的意思,起源于 OpenWrt 中的进程间通信机制,它包含了守护进程、库以及一些额外的帮助程序。ubusd 实现 server,其他进程实现 client,例如 ubus(cli)、netifd、procd,两个client通信需要通过 server 转发。
ubus 提供了创建 socket client 端的接口,并且提供了三种现成的客户端供用户直接使用:
为 shell 脚本提供的 client 端。
为 lua 脚本提供的 client 接口。
为 C 语言提供的 client 接口。
相关链接
DDS
DDS(Data Distribution Service) 是一种工业标准,它由各种不同的 vendors 实现,比如 RTI 公司实现的 Connext 或者是 ADLink 公司的 OpenSplice。
RTPS(Real Time Publish Subscribe protocol) 是一种使用 DDS 作为网络通信的协议,没有完全实现全部的 DDS API,但已经可以为 ROS2 提供充足的功能性,比如 eProsima 实现的 Fast RTPS。
ROS2 支持多种不同的 DDS/RTPS 实现,这是由于当它选择一个 vendor(供应商)来使用时,并不是完全一致的(one size fits all)。当选择一个中间件实现时,有多种因素需要考虑,比如说后备考虑如 License,或者技术考虑如平台兼容性或计算规模。vendors 可能专注于不同的需求而提供多于一种的 DDS 或 RTPS 实现,比如说,RTI 就有多种不同的 Connext 实现,它们的目的各不相同,比如有些是针对特定处理器平台的,有些是满足不同应用的安全性验证的(当前阶段,ROS2 仅支持标准桌面版本)。
为了在 ROS2 中使用一个 DDS/RTPS 实现,我们设计了 ROS Middleware interface(或简称 RMW) 的软件包,它可以实现在使用 DDS/RTPS API 或工具时对 ROS 中间件接口的抽象。使用 RMW 来支持 DDS 的过程需要做很多实现和维护性工作,但是首先实现对一部分 DDS 的支持可以保证 ROS2 的框架代码不再需要尝试其他特殊的实现方法,同时用户也希望能将 DDS 与他们的应用工程分离开来。
Data Distribution Service
侧重于设备到设备通信的订阅/发布式 M2M 中间件
对象管理组织的标准(Data Distribution Service)
多种多样的设备和服务安全和互操作
uMCN
uMCN(micro Multi-Communication Node)是一个基于发布者/订阅者模式的轻量级且功能强大的跨线程/进程通信模块。
由于 uMCN 是基于 RTOS 开发的,因此暂时不考虑。
Mosquitto
MQTT 是一种轻量级的物联网消息传输协议。它工作在 TCP/IP 协议簇之上,是专门为硬件性能受限的远程设备以及网络状况不佳的情况下而设计的发布(Publish)/ 订阅(Subscribe)型消息协议,符合 ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式。
由于 MQTT 协议的内容十分精简,因此非常适合用于处理器资源及网络带宽有限的物联网设备,再加上已经由许多 MQTT 程序库被陆续开发出来,包括 C/C++、JavaScript、Python 等多种编程语言,可用于 Arduino、Espruino 等控制板上,还有开源的 MQTT 服务器,使得开发 MQTT 物联网、机器之间(Machine-to-Machine, M2M)的通讯变得非常简单。事实上,Facebook Messenger 的即时通讯也是用 MQTT 协议实现的。
MQTT 是基于发布/订阅模式的轻量级物联网消息传输协议,具有如下特点:
轻量可靠:MQTT 报文格式精简、紧凑,可在严重受限的硬件设备和低带宽、高延迟的网络上实现稳定传输。
发布/订阅模式(Pub/Sub):发布/订阅模式的优点在于发布者与订阅者的解耦,实现异步协议,即订阅者与发布者不需要建立直接连接、也不需要同时在线。
为物联网而生:提供心跳机制、遗嘱消息、QoS 质量等级 + 离线消息、主题和安全管理等全面的物联网应用特性。
生态更完善:实现覆盖全语言平台的客户端和 SDK,已成为 AWS IoT Core、Azure IoT Hub 等众多云厂商物联网平台的标准通信协议。
在嵌入式 Linux 端,可以采用 Mosquitto(服务端)+ Paho.mqtt(客户端)进行测试。
相关链接
官方网站:https://mqtt.org
GitHub 仓库:https://github.com/eclipse/mosquitto
ZeroMQ
ZeroMQ(又写作 ØMQ、0MQ 或 zmq)是一个可嵌入的网络库,但使用起来更像是一个并行开发框架(concurrency framework)。它能够提供进程间(in-process)、进程内(inter-process)、网络(TCP)和广播方式的消息信道,并支持扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task distribution)、请求-响应(request-reply)等几种多对多的通信模式。
ZeroMQ 的性能足以用来构建集群产品,其异步 I/O 模型能够为多核消息系统提供足够的扩展性。ZeroMQ 支持 30 多种语言的 API,可以用于绝大多数操作系统。在提供这些优秀特性的同时,ZeroMQ 是开源的,遵循 LGPLv3 许可。
ZeroMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。
ZeroMQ 是一个很有个性的项目,其名称也暗合禅意:
Ø 是一种权衡:让一些丹麦人恼火,但是“Ø”本身也降低了 Google 搜索的命中率以及 Twitter 上的关注度;
Ø 暗合“零代理(broker)”、“零延迟”;
Ø 的目标是“零管理、零消耗、零浪费”;
Ø 符合简约主义:力量的源泉是降低复杂度,而不是增加新功能。
相关链接
官方网站:https://zeromq.org
GitHub 主页:https://github.com/zeromq