Python ofono dbus自省:未找到方法
根据ofono 1.17的文件: 免提有两个接口: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”
- org.ofino.Handsfree
- org.ofino.handsfreeeaudiomanager
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)