簡體   English   中英

如何將基於 L2CAP 的藍牙相機快門(AB 快門 3)連接到 Linux 並獲取 Python 中的關鍵事件?

[英]How do I connect a L2CAP-based Bluetooth Camera Shutter (AB Shutter 3) to Linux and get the key event in Python?

目標

我有一個HITSLAM 相機快門藍牙按鈕(這是一個 AB 快門 3 設備,一種常見的藍牙相機遙控器),我想使用藍牙連接到我的 NVIDIA Jetson Nano,這樣我就可以使用按鈕的輸入來完成某些任務。

我做了什么

我正在使用 PyBluez 庫進行連接。 我使用以下內容找出 AB Shutter 3 使用的端口和協議(其中target_device_address是 AB Shutter 3 的設備地址):

service_matches = bt.find_service(name=None,uuid=None,address=target_device_address)
first_match = service_matches[0]
print("Port {}, Name {}, Host {}, Protocol {}".format(first_match['port'], first_match['name'], first_match['host'], first_match['protocol']))

這就是我獲取要連接的端口 (17) 和它使用的協議 (L2CAP) 的方式。

現在,我嘗試使用以下方法連接到它:

client_sock = bt.BluetoothSocket(bt.L2CAP)
client_sock.connect((target_device_address,port))

我還使用了 Python 的本機socket庫(它產生了相同的結果):

client_sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP)
client_sock.connect((target_device_address,port))

它根據hcitool成功連接,之后我等待用戶輸入:

if target_device_address in (subprocess.getoutput("hcitool con")).split():
    print('connected')
    while True:
        data = client_sock.recv(1024)
        print(str(data))

問題

  • 該設備實際上並未在/dev/input/中顯示為輸入。 當我通過 GUI 手動連接它時,它顯示為/dev/input/event5
  • 連接后,我的腳本沒有捕獲任何輸入。

我的問題

  • 它如何根據hcitool con連接但尚未注冊為輸入設備(並注冊任何輸入)?
  • 你建議做什么? 我到處尋找,似乎沒有得到適當的解決方案。 有一種解決方法可以實現 bash 腳本,該腳本使用bluetoothctl連接到藍牙遙控器,但對我來說,為什么 Python 無法建立此連接並檢索信息是沒有意義的。

我的建議是不要使用hcitool ,因為它在 2017 年就被棄用了。

我更喜歡直接使用 BlueZ D-Bus API,記錄在: https://git.kernel.org/pub/scm.txt/bluetooth.

這可以使用pydbus庫在 Python 中訪問

我將假設您的藍牙適配器在hci0上的 hci0 上,但您可以通過以下方式檢查:

$ busctl tree org.bluez
└─/org
  └─/org/bluez
    └─/org/bluez/hci0

這將使代碼類似於:

import pydbus

DEVICE_ADDR = '11:22:22:E7:CE:BE'

# DBus object paths
BLUEZ_SERVICE = 'org.bluez'
ADAPTER_PATH = '/org/bluez/hci0'
device_path = f"{ADAPTER_PATH}/dev_{DEVICE_ADDR.upper().replace(':', '_')}"

# setup dbus
bus = pydbus.SystemBus()
mngr = bus.get(BLUEZ_SERVICE, '/')
adapter = bus.get(BLUEZ_SERVICE, ADAPTER_PATH) 
device = bus.get(BLUEZ_SERVICE, device_path)

device.Connect()

這應該在/dev/input/處創建事件,我將使用 python 庫evdev來獲取輸入,就像在以下問題中所做的那樣: https://stackoverflow.com/a/54765300/7721752

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM