J'ai réussi à résoudre le problème moi-même. L'extrait de code suivant répertorie les adresses de tous les appareils couplés, sur mon adaptateur Bluetooth par défaut :
import dbus
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object('org.bluez', '/'), 'org.bluez.Manager')
adapterPath = manager.DefaultAdapter()
adapter = dbus.Interface(bus.get_object('org.bluez', adapterPath), 'org.bluez.Adapter')
for devicePath in adapter.ListDevices():
device = dbus.Interface(bus.get_object('org.bluez', devicePath),'org.bluez.Device')
deviceProperties = device.GetProperties()
print deviceProperties["Address"]
Depuis l'adoption de la version 5 de l'API Bluetooth, la plupart des fonctions utilisées dans les solutions @Micke ont été supprimées et l'interaction avec le bus s'effectue via l'ObjectManager.GetManagedObjects [1]
import dbus
def proxyobj(bus, path, interface):
""" commodity to apply an interface to a proxy object """
obj = bus.get_object('org.bluez', path)
return dbus.Interface(obj, interface)
def filter_by_interface(objects, interface_name):
""" filters the objects based on their support
for the specified interface """
result = []
for path in objects.keys():
interfaces = objects[path]
for interface in interfaces.keys():
if interface == interface_name:
result.append(path)
return result
bus = dbus.SystemBus()
# we need a dbus object manager
manager = proxyobj(bus, "/", "org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()
# once we get the objects we have to pick the bluetooth devices.
# They support the org.bluez.Device1 interface
devices = filter_by_interface(objects, "org.bluez.Device1")
# now we are ready to get the informations we need
bt_devices = []
for device in devices:
obj = proxyobj(bus, device, 'org.freedesktop.DBus.Properties')
bt_devices.append({
"name": str(obj.Get("org.bluez.Device1", "Name")),
"addr": str(obj.Get("org.bluez.Device1", "Address"))
})
Dans le bt_device
lister il y a des dictionnaires avec les données désirées :c'est-à-dire
par exemple
[{
'name': 'BBC micro:bit [zigiz]',
'addr': 'E0:7C:62:5A:B1:8C'
}, {
'name': 'BBC micro:bit [putup]',
'addr': 'FC:CC:69:48:5B:32'
}]
Référence :[1] http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/
Vous pouvez toujours l'exécuter en tant que commande shell et lire ce qu'elle renvoie :
import subprocess as sp
p = sp.Popen(["bt-device", "--list"], stdin=sp.PIPE, stdout=sp.PIPE, close_fds=True)
(stdout, stdin) = (p.stdout, p.stdin)
data = stdout.readlines()
Maintenant data
inclura une liste de toutes les lignes de sortie que vous pouvez formater et jouer avec comme vous le souhaitez.