我可以使用像dbus-send
等dbus命令。但是我没有得到如何有效地使用dbus的api来编写示例应用程序。
任何人都可以告诉我如何从dbus接收数据。我没有得到如何使用像org.freedesktop.NetworkManager
请告诉我访问和使用dbus服务的正确方法。 请发布一些示例,并建议我在使用服务时必须遵循的规则。
我正在寻找1)如何将我们自己的服务添加到系统/会话Bus.At同时,如何接收该服务。 2)如何使用现有的服务就像org.freedesktop.NetworkManager.GetDevices。我想要实现代码
答案 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或设计文档等的一部分。
在客户端,您通常可以选择进行同步或异步调用(如果受绑定和语言支持),这将对您的设计产生影响。