最后更新:2022-02-17 01:53
D-Bus是GNOME和KDE环境中广泛使用的进程间通信的软件,D-Bus允许用户做方法调用或者捕获从别的程序发送的信号,从而达到进程通信的目的。
简介
消息协议由 首部( header ) 和 主体( body ) 两部分组成。
header 的签名是固定的,值的含义也是固定的
header 的长度必须是8的整数倍,以便数据进行对齐
body 只有值,其签名在 header 中
body 的长度不需要为8的倍数
header 加 body 的总长度(包括对齐充填)不得超过128MiB
首部
header 的类型签名为 yyyyuua(yv) ,即 :
这些值具有以下含义
| 值 | 说明 |
|---|---|
| 第一个byte | 字节序,'l’表示小端、'B’表示大端 |
| 第二个byte | 消息类型 |
| 第三个byte | 位标志的按位或 |
| 第四个byte | 协议版本,只能为1 |
| 第一个uint32 | 主体的长度(以字节为单位) |
| 第二个uint32 | 消息的序列号 |
| 结构体数组 | 首部字段数组,byte是字段标识,varaint是字段的值 |
| 类型 | 值 | 说明 |
|---|---|---|
| INVALID | 0 | 无效的类型,必须被忽略 |
| METHOD_CALL | 1 | 方法调用 |
| METHOD_RETURN | 2 | 方法调用的返回值 |
| ERROR | 3 | 错误回复 |
| SIGNAL | 4 | 信号发送 |
位标志
| 标志 | 值 | 说明 |
|---|
NO_REPLY_EXPECTED | 0x01 |不需要返回值和错误
NO_AUTO_START| 0x02| 不自动启动接收方进程
ALLOW_INTERACTIVE_AUTHORIZATION 0x04 通知接收方调用者已准备好等待交互式授权,仅当非特权代码调用特权更大的方法,并且部署了允许进行交互式授权的授权框架时,此标志才有效。
| 字段名 | 字段标识 | 字段值类型 | 何时必填 | 说明 |
|---|---|---|---|---|
| INVALID | 0 | N/A | N/A | 无效 |
| PATH | 1 | OBJECT_PATH | METHOD_CALL, SIGNAL | 对象路径 |
| INTERFACE | 2 | STRING | SIGNAL | 被调用的接口或触发点信号 |
| MEMBER | 3 | STRING | METHOD_CALL, SIGNAL | 方法或信号的名称 |
| ERROR_NAME | 4 | STRING | ERROR | 发生的错误的名称 |
| REPLY_SERIAL | 5 | UINT32 | ERROR, METHOD_RETURN | 答复的消息的序列号 |
| DESTINATION | 6 | STRING | 非必填 | 此消息打算连接的目标的名称 |
| SENDER | 7 | STRING | 非必填 | 发送方的唯一名称 |
| SIGNATURE | 8 | SIGNATURE | 非必填 | body 的类型签名 |
| UNIX_FDS | 9 | UINT32 | 非必填 | 带外数据中文件描述符的个数 |
主体
首部中已经确定了目标,且主体部分的类型签名也在首部字段的SIGNATURE中,因此主体只需要按照 封装格式封装数据即可。
例如调用 org.demo.Hbc.Speak(string msg) 方法,对象路径为 /org/demo/Hbc ,参数为 “hello world” ,不需要返回值,则整个消息如下(假设采用小端字节序):
D-Bus是一套进程通信体系,它有以下几层:
1.libdbus库,提供给各个应用程序调用,使应用程序具有通信和数据交换的
能力,两个应用程序可以直接进行通信,就像是一条socket通道,两
个程序之间建立通道之后,就可以通讯了。
2.消息守护进程,在libdbus的基础上创建,可以管理多个应用程序之间的通
信。每个应用程序都和消息守护进程建立dbus的链接,然后由消息守
护进程进行消息的分派。
3.各种包装库,有libdbus-glib,libdbus-qt等等,目的是将dbus的底层api进
行一下封装。
流程:
关键的接口以及功能:
d-feet dbus-sender dbus-mointer
1.dbus-send 可以进行信号的发送
案例:
–system ##将命令发向系统总线,也可使用–session
–print-reply ## 打印返回结果
–dest=org.freedesktop.ExampleName ##服务名。用户可以用查询命令获得当前系统的所有服务名
/org/freedesktop/sample/object/name ## 对象名。由服务定义
org.bluez.audio.Manager.CreateDevice
org.freedesktop.ExampleInterface.ExampleMethod ##方法名
int32:47 string:‘hello world’ double:65.32
array:string:“1st item”,“next item”,“last item”
dict:string:int32:“one”,1,“two”,2,“three”,3
variant:int32:-8
objpath:/org/freedesktop/sample/object/name ## 参数 类型:值 int32:123
dbus-monitor type=‘signal’,sender=‘org.gnome.TypingMonitor’,interface=‘org.gnome.TypingMonitor’
dbus-monitor --session “interface=com.deepin.daemon.Display”
本文由 在线网速测试 整理编辑,转载请注明出处。