最好的进程之间通信方式-消息总线
一、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 编码之后再发送。
最新活动更多
-
11月22日立即报名>> 【线下论坛】华邦电子与莱迪思联合技术论坛
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
7.30-8.1马上报名>>> 【展会】全数会 2025先进激光及工业光电展
-
精彩回顾立即查看>> 【线下论坛】华邦电子与恩智浦联合技术论坛
-
精彩回顾立即查看>> 【线下巡回】2024 STM32 全球巡回研讨会
-
精彩回顾立即查看>> 2024先进激光技术博览展
-
10 携程集团,彻底爆了!
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论