色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux系統中的進程之間通信

GReq_mcu168 ? 來源:IOT物聯網小鎮 ? 作者:道哥 ? 2021-04-12 10:06 ? 次閱讀

一、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協議族上;

有三種消息發布服務質量;

小型傳輸,開銷很?。ü潭ㄩL度的頭部是 2 字節),協議交換最小化,以降低網絡流量;

MQTT 消息傳輸需要一個中間件,稱為:Broker,其實也就是一個 Server。通信模型如下:

09ea9876-9ab6-11eb-8b86-12bb97331649.png

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++JavaPython、C#、JavaScript、Go、Objective-C等等。那么對于嵌入式開發來說,使用比較多的是這幾個實現:

Mosquitto;

Paho MQTT;

wolfMQTT;

MQTTRoute。

在下面,我們會重點介紹 Mosquitto 這個開源實現的編譯和使用方式,這也是我在項目中使用最多的。

3. 在 MQTT 之上,設計自己的通信協議

從上面的描述中可以看出,MQTT 消息總線就是一個通信機制,為通信主體提供了一個傳遞數據的通道而已。

在這個通道之上,我們可以根據實際項目的需要,發送任何格式、編碼的數據。在項目中,我們最常用的就是 json 格式的純文本,這也是各家物聯網云平臺所推薦的方式。如果在文本數據中需要包含二進制數據,那就轉成 BASE64 編碼之后再發送。

四、嵌入式系統中如何利用 MQTT 消息總線從上面的描述中可以看到,只要在服務端運行著一個 MQTT Broker 服務,每個連接到總線的客戶端都可以靈活地相互收發數據。

我們可以把這個機制應用在嵌入式應用程序的設計中:MQTT Broker 作為一個獨立的服務運行在嵌入式系統本地,其他需要交互的進程,只要連接到本地的這個 Broker,就可以相互發送數據了。運行模型如下:

0a016484-9ab6-11eb-8b86-12bb97331649.png

每一個進程只需要訂閱一個固定的 topic(比如:自己的 client Id),那么其他進程如果想要發送數據給它,就直接發送到這個 topic 即可。

1. 一個嵌入式系統的通信框架

我之前開發過一個環境監測系統,采集大氣中的 PM2.5、PM10等污染物參數,在 Contex A8 平臺下開發,需要實現數據記錄(數據庫)、UI 監控界面等功能。

污染物的數據采樣硬件模塊是第三方公司提供的,我們只需要通過該模塊提供的串口協議去控制采樣設備、接收采樣數據即可。最終設計的通信模型如下:

0a52cb4e-9ab6-11eb-8b86-12bb97331649.png

UI 進程通過消息總線,發送控制指令給采樣控制進程,采樣控制進程接收到后通過串口發送控制指令給采樣模塊;

采樣控制進程從串口接收采樣模塊發來的PM2.5等數據后,把所有的數據發送到消息總線上指定的 topic 中;

UI 進程程訂閱該 topic,接收到數據后,顯示在屏幕上;

數據庫進程也訂閱該 topic,接收到數據后,把數據存儲在 SQLite 數據庫中;

在這個產品中,核心進程是采樣控制進程,負責與采樣模塊的交互。通過把 UI 處理、數據庫處理設計成獨立的進程,降低了系統的復雜性,即使這 2 個進程崩潰了,也不會影響到核心的采樣控制進程。

比如:如果 UI 進程出現錯誤崩潰了,會立刻重啟,啟動之后通過緩存信息知道此刻正在執行采樣工作,于是 UI 進程立刻連接到消息總線、進入采樣數據顯示界面,繼續接收、顯示采樣控制進程發出的PM2.5等數據。

這個通信模型還有另外一個有點:可擴展性。

在項目開發的后期,甲方說需要集成一個第三方的氣體模塊,用來采集大氣中NO、SO2等參數,通信方式是 RS485。

此時擴展這個功能模塊就異常簡單了,直接寫一個獨立的氣體參數進程,接入到消息總線上。這個進程通過 RS485,從第三方氣體模塊接收到NO、SO2等氣體參數時,直接往消息總線上的某個 topic 一丟,UI進程、數據庫進程訂閱這個 topic,就可以立刻接收到氣體相關的數據了。

此外,這個設計模型還有其他一些優點:

并行開發:每個進程可以由不同的人員并行開發,只要相互之間定義好通信協議即可;

調試方便:由于發送的數據都是 manual readable,在開發階段,可以在 PC 機上專門寫一個監控程序,接入到嵌入式系統中的 MQTT Broker 之后,這樣就可以接收到所有進程發出的消息;

通信安全:在產品 release 之后,為了防止其他人偷聽數據(比如 2 中的調試進程),可以為 MQTT Broker 指定一個配置文件,只能允許本地進程(127.0.0.1)連接到消息總線上。

0a6fa386-9ab6-11eb-8b86-12bb97331649.png

2. 稍微復雜一點的通信模型

在剛才描述的嵌入式系框架設計中,每一個進程都是運行在本地的,所有的消息也都是在系統內進行收發。那么,如果需要把數據傳輸到云端、或者需要從云端接收一些控制指令,又該如何設計呢?

加入一個 MQTT Bridge 橋接模塊即可!也就是再增加一個進程,這個進程同時連接到云端的 MQTT Broker 和本地的 MQTT Broker,通信模型如下:

0a9d3ca6-9ab6-11eb-8b86-12bb97331649.png

MQTT Bridge 接收到云端發來的指令時,轉發到本地的消息總線上;

MQTT Bridge 接收到本地的消息時,轉發到云端的消息總線上。

五、Mosquitto: 一個簡單的測試代碼上面的內容主要討論的是設計的思想,具體到代碼層面,我一般使用的是 Mosquitto 這個開源的實現。

在 Linux 系統中安裝、測試都非常方便,下面就簡單說明一下。

1. 直接通過 apt 來安裝、測試

可以參考這個文檔(https://www.vultr.com/docs/how-to-install-mosquitto-mqtt-broker-server-on-ubuntu-16-04)來安裝測試。

(1) 安裝

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppasudo apt-get updatesudo apt-get install mosquittosudo apt-get install mosquitto-clients

(2) 測試

mosquitto broker 在安裝之后會自動啟動,可以用 netstat 查看 1883 端口來確認一下。

接收端:連接到 broker 之后,訂閱 “test” 這個 topic。

mosquitto_sub -t “test”

發送端:連接到 broker 之后,往 “test” 這個 topic 發送字符串 “hello”。

mosquitto_pub -m “hello” -t “test”

當發送端執行 mosquitto_pub 時,在接收端的終端窗口中,就可以接收到 “hello” 這個字符串。

2. 通過源碼來手動編譯、測試

通過 apt 來安裝主要是用來簡單的學習和測試,如果要在項目開發中使用 Mosquitto,肯定需要手動編譯,得到頭文件和庫文件,然后復制到應用程序中使用。

(1) 手動編譯、安裝 Mosquitto

我的開發環境是:

編譯器:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609

Mosquitto 版本:mosquitto-1.4.9

mosquitto-1.4.9 可以到官方網站下載,也可以從文末的網盤中下載,你也可以嘗試更高的版本。

編譯、安裝指令:

makemake install prefix=$PWD/install

成功安裝之后,可以在當前目錄的 install 文件夾下看到輸出文件:

0ab668e8-9ab6-11eb-8b86-12bb97331649.png

bin:mqtt 客戶端程序;

include:應用程序需要 include 的頭文件;

lib:應用程序需要鏈接的庫文件;

sbin:mqtt broker 服務程序。

在編譯過程中,如果遇到一些諸如:ares.h、uuid.h 等依賴文件找不到的錯誤,只需要通過 apt 指令安裝響應的開發包即可。

(2) 最簡單的 mosquitto 客戶端代碼

在 mosquitto 源碼中,提供了豐富的 Sample 示例。如果你不樂意去探索,可以直接下載文末的這個網盤中的 Demo 示例程序,這個程序連接到消息總線上之后,訂閱 “topic_01” 這個主題。當然,你也可以修改代碼去發送消息(調用:mosquitto_publish 這個函數)。

進入 c_mqtt 示例代碼目錄之后,可以看到已經包含了 bin、include 和 lib 目錄,它們就是從上面(1)中安裝目錄 install 中復制過來的。

執行 make 指令之后,即可編譯成功,得到可執行文件:mqtt_client。

測試過程如下:

Step1: 啟動 MQTT Broker

在第 1 個終端窗口中,啟動 sbin/mosquitto 這個 Broker 程序。如果你在上面測試中已經啟動了一個 broker,需要先 kill 掉之前的那個 broker,因為它們默認都使用 1883 這個端口,無法共存。

Step2: 啟動接收端程序 mqtt_client

在第 2 個終端窗口中,啟動 mqtt_client 也就是我們的示例代碼編譯得到的可執行程序,它訂閱的 topic 是 “topic_01”。

。/mqtt_client 127.0.0.1 1883

參數 1: Broker 服務的 IP 地址,因為都是在本地系統中,所以是 127.0.0.1;

參數 2: 端口號,一般默認是1883。

Step3: 啟動發送端程序 bin/mosquitto_pub

在第 3 個終端窗口中,啟動 bin/mosquitto_pub,命令如下:

。/mosquitto_pub -h 127.0.0.1 -p 1883 -m “hello123” -t “topic_01”

參數 -h:Broker 服務的 IP 地址,因為都是在本地系統中,所以是 127.0.0.1;參數 -p:端口號 1883;

參數 -m:發送的消息內容;

參數 -t:發送的主題 topic。

此時,可以在第 2 個終端窗口(mqtt_client)中打印出接收到的消息。

六、總結這篇文章主要介紹了嵌入式系統中的一個設計模式:通過消息總線來實現進程之間的通信,并介紹了 Mosquitto 這個開源實現。

在實際的項目中,還需要更加嚴格的權限控制,比如:在接入消息總線時提供用戶名、密碼、設備證書,客戶端的名稱必須滿足指定的格式,訂閱的 topic 必須符合一定的格式等等。

在下一篇文章中,我們繼續討論這個話題,給出一個更具體、更實用的 Demo 例程。

原文標題:進程之間通信方式:最喜歡消息總線

文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5086

    文章

    19143

    瀏覽量

    306044
  • 通信
    +關注

    關注

    18

    文章

    6041

    瀏覽量

    136124
  • Linux
    +關注

    關注

    87

    文章

    11316

    瀏覽量

    209814

原文標題:進程之間通信方式:最喜歡消息總線

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深入解析Linux程序與進程

    關于某個數據集合的一次運行活動。作為系統進行資源分配和調度的基本單位,是操作系統結構的基礎。 程序與進程的關系 進程的狀態 基礎進程狀態 創
    的頭像 發表于 12-18 11:01 ?103次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進程</b>

    深入Linux進程管理:提升效率與穩定性的關鍵方法

    基本概述 2.進程狀態 3.進程優先級 4.進程命令 5. 控制作業 6.進程通信 7.使用信號控制
    的頭像 發表于 11-22 11:05 ?280次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理:提升效率與穩定性的關鍵方法

    一文搞懂Linux進程的睡眠和喚醒

    。通過PPID,可以追蹤進程的來源,并了解進程之間的關系。 在PCB記錄的進程狀態,不過是一些整數,這個整數是多少就代表進程此時處于什么
    發表于 11-04 15:15

    Linux網絡基礎知識總結

    同 CPU、內存以及 I/O 一樣,網絡也是 Linux 系統最核心的功能。 網絡是一種把不同計算機或網絡設備連接到一起的技術,它本質上是一種進程通信方式,特別是跨
    的頭像 發表于 10-28 10:42 ?269次閱讀
    <b class='flag-5'>Linux</b>網絡基礎知識總結

    Linux用戶身份與進程權限詳解

    在學習 Linux 系統權限相關的主題時,我們首先關注的基本都是文件的 ugo 權限。ugo 權限信息是文件的屬性,它指明了用戶與文件之間的關系。但是真正操作文件的卻是進程,也就是說用
    的頭像 發表于 10-23 11:41 ?385次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進程</b>權限詳解

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Linux C接口編程入門之文件I/O

    。目錄:目錄也被視為文件,用于組織和存儲其他文件和目錄。通過目錄文件,可以進行文件的查找、創建、刪除和移動等操作。管道(Pipe)和套接字(Socket):Linux提供了管道和套接字機制,用于不同進程之間
    發表于 10-10 09:11

    飛凌嵌入式ElfBoard ELF 1板卡-Linux C接口編程入門之文件I/O

    。目錄:目錄也被視為文件,用于組織和存儲其他文件和目錄。通過目錄文件,可以進行文件的查找、創建、刪除和移動等操作。管道(Pipe)和套接字(Socket):Linux提供了管道和套接字機制,用于不同進程之間
    發表于 10-09 15:38

    linux系統的設備驅動一般分幾類

    Linux系統的設備驅動是操作系統與硬件設備之間的橋梁,負責實現操作系統與硬件設備之間
    的頭像 發表于 08-30 15:13 ?461次閱讀

    深入探討Linux進程調度器

    Linux操作系統作為一個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中一個至關重要的模塊。進程
    的頭像 發表于 08-13 13:36 ?959次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進程</b>調度器

    進程通信的消息隊列介紹

    消息隊列是一種非常常見的進程通信方式。
    的頭像 發表于 04-08 17:27 ?314次閱讀

    linux下查詢進程占用的內存方法有哪些?

    linux下查詢進程占用的內存方法
    發表于 04-08 06:03

    如何在Semaphore(信號量)和Mutex(互斥)之間做選擇?

    在單CPU系統,處理器是一個共享資源。在多個進程之間共享處理器時,處理器的使用由調度程序控制,不存在競爭問題。
    的頭像 發表于 03-05 11:35 ?1000次閱讀
    如何在Semaphore(信號量)和Mutex(互斥)<b class='flag-5'>之間</b>做選擇?

    linux管道概述

    一、進程通信(IPC)介紹 進程通信(IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-18 14:51 ?511次閱讀
    <b class='flag-5'>linux</b>管道概述

    HarmonyOS跨進程通信—IPC與RPC通信開發

    一、IPC與RPC通信概述 基本概念 IPC(Inter-Process Communication)與RPC(Remote Procedure Call)用于實現跨進程通信,不同的是前者
    的頭像 發表于 02-02 17:47 ?1303次閱讀
    HarmonyOS跨<b class='flag-5'>進程</b><b class='flag-5'>通信</b>—IPC與RPC<b class='flag-5'>通信</b>開發

    如何解決Linux系統的網絡連接問題?

    如何解決Linux系統的網絡連接問題? Linux系統的網絡連接問題是常見的技術難題之一,通
    的頭像 發表于 01-12 15:17 ?1042次閱讀
    主站蜘蛛池模板: 国产女人91精品嗷嗷嗷嗷| 蜜柚在线观看免费高清官网视频 | jj插入bb| 色多多深夜福利免费观看| 国产精品久久久久久人妻精品蜜桃| 午夜毛片在线观看| 久久水蜜桃亚洲AV无码精品偷窥| bbw极度另类孕妇| 小SAO货边洗澡边CAO你动漫| 久久成人a毛片免费观看网站| 98国产精品人妻无码免费| 色综合欧美色综合七久久| 精品人妻无码一区二区三区蜜桃臀| 99久久网站| 亚洲国产剧情中文视频在线| 男女XX00上下抽搐动态图| 国产精品一区二区AV交换| 在线自拍综合亚洲欧美| 色综合久久天天影视网| 久久偷拍人| 国产精品日本欧美一区二区| 2017日日干| 亚洲.欧美.中文字幕在线观看| 女人被躁到高潮嗷嗷叫免费| 国产午夜三级一区二区三| gogogo视频在线观看| 亚洲免费综合色视频| 区一区二视频免费观看| 久草在线福利资站免费视频| 父亲在线日本综艺免费观看全集| 在线中文字幕| 亚洲精品国产一区二区贰佰信息网 | 插骚妇好爽好骚| 怡红院美国分院一区二区| 无码人妻精品一区二区蜜桃色欲| 免费欧美大片| 精品蜜臀AV在线天堂| 国产免费内射又粗又爽密桃视频| YELLOW在线观看高清视频免费| 在线欧美免费人成视频| 亚洲AV国产福利精品在现观看|