有那么個(gè)組織叫freedesktop,它是專門為linux桌面制定標(biāo)準(zhǔn)的。什么KDE,GNOME都是按他的標(biāo)準(zhǔn)來(lái)的。而dbus是其中的桌面消息機(jī)制的一個(gè)標(biāo)準(zhǔn)。
dbus是一個(gè)IPC的管理系統(tǒng),其實(shí)就底層來(lái)說(shuō)就是本地socket通信。但是他是將所有的消息都通過(guò)總線的方式來(lái)管理分發(fā),易于管理和安全。
dbus一般就是3層結(jié)構(gòu):
1. libdbus庫(kù),允許兩個(gè)應(yīng)用相互連接交換消息 2. 一個(gè)建立在libdbus上的消息總線守護(hù)程序,這個(gè)守護(hù)程序可以路由消息 3. 封裝庫(kù),比如libdbus-glib或libdbus-qt。一般都是使用封裝庫(kù)來(lái)簡(jiǎn)化使用dbus的細(xì)節(jié)。
一般gtk(c語(yǔ)言)開(kāi)發(fā)的話,可以使用gobject-dbus庫(kù),qt(c++)的話可以使用dbus-qt庫(kù),而python使用python-dbus模塊。
還有nodejs的話,我推薦使用node-native模塊(配合nodewebkit還是比較好用的)。
還有做dbus相關(guān)開(kāi)發(fā)的話,使用一個(gè)叫d-feet工具,就可以查看當(dāng)前所有在使用中的dbus名稱及其他屬性。
dbus分為兩種總線,一種叫SystemBus,一種叫SessionBus。SystemBus就只有一條,SessionBus是一個(gè)用戶會(huì)話時(shí)會(huì)產(chǎn)生一條。至于這兩種的區(qū)別,SystemBus一般是用于權(quán)限較高的系統(tǒng)級(jí)(root)進(jìn)程與其他進(jìn)程(可以是普通進(jìn)程)的通信,而SessionBus是用于普通的用戶進(jìn)程之間的交流。
dbus是單對(duì)單的通信,其實(shí)和C/S架構(gòu)差不多,一個(gè)server端接收消息和發(fā)布信號(hào),多個(gè)client端發(fā)送消息和接收信號(hào)。
dbus通信的話有5個(gè)值需要注意:
1. Address:因?yàn)閐bus也是通過(guò)本地socket來(lái)通信,所有會(huì)有socket文件。你可以直接連接這個(gè)sokcet文件的地址來(lái)通信,但這個(gè)我?guī)缀醪挥谩?br> 2. Bus Name:當(dāng)你使用總線守護(hù)進(jìn)程時(shí)(你看進(jìn)程表里不是有很多dbus-daemon嘛,3層結(jié)構(gòu)的第二層),你只用通過(guò)一個(gè)Bus Name就可以直接將消息路由到你想要的地址。所以這么方便,干嘛用上面的。server端想要Bus Name需要向SystemBus或SessionBus申請(qǐng)。如果不申請(qǐng)連接到dbus,它會(huì)自動(dòng)被分配一個(gè)唯一的名字,就是1.45之類的,這數(shù)字沒(méi)什么意義,只是為了名字唯一。名字除了路由消息還有第二種用途,就是當(dāng)一個(gè)程序退出,斷開(kāi)連接,消息總線就會(huì)提醒其他連接程序該名字失去了所有者。這樣就容易管理其他程序了
3. Path:這個(gè)路徑是指你在進(jìn)程里的路徑,你可以按模塊來(lái)劃分,比如NetwrokManager 有 無(wú)線和有線這兩模塊。
4. Interface:他就像是一組功能的集合名字,你可以按功能來(lái)劃分。
5. Method/Signals:方法和信號(hào),方法其實(shí)就是進(jìn)程里的函數(shù)名,你發(fā)消息給這個(gè)函數(shù)名,這個(gè)函數(shù)就會(huì)被調(diào)用,并返回結(jié)果。信號(hào)就是當(dāng)server端主動(dòng)調(diào)用這個(gè)信號(hào)函數(shù)的時(shí)候,便會(huì)發(fā)出這個(gè)信號(hào)(信號(hào)名就是函數(shù)名),其他連接在同一總線上的程序,如果誰(shuí)感興趣就會(huì)接收處理。
所以總的來(lái)說(shuō),其實(shí)可以這樣理解,Address和Bus Name就相當(dāng)于你家的城市地址,Path就相當(dāng)于你家住哪個(gè)縣哪個(gè)區(qū),Interface就相當(dāng)于你家哪個(gè)村哪個(gè)路,Method就相當(dāng)于你家哪個(gè)人。dbus則充當(dāng)了郵局的身份。
那先嘗試下發(fā)送個(gè)消息看看:
d-feet在SystemBus下可以找到org.freedesktop.DBus這個(gè)Bus Name,它有個(gè)Path叫 “ / ”,“ / ”下面有org.freedesktop.DBus這個(gè)Interface,里面有個(gè)叫GetId的Methods,可以跟它通信一下。這里使用dbus-send命令來(lái)發(fā)送。dbus-send是dbus提供的一個(gè)命令,可直接向目標(biāo)發(fā)送消息。
~ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
返回打印出了一個(gè)值,這個(gè)值就是GetId函數(shù)的執(zhí)行結(jié)果。
dbus-send使用方法: --system表示是System Bus,--print-reply表示打印回復(fù)信息, --desk=[Bus Name] [Path] [Interface].[Method] 表示地址,注意Method是接在Interface后面的。
|