作为一个简单的总结,我目前正在构build一个能够充当蓝牙A2DP接收器并将audio路由到3.5mm连接的树莓派。 我运行的一个Python脚本使用BlueZ和Dbus与蓝牙设备进行通信。目前,我正在使用的脚本发现一个与之前系统配对的BT设备,并自动连接到它(脚本在cron上运行),然后,我可以按下我的iPhone上播放开始audiostream..然而,我想要做的是一旦它发现一个设备,并连接发送dBus命令开始播放audio,而不是手动按电话播放本身。
下面是代码的摘录,以及我已经尝试使其工作但没有运气的内容。
bus = dbus.SystemBus() #Get bluez dbus objects man = bus.get_object('org.bluez', '/') iface = dbus.Interface(man, 'org.bluez.Manager') adapterPath = iface.DefaultAdapter() adapter = dbus.Interface(bus.get_object('org.bluez', adapterPath),dbus_interface='org.bluez.Adapter') devices = adapter.GetProperties()['Devices'] #for each device on this bluetooth adapter look for ones with A2DP sink service UUID and # register for the propertychanged dbus signal for d in devices: dev = dbus.Interface(bus.get_object('org.bluez', d),dbus_interface='org.bluez.Device') props = dev.GetProperties() if any(AudioSourceServiceClass_UUID in UUID.upper() for UUID in props["UUIDs"]): #This device is an A2DP Audio source devobj = bus.get_object('org.bluez', d) devobj.Trusted = True if props["Connected"] == True: print props["Name"] + " is connected!" exit() for d in devices: dev = dbus.Interface(bus.get_object('org.bluez', d),dbus_interface='org.bluez.Device') props = dev.GetProperties() if any(AudioSourceServiceClass_UUID in UUID.upper() for UUID in props["UUIDs"]): #This device is an A2DP Audio source print props["Name"] + " has A2DP audio source" #dev.connect_to_signal("PropertyChanged", handler_for_device(dev)) #dev.connect_to_signal("PropertyChanged", cb) devobj = bus.get_object('org.bluez', d) try: devobj.Connect(dbus_interface='org.bluez.AudioSource') devobj.Play() exit() except dbus.DBusException, e: print str(e)
如果不容易看到,我从底部添加约4行“devobj.Play()”。
但是我得到了错误:
iPhone有A2DPaudio源org.freedesktop.DBus.Error.UnknownMethod:在接口“(null)”上带有签名“”的方法“播放”不存在
如果你知道设备已经这样做:
player = dbus.Interface(bus.get_object('org.bluez', '/org/bluez/hci0/dev_' + device.replace(":","_") + '/player0'), 'org.bluez.MediaPlayer1')
然后:
player.Play()
设备应该是xx_xx_xx_xx_xx_xx
我认为看起来devobj
在你调用Play
时不能正确构建。 我建议你创建与服务的接口相同的方式,就像你在代码的其他部分,即调用dbus.Interface
获取它。 那么你可能有一个更好的位置来调试给你错误的代码部分。
此外,调查您正在使用的巴士可以帮助您了解它的外观,并将其与您在代码中做出的任何假设进行比较。 在图形环境中,您可以使用D-Feet,否则dbus-send
(以及某些情况下, dbus-monitor
)也可能会有用。