侵权投诉
搜索
更多>> 热门搜索:
订阅
纠错
加入自媒体

最好的进程之间通信方式-消息总线

2021-03-04 11:23
道哥分享
关注

一、Linux 系统中的进程之间通信(IPC)

二、基于 Socket 通信的优点

三、MQTT 消息总线

四、嵌入式系统中如何利用 MQTT 消息总线

五、Mosquitto: 一个简单的测试代码

六、总结

七、资源下载

一、Linux 系统中的进程之间通信(IPC)

作为一名嵌入式软件开发人员来说,处理进程之间的通信是很常见的事情。从通信目的的角度来看,我们可以把进程之间的通信分成 3 种:

为了进程的调度: 可以通过信号来实现;为了共享资源:可以通过互斥锁、信号量、读写锁、文件锁等来实现;为了传递数据:可以通过共享内存、命名管道、消息队列、Socket来实现。

关于上面提到的这些、操作系统为我们提供的通信原语,网络上的各种资料、文章满天飞,在这里就不啰嗦了。在这些方法中应该如何选择呢?根据我个人的经验,贵精不贵多,认真挑选三四样东西就能完全满足日常的工作需要。

我们今天想讨论的问题主要是第 3 个:传递数据,在上面这几种传递数据的方法中,我最喜欢、最常用的就是 Socket 通信。

有些小伙伴可能会说:Socket 通信就是 TCP/IP 的那一套东西,还需要自己管理连接、对数据进行组包、分包,也是挺麻烦的。

没错,Socket 通信本身的确需要手动来处理这些底层的东西,但是我们可以给 Socket 穿上一层“外衣”:利用 MQTT 消息总线,在系统的各进程之间进行数据交互,下面我们就一一道来。

二、基于 Socket 通信的优点

这里我就不自己发挥了,直接引用陈硕老师的那本书《Linux 多线程服务端编程》这本书中的观点(第 65 页,3.4小节):

1. 跨主机,具有伸缩性

反正都是多进程了,如果一台机器的处理能力不够,就能用多台主机来处理。把进程分散到同一台局域网的多台机器上,程序改改 Host:Port 配置就能继续用。相反,文章开头部分列出的那些进程之间通信方式都不能跨机器,这就限制了可扩展性。

2. 操作系统会自动回收资源

TCP port 由一个进程独占,当程序意外退出时,操作系统会自动回收资源,不会给系统留下垃圾,程序重启之后能比较容易地恢复。

3. 可记录、可重现

两个进程通过 TCP 通信,如果一个崩溃了,操作系统会关闭连接,另一个进程几乎立刻就能感受到,可以快速 failover。当然应用层的心跳是必不可少的。(补充:操作系统本身对于 TCP 连接有一个保活时间,默认是 2 个小时,而且是针对全局的。)

4. 跨语言

服务端和客户端不必使用同一种编程语言。

1. 陈硕老师描述的是通用的 Socket 通信,因此客户端和服务端一般位于不同的物理机器上。
2. 在嵌入式开发中,一般都是用同一种编程语言,因此,跨语言这个有点可以忽略不计了。

三、MQTT 消息总线 

1. MQTT 是一个通信的机制

对物联网领域熟悉的小伙伴,对于 MQTT 消息总线一定非常熟悉,目前几大物联网云平台(亚马孙、阿里云、华为云)都提供了 MQTT 协议的接入方式。

目前,学习 MQTT 最好的文档是 IBM 的在线手册:https://developer.ibm.com/zh/technologies/messaging/articles/iot-mqtt-why-good-for-iot/。

这里,我直接把一些重点信息列出来:

MQTT协议轻量、简单、开放和易于实现;MQTT 是基于发布 (Publish)/订阅 (Subscribe)范式的消息协议;MQTT 工作在 TCP/IP协议族上;有三种消息发布服务质量;小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

MQTT 消息传输需要一个中间件,称为:Broker,其实也就是一个 Server。通信模型如下:

MQTT Broker 需要首先启动;ClientA 和 ClientB 需要连接到 Broker;ClientA 订阅主题 topic_1,ClientB 订阅主题 topic_2;ClientA 往 topic_2 这个主题发送消息,就会被 ClientB 接收到;ClientB 往 topic_1 这个主题发送消息,就会被 ClientA 接收到;

基于 topic 主题的通信方式有一个很大的好处就是解耦,一个客户端可以订阅多个 topic,任何接入到总线的其他客户端都可以往这些 topic 中发送信息(一个客户端发送消息给自己也是可以的)。

2. MQTT 的实现

MQTT 只是一个协议而已,在 IBM 的在线文档中可以看到,有很多语言都实现了 MQTT 协议,包括:C/C++、Java、Python、C#、JavaScript、Go、Objective-C等等。那么对于嵌入式开发来说,使用比较多的是这几个实现:

Mosquitto;
Paho MQTT;
wolfMQTT;
MQTTRoute。

在下面,我们会重点介绍 Mosquitto 这个开源实现的编译和使用方式,这也是我在项目中使用最多的。

3. 在 MQTT 之上,设计自己的通信协议

从上面的描述中可以看出,MQTT 消息总线就是一个通信机制,为通信主体提供了一个传递数据的通道而已。

在这个通道之上,我们可以根据实际项目的需要,发送任何格式、编码的数据。在项目中,我们最常用的就是 json 格式的纯文本,这也是各家物联网云平台所推荐的方式。如果在文本数据中需要包含二进制数据,那就转成 BASE64 编码之后再发送。

1  2  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    通信 猎头职位 更多
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号