D-bus学习笔记一 基础知识篇

      最后更新:2022-02-17 01:53

      D-Bus是GNOME和KDE环境中广泛使用的进程间通信的软件,D-Bus允许用户做方法调用或者捕获从别的程序发送的信号,从而达到进程通信的目的。

      Dbus 使用指南

      1.D-Bus 是什么?

      • d-bus 是类unix 操作系统IPC 机制
      • 可用于系统通知,桌面交互操作
      • 低开销:使用二进制协议,需要类似XML
        文本格式转换
      • 易使用:使用 message 来通讯,开发者可
        利用d-bus动态库使用d-bus已有的
        object/type 系统开发

      1.2D-Bus 类型

      • system bus
        系统更新通知,如插入新设备通知、新软件安装通知等
      • session bus
        桌面应用的交互协作能力,可以作为文件系统监控器和配置服务器

      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” ,不需要返回值,则整个消息如下(假设采用小端字节序):

      1.3 D-Bus 体系介绍

      D-Bus是一套进程通信体系,它有以下几层:
      1.libdbus库,提供给各个应用程序调用,使应用程序具有通信和数据交换的
      能力,两个应用程序可以直接进行通信,就像是一条socket通道,两
      个程序之间建立通道之后,就可以通讯了。
      2.消息守护进程,在libdbus的基础上创建,可以管理多个应用程序之间的通
      信。每个应用程序都和消息守护进程建立dbus的链接,然后由消息守
      护进程进行消息的分派。
      3.各种包装库,有libdbus-glib,libdbus-qt等等,目的是将dbus的底层api进
      行一下封装。

      2. D-Bus怎么用?

      流程:

      关键的接口以及功能:

      2.D-Bus相关工具

      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”

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类