ofono dbus Introspection:找不到方法

时间:2016-05-10 07:34:25

标签: python dbus pulseaudio hfp

根据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”不存在

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

因此我猜它不可访问而不是不存在。 我写了一个简单的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:名称   任何.service文件都没有提供org.ofono.HandsfreeAudioManager

我还在/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和上面的代码作为用户“user”。 我的想法已经不多了......我应该做些什么来解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

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方法的service参数必须是&#34; org.ofono&#34;,而object_path参数必须是/(对于HandsfreeAudioManager)或[variable prefix] / {modem0, modem1,...}(适用于免提)。

因此,你应该使用obj(bus,&#39; org.ofono&#39;,&#39; /&#39;)。

注册

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

你可能想尝试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&#39; sbus.Interface):

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

然而,与dbus.Interface(无声地失败)不同,如果对象没有实现此接口,它将抛出KeyError。

(免责声明:我是pydbus的autor)