DBus介绍

DBus是Linux上的一种进程间通信框架,通常在Linux桌面软件中比较常用,主要用法就是跨进程的方法调用、信号通知。比如应用A要调用虚拟键盘,就可以发个消息让输入法软件弹出键盘。传统的进程间通信使用是相对麻烦的,而DBus可以实现像调用自己的方法一样调用外部进程的方法,而不用关心连接、重连以及各种异常。

我们可以通过安装DBus工具(D-Feet、dbusviewer或命令行的dbus-send、dbus-monitor)查看系统中的DBus服务。对DBus有更快的认识,推荐使用D-Feet工具,可以快速认知DBus和其中的要素系统总线、会话总线、服务名、对象路径、接口、方法、信号。

如下图D-Feet所示的所有服务,系统中有两条总线,系统总线和会话总线,顾名思义,系统相关和普通会话,普通应用在sessionBus上通信即可。systemBus也提供了系统级的方法和信号。

例如有道翻译服务,创建在sessionBus上,服务名是com.youdao.backend,对像路径/com/youdao/backend(一个服务可以对外提供多个对象),接口(interface)是com.youdao.backend,提供给客户端的方法(Methods)和信号如图,界面可直接绑定信号响应。

DBus中有3个角色,守护进程(Daemon)、DBus服务(上图所有)、DBus客户端。

DBus守护进程提供了一系列管理功能,比如注册服务、服务管理、客户端管理等等。

服务端用法

QDBus服务端的注册代码如下,注册成功就能在sessionbus中看到这个新的服务。

 #define TEST_SERVICE "com.test.service"#define TEST_PATH       "com/test/service"#define TEST_INTERFACE "com.test.interface"... //头文件中 通过Q_CLASSINFO宏来标记interface信息class CTestService : public QObject{Q_OBJECTQ_CLASSINFO("D-Bus Interface", TEST_INTERFACE)
public:explicit CTestService(QObject *parent = nullptr){//在cpp构造函数中注册服务QDBusConnection connection = QDBusConnection::sessionBus();if(!connection.registerService(TEST_SERVICE)){qWarning()<<Q_FUNC_INFO<<"DBus register service error! " <<connection.lastError().name();exit(1);}//注册一个对象到服务中,对象所有的信号和槽函数对外公开,前提必须使用QCLASS_INFOif(!connection.registerObject(TEST_PATH, this, QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals )){qWarning()<<Q_FUNC_INFO<<"DBus register object error!"<<connection.lastError().name();exit(1);}}signals:void repResult(bool ok);
public slots:void restoreData();}...

客户端用法

    //绑定DBus服务中的信号 需要自己声明一个槽函数,绑定上即可//TEST_SERVICE, TEST_PATH, TEST_INTERFACE是服务的三要素,可定位到服务的某个对象,"repResult"就是信号名称QDBusConnection::sessionBus().connect(TEST_SERVICE, TEST_PATH, TEST_INTERFACE,"repResult",this,SLOT(repResult(bool)));//调用DBus服务中提供的方法 这个方法没有参数,如果调用有参数或返回值的方法,还需要传参读返回值,查看帮助手册,参数填在QDBusMessage中,返回值在QDBusMessage中。QDBusMessage message = QDBusMessage::createMethodCall(TEST_SERVICE,TEST_PATH,TEST_INTERFACE,"restoreData");QDBusMessage response = QDBusConnection::sessionBus().call(message);if (response.type() == QDBusMessage::ReplyMessage){qDebug()<<"调用还原成功!";}else{qDebug() << "value method called failed!";}

dbus-send 快捷命令

嵌入式设备不方便用D-Feet可以用命令行工具,命令太长,建议弄成shell函数放在~/. .bustool.sh
新建.bustool.sh文件,source .bustool.sh
bussystem即可查看系统总线上的服务,其他类似

echo "********************欢迎使用DBus快捷查询**********************"
echo "bussytem              查看系统总线"
echo "bussession            查看会话总线"
echo "busasytem             查看系统总线Activatable"
echo "busasession           查看会话总线Activatable"
echo "busobj namex pathx    查看服务上对象包含的方法(需输入两个参数)"bussystem(){dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames
}bussession(){dbus-send --session --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames
}busasystem(){dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListActivatableNames
}busasession(){dbus-send --session --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListActivatableNames
}busobj(){dbus-send --session --type=method_call --print-reply --dest=$1 $2 org.freedesktop.DBus.Introspectable.Introspect
}
~

Qt_QDbus用法相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  3. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  4. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  5. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  6. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  7. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  8. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

  9. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

  10. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

最新文章

  1. 正向最大匹配 和逆向最大匹配对比比较
  2. Metasploit发布了新版本5.0.83
  3. qt designer 插入图片_真的不错,宁波棉服图片
  4. java事件类_关于Java事件类的一些思考
  5. lightroom手机版下载_vnc控制手机版下载,vnc控制手机版下载的使用教程
  6. hotspot虚拟机的调试
  7. Java 并发编程阅读笔记
  8. Android系统(23)---Android 应用分屏
  9. shell 获取ora报错信息_带你了解企业是如何编写脚本的-第2篇:Shell脚本规范
  10. 关于console.log() 打印得引用类型得数据得相关问题
  11. atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: soc
  12. 将.npy文件转.txt文件
  13. Hit Refresh读书摘要
  14. Python量化交易实战教程汇总
  15. 2022年测试工程师面试题大合集「 功能测试,自动化测试等」300道题
  16. esp-idf手动设置系统时间
  17. mysql怎么优化like_MySQL 的 like %关键字怎么优化
  18. python房价预测_python预测房价
  19. glut库更新旧程序无法完成编译问题描述
  20. Python爬虫——豆瓣评分8分以上电影爬取-存储-可视化分析

热门文章

  1. 小程序学习笔记(7)-使用小程序的组件构建UI界面
  2. tomcat配置url跳转_Tomcat安装、配置、优化及负载均衡详解
  3. python遍历目录压缩文件夹_zip包含一个档案文件夹,如何使用Python获取存档中每个zip的注释?...
  4. python字符串介绍_Python字符串详细介绍
  5. mysql 正则排序_MySQL-排序、GROUP BY、连接、NULL值处理、正则表达式、事务
  6. javaagent的优势
  7. 高分辨率扫描出来的图片有摩尔纹_【艺术与设计】 摩尔纹的设计
  8. java定时器 多线程_Java多线程 定时器
  9. 服务器虚拟机要怎么安装,服务器虚拟机怎么安装
  10. shell命令回车_VIM学习笔记 静默执行命令(silent)