根据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”的方法“ Register”
  “ 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>


当然,我以用户“ user”的身份运行ofono和上面的代码。
我的想法不多了...我应该怎么做才能进一步解决问题?

最佳答案

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的作者)

关于python - ofono dbus内省(introspection):找不到方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37132033/

10-11 21:19