linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)
linux 進程間通信 dbus-glib【實例】詳解一(附代碼)(d-feet工具使用)
linux 進程間通信 dbus-glib【實例】詳解二(上) 消息和消息總線(附代碼)
linux 進程間通信 dbus-glib【實例】詳解二(下) 消息和消息總線(ListActivatableNames和服務(wù)器的自動啟動)(附代碼)
linux 進程間通信 dbus-glib【實例】詳解三 數(shù)據(jù)類型和dteeth(類型簽名type域)(層級結(jié)構(gòu):服務(wù)Service --> Node(對象、object) 等 )(附代碼)
linux 進程間通信 dbus-glib【實例】詳解四(上) C庫 dbus-glib 使用(附代碼)(編寫接口描述文件.xml,dbus-binding-tool工具生成綁定文件)
linux 進程間通信 dbus-glib【實例】詳解四(下) C庫 dbus-glib 使用(附代碼)
文章目錄
- dbus實例講解(一):初次見面
- 1、dbus是什么東西?
- 2、D-Bus的基本概念
- 2.1、從例子開始
- 2.2、名詞
- 2.2.1、Bus Name
- 2.2.1.1、可能有多個備選連接的公共名
- 2.2.1.2、每個連接都有一個唯一名
- 2.2.2、Object Paths
- 2.2.3、Interfaces
- 2.2.4、Methods和Signals
- 2.3 小結(jié)
- 3 下集預(yù)告
dbus實例講解(一):初次見面
網(wǎng)上有不少介紹dbus的文章。本文的目標是補充一些簡單的例子。
1、dbus是什么東西?
網(wǎng)上有一篇叫“D-Bus Tutorial”的文章,流傳較廣。不少介紹dbus的資料,都引用了其中的段落。 其實相對于這篇文章,我建議大家直接讀“D-Bus Specification”,篇幅不算長, 文字也不算枯燥。
D-Bus是針對桌面環(huán)境優(yōu)化的IPC(interprocess communication )機制,用于進程間的通信或進程與內(nèi)核的通信。最基本的D-Bus協(xié)議是一對一的通信協(xié)議。 但在很多情況下,通信的一方是消息總線(dbus daemon?)。消息總線是一個特殊的應(yīng)用,它同時與多個應(yīng)用通信,并在應(yīng)用之間傳遞消息。下面我們會在實例中觀察消息總線的作用。 消息總線的角色有點類似與X系統(tǒng)中的窗口管理器,窗口管理器既是X客戶,又負責(zé)管理窗口。
支持dbus的系統(tǒng)都有兩個標準的消息總線:系統(tǒng)總線和會話總線。系統(tǒng)總線用于系統(tǒng)與應(yīng)用的通信。會話總線用于應(yīng)用之間的通信。 網(wǎng)上有一個叫d-feet的python程序,我們可以用它來觀察系統(tǒng)中的dbus世界。
D-Bus是一個程序。它提供了API。但我們一般不會直接使用dbus的接口。dbus-glib是GTK版本的dbus接口封裝。 本文假設(shè)讀者安裝了dbus-glib,我安裝的是dbus-glib-0.76。后面還會看到,通過python操縱dbus是多么簡單。
2、D-Bus的基本概念
2.1、從例子開始
我寫了一個最簡單的dbus服務(wù)器,它通過dbus提供了一個加法的接口。 大家可以下載這個例子。這是一個autotool工程,大家解包后,執(zhí)行:
./autogen.sh ./configure make然后在src目錄運行:
./example-service這時再運行d-feet,連接session bus,在“Bus Name”窗口會看到一個叫“org.fmddlmyy.Test”連接名。
(d-feet我在ubuntu上用apt update && apt install d-feet安裝)
選擇“org.fmddlmyy.Test”,在右側(cè)窗口點擊展開“Object Paths”->“/TestObj”->“Interfaces”->“org.fmddlmyy.Test.Basic”->“Methods”,可以看到一個Add方法。雙擊Add方法,彈出下面這個對話框:
在Parameters窗口輸入“1,2”,點擊“Execute”按鈕,然后在“Output”窗口我們看到了輸出結(jié)果。我們剛剛創(chuàng)建了一個dbus服務(wù)并調(diào)用了它。
2.2、名詞
我們來解釋一下d-feet中出現(xiàn)的名詞。
2.2.1、Bus Name
可以把Bus Name理解為連接的名稱,一個Bus Name總是代表一個應(yīng)用和消息總線的連接。 有兩種作用不同的Bus Name,一個叫公共名(well-known names),還有一個叫唯一名(Unique Connection Name)。
2.2.1.1、可能有多個備選連接的公共名
公共名提供眾所周知的服務(wù)。其他應(yīng)用通過這個名稱來使用名稱對應(yīng)的服務(wù)。可能有多個連接要求提供同個公共名的服務(wù),即多個應(yīng)用連接到消息總線,要求提供同個公共名的服務(wù)。 消息總線會把這些連接排在鏈表中,并選擇一個連接提供公共名代表的服務(wù)。可以說這個提供服務(wù)的連接擁有了這個公共名。 如果這個連接退出了,消息總線會從鏈表中選擇下一個連接提供服務(wù)。公共名是由一些圓點分隔的多個小寫標志符組成的,例如“org.fmddlmyy.Test”、“org.bluez”。
2.2.1.2、每個連接都有一個唯一名
當應(yīng)用連接到消息總線時,消息總線會給每個應(yīng)用分配一個唯一名。唯一名以“:”開頭,“:”后面通常是圓點分隔的兩個數(shù)字,例如“:1.0”。 每個連接都有一個唯一名。在一個消息總線的生命期內(nèi),不會有兩個連接有相同的唯一名。 擁有公眾名的連接同樣有唯一名,例如在前面的圖中,“org.fmddlmyy.Test”的唯一名是“:1.17”。
有的連接只有唯一名,沒有公眾名。可以把這些名稱稱為私有連接,因為它們沒有提供可以通過公共名訪問的服務(wù)。 d-feet界面上有個“Hide Private”按鈕,可以用來隱藏私有連接。
2.2.2、Object Paths
Bus Name確定了一個應(yīng)用到消息總線的連接。在一個應(yīng)用中可以有多個提供服務(wù)的對象。這些對象按照樹狀結(jié)構(gòu)組織起來。 每個對象都有一個唯一的路徑(Object Paths)。或者說,在一個應(yīng)用中,一個對象路徑標志著一個唯一的對象。
“org.fmddlmyy.Test”只有一個叫作“/TestObj”的對象。圖1中的“org.bluez”有多個對象路徑。
2.2.3、Interfaces
通過對象路徑,我們找到應(yīng)用中的一個對象。每個對象可以實現(xiàn)多個接口。例如:“org.fmddlmyy.Test”的“/TestObj”實現(xiàn)了以下接口:
org.fmddlmyy.Test.Basic org.freedesktop.DBus.Introspectable org.freedesktop.DBus.Properties后面講代碼時會看到,我們在代碼中其實只實現(xiàn)了“org.fmddlmyy.Test.Basic”這個接口。 接口“org.freedesktop.DBus.Introspectable”和“org.freedesktop.DBus.Properties”是消息總線提供的標準接口。
2.2.4、Methods和Signals
接口包括方法和信號。例如“org.fmddlmyy.Test”的“/TestObj”對象的“org.fmddlmyy.Test.Basic”接口有一個Add方法。 后面的例子中我們會介紹信號。
標準接口“org.freedesktop.DBus.Introspectable”的Introspect方法是個很有用的方法。 類似于Java的反射接口,調(diào)用Introspect方法可以返回接口的xml描述。我們雙擊 “org.fmddlmyy.Test”->“/TestObj”->“Interfaces”->“org.freedesktop.DBus.Introspectable”的Introspect方法。 這個方法沒有輸入?yún)?shù),我們直接點擊“Execute”按鈕,你在“Output”窗口看到了什么?
(我的點了pretty print還是雜亂格式😵)
后面我們會用另一種方式調(diào)用Introspect方法。
2.3 小結(jié)
“org.fmddlmyy.Test”->“/TestObj”->“Interfaces”->“org.freedesktop.DBus.Introspectable”的Introspect方法, 這個描述是不是很麻煩。其實前面還要加上“session bus”。
后面再看客戶端的C代碼時,我們會看到同樣的過程:用dbus_g_bus_get得到到session bus的連接。 在這個連接上用dbus_g_proxy_new_for_name函數(shù)獲得到擁有指定公共名的連接的指定對象的指定接口的代理。 最后,用dbus_g_proxy_call函數(shù)通過接口代理調(diào)用接口提供的方法。
3 下集預(yù)告
d-feet雖然很方便,但它使用了python的gtk模塊,在一些嵌入式環(huán)境可能使用不了。 后面會看到,用一個叫dbus-send的命令行工具,或者寫幾行python腳本都可以完成同樣的工作。 我們還會用一個叫dbus-monitor的命令行工具觀察dbus調(diào)用過程中究竟發(fā)生了什么?
參考文章:dbus實例講解(一):初次見面
總結(jié)
以上是生活随笔為你收集整理的linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Couldn‘t connect to
- 下一篇: 既然有指针了,为什么c++还要搞个引用出