如何在DBus中使用现有服务?

时间:2015-12-08 04:39:03

标签: ipc dbus

我可以使用像dbus-send等dbus命令。但是我没有得到如何有效地使用dbus的api来编写示例应用程序。

任何人都可以告诉我如何从dbus接收数据。我没有得到如何使用像org.freedesktop.NetworkManager

这样的dbus中的现有服务

请告诉我访问和使用dbus服务的正确方法。 请发布一些示例,并建议我在使用服务时必须遵循的规则。

我正在寻找1)如何将我们自己的服务添加到系统/会话Bus.At同时,如何接收该服务。 2)如何使用现有的服务就像org.freedesktop.NetworkManager.GetDevices。我想要实现代码

1 个答案:

答案 0 :(得分:0)

您的问题非常开放,因为您没有说明任何要求,例如:您计划在示例应用程序中使用的语言和绑定(如果有)。

当您询问D-Bus的API时,这可能意味着不同的事情取决于您打算编写代码的抽象级别。我将假设您打算使用与D-Bus的低级API集成的绑定,即您将使用的API处于比低级D-Bus C API更高的抽象级别。

在python中,使用一个可用的绑定dbus-python,一个非常简单的服务可能如下所示:

import gobject
import dbus
import dbus.service

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)


OPATH = "/temp/Test"
IFACE = "temp.Test"
BUS_NAME = "temp.Test"


class MyService(dbus.service.Object):
    def __init__(self):
        bus = dbus.SessionBus()
        bus.request_name(BUS_NAME, dbus.bus.NAME_FLAG_REPLACE_EXISTING)
        bus_name = dbus.service.BusName(BUS_NAME, bus=bus)
        dbus.service.Object.__init__(self, bus_name, OPATH)

    @dbus.service.method(dbus_interface=IFACE, in_signature="s")
    def Echo(self, message):
        return "received: " + message


if __name__ == "__main__":
    my_service = MyService()
    loop = gobject.MainLoop()
    loop.run()

然后可以使用Echo调用dbus-send方法,如下所示:

dbus-send --session --print-reply --dest=temp.Test /temp/Test temp.Test.Echo string:"hello"

继续python示例,上述服务的客户端可能如下所示:

import dbus

bus = dbus.SessionBus()
the_service = bus.get_object("temp.Test", "/temp/Test")
service_interface = dbus.Interface(service_object, dbus_interface="temp.Test")

print service_interface.Echo("hello")

有关dbus-python详细信息的详细信息,请查看此tutorial

扩展客户端示例,调用org.freedesktop.NetworkManager.GetDevices的一种方法是:

import dbus

bus = dbus.SystemBus()
service_object = bus.get_object("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager")
service_interface = dbus.Interface(service_object, dbus_interface="org.freedesktop.NetworkManager")

print service_interface.GetDevices()

因此,一般来说,您需要找出所选语言的绑定,然后了解您要与之交互的任何特定服务的API。有关如何与服务交互的任何特定规则应记录为API或设计文档等的一部分。

在客户端,您通常可以选择进行同步或异步调用(如果受绑定和语言支持),这将对您的设计产生影响。