aboutsummaryrefslogtreecommitdiff
path: root/bluetooth_paired_devices.py
blob: fead080bb47237f71920a9d61b55b795411a943c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import sys
import re
import os

from resource_manager import GenericResourceManager

if sys.platform == "darwin":
    from binplist import binplist
    import lightblue
else:
    import bluetooth
    if sys.platform == "win32":
        import _winreg


def get_parrot_zik_mac():
        p = re.compile('90:03:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}|'
                       'A0:14:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}')
        if sys.platform == "linux2":
            bluetooth_on = int(os.popen('bluez-test-adapter powered').read())
            if bluetooth_on == 1:
                out = os.popen("bluez-test-device list").read()
                res = p.findall(out)
                if len(res) > 0:
                    return res[0]
                else:
                    raise DeviceNotConnected
            else:
                raise BluetoothIsNotOn
        elif sys.platform == "darwin":
            fd = open("/Library/Preferences/com.apple.Bluetooth.plist", "rb")
            plist = binplist.BinaryPlist(file_obj=fd)
            parsed_plist = plist.Parse()
            try:
                for mac in parsed_plist['PairedDevices']:
                    if p.match(mac.replace("-", ":")):
                        return mac.replace("-", ":")
                else:
                    raise DeviceNotConnected
            except Exception:
                pass

        elif sys.platform == "win32":
            aReg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
            aKey = _winreg.OpenKey(
                aReg, 'SYSTEM\CurrentControlSet\Services\
                BTHPORT\Parameters\Devices')
            for i in range(10):
                try:
                    asubkey_name = _winreg.EnumKey(aKey, i)
                    mac = ':'.join(asubkey_name[i:i+2] for i in range(0, 12, 2))
                    res = p.findall(mac)
                    if len(res) > 0:
                        return res[0]
                    else:
                        raise DeviceNotConnected
                except EnvironmentError:
                    pass


def connect():
    mac = get_parrot_zik_mac()
    if sys.platform == "darwin":
        service_matches = lightblue.findservices(
            name="Parrot RFcomm service", addr=mac)
    else:
        uuids = ["0ef0f502-f0ee-46c9-986c-54ed027807fb",
                 "8B6814D3-6CE7-4498-9700-9312C1711F63"]
        service_matches = []
        for uuid in uuids:
            try:
                service_matches = bluetooth.find_service(uuid=uuid, address=mac)
            except bluetooth.btcommon.BluetoothError:
                pass
            if service_matches:
                break

    if len(service_matches) == 0:
        raise ConnectionFailure
    first_match = service_matches[0]

    if sys.platform == "darwin":
        host = first_match[0]
        port = first_match[1]
        sock = lightblue.socket()
    else:
        port = first_match["port"]
        host = first_match["host"]
        sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)

    sock.connect((host, port))

    sock.send('\x00\x03\x00')
    sock.recv(1024)
    return GenericResourceManager(sock)


class DeviceNotConnected(Exception):
    pass


class ConnectionFailure(Exception):
    pass


class BluetoothIsNotOn(Exception):
    pass