我想得到的设备路径为基于bluez的A2DP蓝牙播放器,我正在创建。我无法有效地实现Play/Pause/Next/Previous命令,因为dbus可用性和播放器路径会根据您选择的媒体播放器而变化。此外,bluez有时决定发送很多无用的信息(对我来说),比如播放列表的详细信息,这使得我的应用程序处理的负载更大。所以这里的目标是在调用函数时获得/org/bluez/dev_XX_XX_XX_XX_XX_XX/playerY
。在
def update_player():
manager = dbus.Interface(self.bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()
player_path = getFromDict(objects,[self.devicepath,"org.bluez.MediaControl1", "Player"])
当我试图更改媒体播放器时,或者bluez发送一些日志(通常是5%的时间),dbus org.freedesktop.DBus.ObjectManager
接收到大量信息,这使得{
有没有一种方法可以在不需要接收整个org.freedesktop.DBus.ObjectManager
对象的情况下确定bluez对象的路径;或者是否有一种方法可以限制bluez
发送的消息量。我真的很想得到有效的对象路径。任何帮助都是非常感谢的。在
编辑: 虽然我没有在有ObjectManager填充问题的嵌入式系统中测试它,但是由于Partiban的建议,我能够使用interfaceadded和一些regex来匹配我需要的路径。在
^{pr2}$
您不应该每次都使用
org.freedesktop.DBus.ObjectManager.GetManagedObjects
来获取对象路径。此GetManagedObjects
用于获取现有或以前可用的接口,以及应用程序启动时的详细信息。在例如,假设启动了Bluez并且连接了1个终端设备。在应用程序启动之后,在初始化/启动应用程序期间,您可能需要获取所有可用/连接的设备,这样您就可以使用
GetManagedObjects
来获取它。在为了在运行时创建接口,对象路径应该依赖于objectmanager的信号}。在
InterfacesAdded
和{我没有python中的示例,但是下面的C示例通常执行
StartDiscovery
并使用信号监视新设备。因此,您可以使用信号来适应python中的类似示例。下面的例子只是为了清楚起见(关于这个例子的更多细节在Linumiz)中。在在这个使用}两个信号来演示。因此,当新设备出现在
StartDiscovery
扫描设备的例子中,我使用了InterfaceRemoved
和{/org/hciX/
上时,bluez_device_appeared
被调用并以相同的方式删除。在如果连接了多个蓝牙适配器,则可以通过指定适配器路径(例如
/org/bluez/hciX
)在g_dbus_connection_signal_subscribe
下过滤它们。在所有基于DBUS的守护进程都使用信号通知总线上的客户机,因此我们在总线上看到大量消息。所以我们需要根据具体的需求进行订阅。此过滤器在dbus守护程序级别应用,并转发消息。在
添加bluez的
MediaControl1
接口已过时且已弃用。所有新的应用程序都应该使用MediaPlayer
,正如here所定义的那样。在相关问题 更多 >
编程相关推荐