• 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

  • 相关阅读:
    【.Net】鼠标点击控制鼠标活动范围 ClipCursor
    【设计模式】工厂模式 Factory Pattern
    sublime text3 关闭更新提醒
    Mac下Sublime Text3激活码
    测试开发(1) -- 整数反转
    测试开发工程师面试资料(未完)
    Mojave使用pyenv安装python-zlib错误
    清理 Xcode 10
    mitmproxy
    卸载CocoaPods
  • 原文地址:https://www.cnblogs.com/xupeidong/p/16088249.html
Copyright © 2020-2023  润新知