如何将基于L2CAP的蓝牙相机快门(AB Shutter 3)连接到Linux并在Python中获取关键事件



目标

我有一个HITSLAM相机快门蓝牙按钮(这是一个AB Shutter 3设备,一个常见的蓝牙相机遥控器),我想使用蓝牙将其连接到我的NVIDIA Jetson Nano,这样我就可以使用按钮的输入执行一些任务。

我做了什么

我正在使用PyBluez库进行连接。我使用以下内容来了解AB Shutter 3使用的端口和协议(其中target_device_address是AB Shutter的设备地址):

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连接的,但尚未注册为输入设备(并注册任何输入)
  • 你建议做什么?我到处找,似乎都找不到合适的解决方案。实现一个使用bluetoothctl连接到蓝牙遥控器的bash脚本有一个解决方法,但对我来说,Python为什么不能建立这种连接并检索信息是没有意义的

我的建议是不要使用hcitool,因为它在2017年就被弃用了。

我更倾向于直接使用BlueZ D-Bus API,该API记录在:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt

这可以在Python中使用pydbus库访问

我假设你的蓝牙适配器在Jetson的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

最新更新