我是D-Bus的新手(对于Python来说,双重打击!)我正试图找出做本教程中讨论的最佳方法。
但是,文本编辑器应用程序 可以轻松拥有多个总线名称 (例如,org.kde.KWrite in 除了通用TextEditor之外,还有 多个对象(也许 / org / kde / documents / 4352其中 数量根据变化而变化 文件),每个对象都可以 实现多个接口,例如 org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument。
例如,假设我想在flickrapi
周围创建一个包装器,这样服务就可以公开一些Flickr API方法(比如urls_lookupGroup()
)。如果我想假设服务将始终指定相同的API密钥并且使用该服务的每个人的auth信息都相同,则这是相对简单的。
特别是在后一种情况下,我无法真正认为这是真的。
根据上面引用的文档,我假设应该有类似的东西:
# Get the connection proxy object.
flickrConnectionService = bus.get_object("com.example.FlickrService",
"/Connection")
# Ask the connection object to connect, the return value would be
# maybe something like "/connection/5512" ...
flickrObjectPath = flickrConnectionService.connect("MY_APP_API_KEY",
"MY_APP_API_SECRET",
flickrUsername)
# Get the service proxy object.
flickrService = bus.get_object("com.example.FlickrService",
flickrObjectPath);
# As the flickr service object to get group information.
groupInfo = flickrService.getFlickrGroupInfo('s3a-belltown')
所以,我的问题:
1)这应该如何处理?
2)如果是这样,服务如何知道客户端何时完成?有没有办法检测当前客户端是否已断开连接,以便服务可以清理其动态创建的对象?另外,我如何首先创建单个对象?
3)如果这不是应该如何处理的,那么有什么其他建议来完成类似的事情?
我已经阅读了许多D-Bus教程和各种文档,以及我最接近看到我正在寻找的是我上面引用的内容。但是,没有一个例子看起来实际上做了这样的事情,所以我不知道如何继续。
答案 0 :(得分:2)
1)大多数情况下,我只会在连接方法中改变一件事,正如我在2)中解释的那样。
2)D-Bus连接不是持久性的,一切都是通过请求/响应消息完成的,除非你像在flickerObject
那样在第三个对象中实现,否则不存储连接状态。 python绑定中的d-bus对象主要是抽象远程对象的代理,就像你“连接”它们一样,但它真正做的是根据你给D-Bus对象实例化的信息构建消息(对象路径) ,界面等)。因此,如果客户端没有通过其他显式调用通知它,则服务无法知道客户端何时完成。
要处理意外的客户端最终化,您可以在客户端中创建D-Bus对象,并在连接时将对象路径发送到服务,更改connect
方法以接受ObjectPath
参数。该服务可以收听 NameOwnerChanged
信号,以了解客户是否已经死亡。
要创建单个对象,您只需在与“/ Connection”相同的服务中实例化对象,但必须确保使用的是未使用的名称。你可以有一个“/ Connection / Manager”和各种“/ Connection / 1”,“/ Connection / 2”......
3)如果你需要存储连接状态,你必须做类似的事情。