dbus的奇妙世界

故事背景

    在linux开发中我们经常会用到dbus来进行进程间通信,但是如何理解dbus服务端和客户端呢?很多小伙伴可能都会遇到类似的问题,而且都是含含糊糊的,接下来我们直接上硬菜。

探索之路

  1. 首先要明白dbus是什么,有什么作用?
  2. 如何把自己的程序做成dbus服务?
  3. 如何调用dbus接口?

经验心得

    基础的概念这里就不在介绍了,大家可以在网上自行查找,资料很多,下面我会把我遇到的问题和一些经验分享给大家。

一. dbus服务端

  1. xxx.h 头文件需要准备的东西
class Test : public QObject, protected QDBusContext
{
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "com.test")

public slots:
	void slot1();
signals:
	void signal1();
}
  1. 根据头文件生成对应的xml文件
qdbuscpp2xml -A test.h -o com.test.xml
  1. 根据xml生成生成Adaptor类,这里介绍cmake的写法
qt5_add_dbus_adaptor(
    test_SRCS
    ${CMAKE_CURRENT_SOURCE_DIR}/com.test.xml
    test.h
    Test
)
  1. 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接口

  1. 监听信号
QDBusConnection::sessionBus().connect("servername", "path", "interface", "signal", this, SLOT(xxx()));
  1. 调用方法和属性
QDBusInterface screensaverInterface("servername", "path", "interface");
screensaverInterface.property("isRunning").toBool();//获取属性值
QDBusReply<void> reply = screensaverInterface.call("method");//调用方法
  1. 监听属性信号变化
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

posted @ 2022-04-01 17:58  徐沛东  阅读(520)  评论(0编辑  收藏  举报