GNU/Linux >> Tutoriales Linux >  >> Linux

Enumere los dispositivos bluetooth cercanos/detectables, incluidos los ya emparejados, en Python, en Linux

Me las arreglé para resolver el problema yo mismo. El siguiente fragmento enumera las direcciones de todos los dispositivos emparejados, en mi adaptador bluetooth predeterminado:

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

Desde la adopción de la versión 5 de la API de Bluetooth, la mayoría de las funciones utilizadas en las soluciones de @Micke se eliminaron y la interacción con el bus tuvo lugar a través de 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"))
    })  

En el bt_device list hay diccionarios con los datos deseados:es decir,

por ejemplo

[{
    'name': 'BBC micro:bit [zigiz]', 
    'addr': 'E0:7C:62:5A:B1:8C'
 }, {
    'name': 'BBC micro:bit [putup]',
    'addr': 'FC:CC:69:48:5B:32'
}]

Referencia:[1] http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/


Siempre puede ejecutarlo como un comando de shell y leer lo que devuelve:

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()

Ahora data incluirá una lista de todas las líneas de salida que puede formatear y reproducir como desee.


Linux
  1. 3 formas de listar usuarios en Linux

  2. Comando ls de Linux - Lista de archivos

  3. apagar la computadora (linux) usando python

  4. ¿Dónde se encuentra bluetooth/bluetooth.h en Linux?

  5. Actualice python en linux 2.7 a 3.5

Cómo listar trabajos cron en Linux

Comando Lsblk en Linux (Lista de dispositivos de bloque)

Cómo enumerar los paquetes instalados en Linux

Cómo enumerar particiones de disco en Linux

Cómo enumerar discos en Linux

Cómo enumerar servicios en Linux