如何打开蓝牙连接并成为A2DP源和接收器

How to open bluetooth connections and be A2DP source and sink

我想使用 Python 连接蓝牙设备并将其用作扬声器。例如,使用 Python 播放 .wav 并在设备上收听并验证它正在播放等。我想在我的 linux 盒子上播放音频并在蓝牙设备上收听它。

我正在查看 Whosebug,似乎我可以使用 pybluez 进行连接,但随后需要使用 dbus 来设置实际的音频连接。我找到 Linux BlueZ dbus communication a2dp,但结果是:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownMethod: Method "DefaultAdapter" with signature "" on interface "org.bluez.Manager" doesn't exist

当它试图从界面中获取默认适配器时,所以我什至没有得到原始海报问题。感谢您的任何帮助! 这是代码:

import dbus as dbus
bus = dbus.SystemBus()

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 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"]):
        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)

我有两个问题。

  1. 如何成为A2DP源?
  2. 如何修复获取适配器路径时抛出的异常?

此代码不起作用的原因是 org.bluez.Manager class 在 bluez 5.0

中不再受支持

此处模糊描述:http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/

bluez源码中有一些例子,即:test/list-devices这里:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/list-devices

这是该代码的 python3 版本:

from __future__ import absolute_import, print_function, unicode_literals

import dbus

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object("org.bluez", "/"),
                    "org.freedesktop.DBus.ObjectManager")

def extract_objects(object_list):
    list = ""
    for object in object_list:
        val = str(object)
        list = list + val[val.rfind("/") + 1:] + " "
    return list

def extract_uuids(uuid_list):
    list = ""
    for uuid in uuid_list:
        if (uuid.endswith("-0000-1000-8000-00805f9b34fb")):
            if (uuid.startswith("0000")):
                val = "0x" + uuid[4:8]
            else:
                val = "0x" + uuid[0:8]
        else:
            val = str(uuid)
        list = list + val + " "
    return list

objects = manager.GetManagedObjects()


all_devices = (str(path) for path, interfaces in objects.items() if
                    "org.bluez.Device1" in interfaces.keys())

for path, interfaces in objects.items():
    if "org.bluez.Adapter1" not in interfaces.keys():
        continue

    print("[ " + path + " ]")

    properties = interfaces["org.bluez.Adapter1"]
    for key in properties.keys():
        value = properties[key]
        if (key == "UUIDs"):
            list = extract_uuids(value)
            print("    %s = %s" % (key, list))
        else:
            print("    %s = %s" % (key, value))

    device_list = [d for d in all_devices if d.startswith(path + "/")]

    for dev_path in device_list:
        print("    [ " + dev_path + " ]")

        dev = objects[dev_path]
        properties = dev["org.bluez.Device1"]

        for key in properties.keys():
            value = properties[key]
            if (key == "UUIDs"):
                list = extract_uuids(value)
                print("        %s = %s" % (key, list))
            elif (key == "Class"):
                print("        %s = 0x%06x" % (key, value))
            elif (key == "Vendor"):
                print("        %s = 0x%04x" % (key, value))
            elif (key == "Product"):
                print("        %s = 0x%04x" % (key, value))
            elif (key == "Version"):
                print("        %s = 0x%04x" % (key, value))
            else:
                print("        %s = %s" % (key, value))

    print("")