ofono dbus 内省:找不到方法

Posted

技术标签:

【中文标题】ofono dbus 内省:找不到方法【英文标题】:ofono dbus Introspection: method not found 【发布时间】:2016-09-05 01:09:36 【问题描述】:

根据ofono 1.17的文档:

https://github.com/rilmodem/ofono/tree/master/doc

免提有两个接口:

org.ofono.Handsfree org.ofono.HandsfreeAudioManager

我需要访问它们才能使 pulseaudio 正常工作。 它返回此错误:

E: [pulseaudio] backend-ofono.c: 注册为免提失败 带有 ofono 的音频代理:org.freedesktop.DBus.Error.UnknownMethod: 方法“注册”在界面上签名“oay” “org.ofono.HandsfreeAudioManager”不存在

但是该方法存在(根据上面的文档)并且具有该签名:对象路径,数组字节。

因此我猜它是不可访问的,而不是不存在的。 我写了一个简单的 Python 脚本来列出可用的服务和 org.ofono。

然后我添加了列出对象的代码:

def list_obj(bus, service, object_path):
    print(object_path)
    obj = bus.get_object(service, object_path)
    iface = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable')
    xml_string = iface.Introspect()
    for child in ElementTree.fromstring(xml_string):
        if child.tag == 'node':
            if object_path == '/':
                object_path = ''
            new_path = '/'.join((object_path, child.attrib['name']))
            list_obj(bus, service, new_path)

bus = dbus.SystemBus()
list_obj(bus, 'org.ofono.HandsfreeAudioManager', '/')

但我收到以下错误:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NameHasNoOwner:无法获得名称的所有者 'org.ofono.HandsfreeAudioManager': 没有这个名字

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown:名称 org.ofono.HandsfreeAudioManager 不是由任何 .service 文件提供的

我还在 /etc/dbus-1/system.d/ofono.conf 中检查了 dbus 的用户策略:

<policy user="user">
  <allow own="org.ofono"/>
  <allow send_destination="org.ofono"/>
  <allow send_interface="org.ofono.SimToolkitAgent"/>
  <allow send_interface="org.ofono.PushNotificationAgent"/>
  <allow send_interface="org.ofono.SmartMessagingAgent"/>
  <allow send_interface="org.ofono.PositioningRequestAgent"/>
  <allow send_interface="org.ofono.HandsfreeAudioManager"/>
  <allow send_interface="org.ofono.Handsfree"/>   
</policy>

<policy at_console="true">
 <allow send_destination="org.ofono"/>   
</policy>

<policy context="default">
  <deny send_destination="org.ofono"/>   
</policy>

当然,我以用户“用户”的身份运行 ofono 和上面的代码。 我的想法已经不多了……我应该怎么做才能解决这个问题?

【问题讨论】:

更改 list_obj 调用如下:list_obj(bus, 'org.ofono', '/org/ofono/HandsfreeAudioManager') 没有错误,但没有返回任何方法。 【参考方案1】:

list_obj

https://github.com/rilmodem/ofono/blob/master/doc/handsfree-audio-api.txt 描述如下接口:

Service     org.ofono
Interface   org.ofono.HandsfreeAudioManager
Object path /

https://github.com/rilmodem/ofono/blob/master/doc/handsfree-api.txt 描述了这个:

Service     org.ofono
Interface   org.ofono.Handsfree
Object path [variable prefix]/modem0,modem1,...

这意味着 bus.get_object 方法的服务参数必须是“org.ofono”,而 object_path 参数必须是 /(对于 HandsfreeAudioManager)或 [变量前缀]/modem0,modem1,... (免提)。

因此,您应该使用 obj(bus, 'org.ofono', '/')。

注册

我猜你的 org.ofono / 对象可能没有实现 org.ofono.HandsfreeAudioManager 接口,或者 Register 的签名与文档中描述的不同。

您可能想尝试使用 pydbus - https://github.com/LEW21/pydbus 而不是已弃用的 python-dbus 绑定。它支持在代理对象上使用 Python 内置的 help() 函数,这样您就可以轻松查看所有受支持的接口以及它们所有方法的签名:

from pydbus import SystemBus
bus = SystemBus()
ofono = bus.get("org.ofono", "/")
help(ofono)

返回的 ofono 对象一次暴露了所有实现的接口,所以如果对象实现了很多接口可能会造成混淆。在这种情况下,您可以获得仅支持单个接口的代理对象(例如使用 python-dbus 的 dbus.Interface):

manager = ofono["org.ofono.HandsfreeAudioManager"]
help(manager)

但是,与 dbus.Interface(静默失败)不同,如果对象未实现此接口,它将抛出 KeyError。

(免责声明:我是pydbus的作者)

【讨论】:

感谢您的详细回答。我会检查我是否可以在我的系统上使用 pydbus。 @LEW21 pydbus 是否允许 TCP/IP SystemBus 连接,例如 python-dbus': bus_obj=dbus.bus.BusConnection("tcp:host=localhost,port=12434")??

以上是关于ofono dbus 内省:找不到方法的主要内容,如果未能解决你的问题,请参考以下文章

Python dbus 找不到 org.(gnome|freedesktop).ScreenSaver

在python中动态创建DBus信号

java运行程序找不到main方法

找不到引用的类/找不到引用的方法

dbus-发送到远程机器

java运行中找不到main方法