DBus学习

作者: WB莫遥燚 | 来源:发表于2017-03-25 21:32 被阅读818次

    最近在设计一个Linux桌面程序。而进程间的交互准备使用dbus来解决。
    介绍:
    有那么个组织叫freedesktop,它是专门为linux桌面制定标准的。什么KDE,GNOME都是按他的标准来的。而dbus是其中的桌面消息机制的一个标准。
    dbus是一个IPC的管理系统,其实就底层来说就是本地socket通信。但是他是将所有的消息都通过总线的方式来管理分发,易于管理和安全。
    dbus一般就是3层结构:

    1. libdbus库,允许两个应用相互连接交换消息
    2. 一个建立在libdbus上的消息总线守护程序,这个守护程序可以路由消息
    3. 封装库,比如libdbus-glib或libdbus-qt。一般都是使用封装库来简化使用dbus的细节。
      一般gtk(C语言)开发的话,可以使用gobject-dbus库,qt(c++)的话可以使用dbus-qt库,而Python使用python-dbus模块。
      还有nodejs的话,我推荐使用node-native模块(配合nodewebkit还是比较好用的)。
      还有做dbus相关开发的话,使用一个叫d-feet工具,就可以查看当前所有在使用中的dbus名称及其他属性。

    dbus分为两种总线,一种叫SystemBus,一种叫SessionBus。SystemBus就只有一条,SessionBus是一个用户会话时会产生一条。至于这两种的区别,SystemBus一般是用于权限较高的系统级(root)进程与其他进程(可以是普通进程)的通信,而SessionBus是用于普通的用户进程之间的交流。
    dbus是单对单的通信,其实和C/S架构差不多,一个server端接收消息和发布信号,多个client端发送消息和接收信号。
    dbus通信的话有5个值需要注意:

    1. Address:因为dbus也是通过本地socket来通信,所有会有socket文件。你可以直接连接这个sokcet文件的地址来通信,但这个我几乎不用。
    2. Bus Name:当你使用总线守护进程时(你看进程表里不是有很多dbus-daemon嘛,3层结构的第二层),你只用通过一个Bus Name就可以直接将消息路由到你想要的地址。所以这么方便,干嘛用上面的。server端想要Bus Name需要向SystemBus或SessionBus申请。如果不申请连接到dbus,它会自动被分配一个唯一的名字,就是1.45之类的,这数字没什么意义,只是为了名字唯一。名字除了路由消息还有第二种用途,就是当一个程序退出,断开连接,消息总线就会提醒其他连接程序该名字失去了所有者。这样就容易管理其他程序了
    3. Path:这个路径是指你在进程里的路径,你可以按模块来划分,比如NetwrokManager 有 无线和有线这两模块。
    4. Interface:他就像是一组功能的集合名字,你可以按功能来划分。
    5. Method/Signals:方法和信号,方法其实就是进程里的函数名,你发消息给这个函数名,这个函数就会被调用,并返回结果。信号就是当server端主动调用这个信号函数的时候,便会发出这个信号(信号名就是函数名),其他连接在同一总线上的程序,如果谁感兴趣就会接收处理。
      所以总的来说,其实可以这样理解,Address和Bus Name就相当于你家的城市地址,Path就相当于你家住哪个县哪个区,Interface就相当于你家哪个村哪个路,Method就相当于你家哪个人。dbus则充当了邮局的身份。
      那先尝试下发送个消息看看:
      d-feet在SystemBus下可以找到org.freedesktop.DBus这个Bus Name,它有个Path叫 “ / ”,“ / ”下面有org.freedesktop.DBus这个Interface,里面有个叫GetId的Methods,可以跟它通信一下。这里使用dbus-send命令来发送。dbus-send是dbus提供的一个命令,可直接向目标发送消息。
      ~ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
      返回打印出了一个值,这个值就是GetId函数的执行结果。
      dbus-send使用方法: --system表示是System Bus,--print-reply表示打印回复信息, --desk=[Bus Name] [Path] [Interface].[Method] 表示地址,注意Method是接在Interface后面的。

    dbus python示例可以看http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html 比较详细
    dbus官方wiki:http://www.freedesktop.org/wiki/Software/dbus/

    相关文章

      网友评论

        本文标题:DBus学习

        本文链接:https://www.haomeiwen.com/subject/rtfhottx.html