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