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
import pygatt
import time
import binascii
from pygatt.backends.gatttool.gatttool import GATTToolBackend

# 電子鎖的MAC地址
LOCK_MAC_ADDRESS = "C7:B5:2A:9A:D3:7D"

# 電子鎖的UUID (轉換為標準格式)
LOCK_SERVICE_UUID = "00000000-0000-0000-0000-000000000000"

# 假設這是控制鎖的特性UUID (您需要從電子鎖的文檔中獲取實際的特性UUID)
# 通常製造商會提供控制特性的UUID
LOCK_CONTROL_CHAR_UUID = None  # 需要填入實際的控制特性UUID

def connect_to_lock():
    """連接到電子鎖並執行基本操作"""
    try:
        # 初始化BLE後端
        adapter = GATTToolBackend()
        adapter.start()
        
        print(f"嘗試連接到鎖: {LOCK_MAC_ADDRESS}")
        device = adapter.connect(LOCK_MAC_ADDRESS, timeout=10)
        print("成功連接!")
        
        # 發現服務 (可選,但建議用於檢查可用服務)
        print("發現服務...")
        services = device.discover_characteristics()
        print("找到以下特性:")
        for uuid, properties in services.items():
            print(f"UUID: {uuid}, 屬性: {properties}")
        
        # 如果您知道控制特性的UUID,可以直接操作
        if LOCK_CONTROL_CHAR_UUID:
            # 假設 0x01 是開鎖命令 (根據電子鎖協議進行調整)
            print("發送開鎖命令...")
            device.char_write(LOCK_CONTROL_CHAR_UUID, bytearray([0x01]))
            print("命令已發送!")
            
            # 讀取鎖狀態 (如果支援)
            try:
                response = device.char_read(LOCK_CONTROL_CHAR_UUID)
                print(f"鎖狀態: {binascii.hexlify(response)}")
            except:
                print("無法讀取鎖狀態")
        else:
            print("尚未指定控制特性UUID,無法發送命令")
            print("請查看印出的特性列表,確定正確的控制特性UUID")
            
        # 斷開連接
        adapter.disconnect(device)
        print("已斷開連接")
        
    except Exception as e:
        print(f"發生錯誤: {e}")
    finally:
        adapter.stop()

if __name__ == "__main__":
    connect_to_lock()