最近想學習gdbus,gdbus是對dbus的一種封裝,能夠更好的使用dbus。DBUS是一種高級的進程間通信機制。DBUS支持進程間一對一和多對多的對等通信,在多對多的通訊時,需要後臺進程的角色去分轉消息,當一個進程發消息給另外一個進程時,先發消息到後臺進程,再通過後臺進程將信息轉發到目的進程。DBUS後臺進程充當着一個路由器的角色。DBUS中主要概念爲總線,連接到總線的進程可通過總線接收或傳遞消息,總線收到消息時,根據不同的消息類型進行不同的處理。
https://blog.csdn.net/yishuige/article/details/52852531
這篇文章是介紹dbus的,可以不用看例程,看看基本概念。
研究gdbus開始時當然是他的庫的編譯,經過一番查找,發現gdbus是包含在glib的gio中,所以我們只需要編譯出glib就可以正常使用gdbus了。
開始在網上找了個例程,經過編譯之後想運行一下,看看效果,運行時總是進入GBusNameLostCallback,也就是無法獲取總線名字,後來看了
https://blog.csdn.net/gxh9314/article/details/79093711?utm_source=blogxgwz9
關於dbus的部署,發現gdbus功能實現需要dbus-daemon的支持。
這篇文章就講一下我們如何編譯、安裝、部署dbus。
如果你的設備能夠直接apt install 可以直接跳轉到部署環節。
下載dbus源碼
dbus官方網站
https://www.freedesktop.org/wiki/Software/dbus/
我使用的版本,下載網址
https://gitlab.freedesktop.org/dbus/dbus/-/tree/dbus-1.12
下載之後就是選擇一個地方進行解壓,準備進行編譯。
tar xvf dbus-dbus-1.12.tar
cd dbus-dbus-1.12
編譯 安裝
當拿到一個開源代碼時,我們可以先看一下他的readme,如果有install可以看一下,一般編譯的方法都在這個文件中。
dbus提供了兩種編譯方式,autoconfig和cmake
兩種方式得到的生成產物不同。
autoconfig會生成dbus.service和dbus.socket,並嘗試安裝到系統中。
但是他的可執行只有dbus-daemon
cmake中間過程生成文件統一放在一個文件夾中,比較整潔
可執行會生成更多的相關命令和測試命令,但是很可能這些東西不會用到。
而且不會生成dbus.service和dbus.socket。
我的建議是使用cmake編譯,然後根據bus/dbus.service.in編寫自己的service文件。
下面分別講一下兩個編譯過程
./autogen.sh
./configure --prefix=/xxx
make
make install
其中--prefix=是可選的安裝路徑
編譯完成後會輸出一些關於安裝的信息
ldflags: -Wl,--no-as-needed
64-bit int: long
32-bit int: int
16-bit int: short
Doxygen: /usr/bin/doxygen
xmlto: /usr/bin/xmlto
ducktype: no
yelp-build: no
Rebuilding generated files: yes
gcc coverage profiling: no
Building embedded tests: no
Building modular tests: auto
- with GLib: yes
Installing tests: no
Building verbose mode: no
Building assertions: no
Building checks: yes
Building bus stats API: yes
Building SELinux support: no
Building AppArmor support: no
Building inotify support: yes
Building kqueue support: no
Building systemd support: yes
Building X11 code: yes
Building Doxygen docs: yes
Building Ducktype docs: no
Building XML docs: yes
Building launchd support: no
System bus socket: /home/xxx/glibtest/gdbus/dbus/var/run/dbus/system_bus_socket
System bus address: unix:path=/home/xxx/glibtest/gdbus/dbus/var/run/dbus/system_bus_socket
System bus PID file: /home/xxx/glibtest/gdbus/dbus/var/run/dbus/pid
Session bus listens on: unix:tmpdir=/tmp
Session clients connect to: autolaunch:
pam_console auth dir: (none)
Console owner file: no
Console owner file path:
System bus user: messagebus
Session bus services dir: /home/xxx/glibtest/gdbus/dbus/share/dbus-1/services
'make check' socket dir: /tmp
Libraries have been installed in:
/home/xxx/glibtest/gdbus/dbus/lib
/usr/bin/install: 無法刪除'/lib/systemd/system/dbus.service': 權限不夠
/usr/bin/install: 無法刪除'/lib/systemd/system/dbus.socket': 權限不夠
cmake編譯
mkdir dbus-build-dir
cd dbus-build-dir
cmake -DCMAKE_INSTALL_PREFIX=/xxx ../cmake
make
make install
其中-DCMAKE_INSTALL_PREFIX=是可選的安裝路徑
到此就完成了dbus的編譯和安裝,在安裝的路徑下可以找到dbus-daemon,如果需要作爲服務啓動需要編寫相應的.service文件。
部署
https://blog.csdn.net/gxh9314/article/details/79093711?utm_source=blogxgwz9
這篇文章講的很詳細,主要就是
啓動dbus-daemon
dbus-daemon --session --address=unix:path=/var/run/dbus/session_bus_socket &
設置環境變量
export DBUS_SESSION_BUS_ADDRESS=unix:path=/var/run/dbus/session_bus_socket
路徑必須存在,並且環境變量和啓動參數必須一致,如果你是service啓動可以在service文件中設置環境變量
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/var/run/dbus/session_bus_socket"
部署完成,下一篇貼上gdbus例程。