【问题标题】:How do I create a D-Bus service that dynamically creates multiple objects?如何创建动态创建多个对象的 D-Bus 服务?
【发布时间】:2009-03-20 20:05:24
【问题描述】:

我是 D-Bus 的新手(以及 Python 的新手,双重打击!),我正在尝试找出做本教程中讨论的事情的最佳方法。

但是,文本编辑器应用程序 可以轻松拥有多个总线名称 (例如,org.kde.KWrite 中 除了通用的 TextEditor),还有 多个对象(也许 /org/kde/documents/4352 在哪里 号码根据情况变化 文档),并且每个对象都可以 实现多个接口,例如 org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument.

例如,假设我想围绕flickrapi 创建一个包装器,以便服务可以公开一些 Flickr API 方法(例如,urls_lookupGroup())。如果我想假设服务将始终指定相同的 API 密钥并且使用该服务的每个人的身份验证信息都是相同的,那么这相对简单。

尤其是在后一种情况下,我不能真正假设这是真的。

根据上面引用的文档,我假设应该是这样的:

# 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 教程和各种文档,其中最接近我所寻找的内容就是我上面引用的内容。但是,没有一个示例看起来真的会做这样的事情,所以我不确定如何继续。

【问题讨论】:

    标签: python dbus


    【解决方案1】:

    1) 大多数情况下是的,我只会更改连接方法中的一件事,正如我在 2) 中解释的那样。

    2) D-Bus 连接不是持久的,一切都通过请求/响应消息完成,不存储连接状态,除非您像使用 flickerObject 那样在第三个对象中实现它。 python绑定中的d-bus对象主要是抽象远程对象的代理,就好像你“连接”到它们一样,但它真正做的是根据你提供给D-Bus对象实例化的信息(对象路径,界面等)。因此,如果客户端没有通过其他显式调用来宣布它,则服务无法知道客户端何时完成。

    要处理意外的客户端终结,您可以在客户端中创建一个 D-Bus 对象并在连接时将对象路径发送到服务,更改您的 connect 方法以同时接受 ObjectPath 参数。该服务可以监听 NameOwnerChanged 信号以了解客户端是否已死亡。

    要创建单个对象,您只需在与“/Connection”相同的服务中实例化一个对象,但您必须确保您使用的是不存在的名称。你可以有一个“/Connection/Manager”,以及各种“/Connection/1”、“/Connection/2”...

    3)如果你需要存储连接状态,你必须做类似的事情。

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多