如何使用DBus中的现有服务?
我能够使用dbus命令,如dbus-send
等。但我没有得到如何有效地使用dbus的API来编写示例应用程序。
任何人都可以告诉我如何从dbus接收数据。我不知道如何使用dbus中的现有服务,如org.freedesktop.NetworkManager
如何使用DBus中的现有服务?
请告诉我访问和使用dbus服务的正确方法。 请张贴一些示例示例,并告诉我在使用服务时我们必须遵循的规则是什么。
我在寻找1)如何将我们自己的服务添加到系统/会话总线。同时,如何接收该服务。 2)如何利用现有的服务,就像org.freedesktop.NetworkManager.GetDevices。我想实现代码
你的问题是相当开放的,你没有说明,例如上的任何要求您计划在示例应用程序中使用何种语言和绑定(如果有)。
当你问d总线的的API,这可能意味着这取决于你打算写你的代码是什么层次的抽象的不同的东西。我将假设您打算使用与D-Bus的低级API集成的绑定,即您将使用的API处于比低级别D-Bus C API更高的抽象级别。
在Python中,使用可用绑定dbus-python
之一,一个非常简单的服务可能是这样的:
dbus-send --session --print-reply --dest=temp.Test /temp/Test temp.Test.Echo string:"hello"
:
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
这样叫继续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或设计文档等的一部分。
在客户端,你会经常不得不做同步或异步调用,并且会对你的设计产生影响(如果绑定和语言支持)的选项。