故事背景 在linux開發中我們經常會用到dbus來進行進程間通信,但是如何理解dbus服務端和客戶端呢?很多小伙伴可能都會遇到類似的問題,而且都是含含糊糊的,接下來我們直接上硬菜。 探索之路 首先要明白dbus是什麼,有什麼作用? 如何把自己的程式做成dbus服務? 如何調用dbus介面? 經驗心 ...
故事背景
在linux開發中我們經常會用到dbus來進行進程間通信,但是如何理解dbus服務端和客戶端呢?很多小伙伴可能都會遇到類似的問題,而且都是含含糊糊的,接下來我們直接上硬菜。
探索之路
- 首先要明白dbus是什麼,有什麼作用?
- 如何把自己的程式做成dbus服務?
- 如何調用dbus介面?
經驗心得
基礎的概念這裡就不在介紹了,大家可以在網上自行查找,資料很多,下麵我會把我遇到的問題和一些經驗分享給大家。
一. dbus服務端
- xxx.h 頭文件需要準備的東西
class Test : public QObject, protected QDBusContext
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "com.test")
public slots:
void slot1();
signals:
void signal1();
}
- 根據頭文件生成對應的xml文件
qdbuscpp2xml -A test.h -o com.test.xml
- 根據xml生成生成Adaptor類,這裡介紹cmake的寫法
qt5_add_dbus_adaptor(
test_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/com.test.xml
test.h
Test
)
- main函數準備的內容
#include "testadaptor.h"
#define Service "com.test"
#define Path "/com/test"
#define Interface "com.test"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Test test;
TestAdaptor adapter(&test);
Q_UNUSED(adapter);
if (!QDBusConnection::sessionBus().registerService(Service)) {
return -1;
}
if (!QDBusConnection::sessionBus().registerObject(Path, Interface, &watermark)) {
return -2;
}
return app.exec();
}
到此為止,dbus服務端相關的準備工作已經全部完成,如果你希望別人在調用你dbus介面的時候拉起dbus服務,那麼你還要做下麵的準備:
- 準備test.service文件
[Unit]
Description=xxx
[Service]
Type=simple
ExecStart=/usr/bin/test
Restart=always
RestartSec=1
[Install]
WantedBy=default.target
- test.service文件安裝位置/share/dbus-1/services,這裡我們直接寫到cmake中
install_files(
"/share/dbus-1/services"
FILES
${CMAKE_CURRENT_BINARY_DIR}/com.deepin.watermark.service
)
二. 客戶端調用dbus介面
- 監聽信號
QDBusConnection::sessionBus().connect("servername", "path", "interface", "signal", this, SLOT(xxx()));
- 調用方法和屬性
QDBusInterface screensaverInterface("servername", "path", "interface");
screensaverInterface.property("isRunning").toBool();//獲取屬性值
QDBusReply<void> reply = screensaverInterface.call("method");//調用方法
- 監聽屬性信號變化
QDBusConnection::sessionBus().connect("servername", "path", "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(displayProperty(QString, QVariantMap, QStringList)));
參考資料
Qt高級——D-Bus快速入門1
Qt高級——D-Bus快速入門2