Python ofono dbus自省:未找到方法

Python ofono dbus自省:未找到方法,python,dbus,pulseaudio,hfp,Python,Dbus,Pulseaudio,Hfp,根据ofono 1.17的文件: 免提有两个接口: org.ofino.Handsfree org.ofino.handsfreeeaudiomanager 为了让pulseaudio工作,我需要访问它们。 它返回以下错误: E:[pulseaudio]No.c:后端无法注册为免提设备 使用OFNO的音频代理:org.freedesktop.DBus.Error.unknown方法: 方法“注册”,在接口上签名为“oay” “org.ofino.HandsfreeAudioManager”

根据ofono 1.17的文件:

免提有两个接口:

  • org.ofino.Handsfree
  • org.ofino.handsfreeeaudiomanager
为了让pulseaudio工作,我需要访问它们。 它返回以下错误:

E:[pulseaudio]No.c:后端无法注册为免提设备 使用OFNO的音频代理:org.freedesktop.DBus.Error.unknown方法: 方法“注册”,在接口上签名为“oay” “org.ofino.HandsfreeAudioManager”不存在

但是这个方法是存在的(根据上面的文档),并且有这样的特征:对象路径,数组{byte}

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

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

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.ofino.HandsfreeAudioManager”:没有这样的名称

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown:名称 org.ofino.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>

当然,我以用户“user”的身份运行OfNo和上面的代码。 我的想法快用完了。。。我应该进一步做些什么来解决这个问题?

list\u obj 描述以下接口:

Service     org.ofono
Interface   org.ofono.HandsfreeAudioManager
Object path /
并描述了这一点:

Service     org.ofono
Interface   org.ofono.Handsfree
Object path [variable prefix]/{modem0,modem1,...}
这意味着bus.get_对象方法的服务参数必须是“org.ofino”,并且对象_路径参数必须是/(对于HandsfreeAudioManager)或[变量前缀]/{modem0,modem1,…}(对于Handsfree)

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

登记 我猜您的org.ofino/object可能没有实现org.ofino.HandsfreeAudioManager接口,或者Register的签名与文档中描述的不同

您可能希望尝试pydbus,而不是不推荐的PythonDBUS绑定。它支持在代理对象上使用Python内置的help()函数,以便您能够轻松查看所有受支持的接口及其所有方法的签名:

from pydbus import SystemBus
bus = SystemBus()
ofono = bus.get("org.ofono", "/")
help(ofono)
返回的ofono对象一次公开所有实现的接口,因此如果该对象实现了大量接口,可能会造成混淆。在这种情况下,您可以得到一个仅支持单个接口的代理对象(与python dbus的dbus.interface类似):

但是,与dbus.Interface(无声失败)不同,如果对象没有实现这个接口,它将抛出一个keyrerror


(免责声明:我是pydbus的自动管理员)

更改list_obj调用如下:list_obj(总线,'org.ofino','/org/ofino/HandsfreeAudioManager')没有错误,但它不返回任何方法。感谢您的详细回答。我将检查我是否可以在我的系统上使用pydbus。@LEW21 pydbus是否允许TCP/IP系统总线连接,如python dbus:bus_obj=dbus.bus.BusConnection(“TCP:host=localhost,port=12434”)??
manager = ofono["org.ofono.HandsfreeAudioManager"]
help(manager)