복붙노트

[PYTHON] 이미 페어링 된 것을 포함하여 리눅스에서 가까운 / 발견 가능한 블루투스 장치를 나열합니다.

PYTHON

이미 페어링 된 것을 포함하여 리눅스에서 가까운 / 발견 가능한 블루투스 장치를 나열합니다.

이미 페어링 된 것을 포함하여 Linux에서 파이썬을 사용하여 근처 / 발견 가능한 모든 블루투스 장치를 나열하려고합니다.

내가 주소를 사용하여 장치에 대한 서비스를 나열하는 방법을 알고 성공적으로 연결할 수 있습니다 :

services = bluetooth.find_service(address='...')

PyBluez 문서 읽기 필자는 어떤 기준도 지정하지 않으면 근처의 모든 장치가 나타날 것으로 예상합니다.

지금 당장 필요로하는 "유일한 것"은 이미 쌍을 이루고있는 장치를 목록에 표시 할 수 있다는 것입니다. Ubuntu / Unity의 모든 설정 -> 블루투스에있는 목록과 비슷합니다.

Btw, 다음은 내 컴퓨터에 페어링 된 장치가 이미 / 근처에 있더라도 나열하지 않습니다. 아마도 한 번 짝을 지을 때 발견되지 않기 때문일 수 있습니다.

import bluetooth
for d in bluetooth.discover_devices(flush_cache=True):
    print d

어떤 아이디어가 ...?

편집 : 발견 및 설치 "bluez - 도구".

bt-device --list

... 필요한 정보, 즉 추가 된 기기의 주소를 알려줍니다.

나는 C 소스를 조사해 보았는데 이것이 생각했던 것처럼 쉽지 않을 수도 있다는 것을 알았다.

아직도 파이썬에서 이것을하는 방법을 모른다 ...

편집 : DBUS 내가 읽고 있어야합니다 수도있을 것 같아요. 충분히 복잡해 보입니다. 누군가 공유 할 코드가 있다면 정말 행복 할 것입니다. :)

해결법

  1. ==============================

    1.Bluetooth API 버전 5의 채택 이후 @Micke 솔루션에 사용 된 대부분의 기능이 중단되고 상호 작용 버스를 통해 ObjectManager.GetManagedObjects [1]

    Bluetooth API 버전 5의 채택 이후 @Micke 솔루션에 사용 된 대부분의 기능이 중단되고 상호 작용 버스를 통해 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 in input 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"))
        })  
    

    bt_device 목록에는 원하는 데이터가있는 사전이 있습니다. 즉

    예를 들면

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

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

  2. ==============================

    2.나는 그 문제를 직접 해결할 수 있었다. 다음 스 니펫에는 기본 블루투스 어댑터에있는 모든 페어링 된 기기의 주소가 나열되어 있습니다.

    나는 그 문제를 직접 해결할 수 있었다. 다음 스 니펫에는 기본 블루투스 어댑터에있는 모든 페어링 된 기기의 주소가 나열되어 있습니다.

    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"]
    
  3. ==============================

    3.항상 쉘 명령으로 실행할 수 있으며 반환하는 내용을 읽을 수 있습니다.

    항상 쉘 명령으로 실행할 수 있으며 반환하는 내용을 읽을 수 있습니다.

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

    이제 데이터에는 원하는대로 포맷하고 재생할 수있는 모든 출력 선 목록이 포함됩니다.

  4. ==============================

    4.조금 길지만 한 줄로 트릭을한다.

    조금 길지만 한 줄로 트릭을한다.

    bt-device -l | egrep '\(.*\)' | grep -oP '(?<=\()[^\)]+' | xargs -n1 bt-device -i 
    
  5. from https://stackoverflow.com/questions/14262315/list-nearby-discoverable-bluetooth-devices-including-already-paired-in-python by cc-by-sa and MIT license