基于Raspberry Pi Pico W与aioble读取HIDS蓝牙遥控器按键信号
Raspberry Pi Pico W 监听蓝牙HIDS遥控器按键事件
我有一台Raspberry Pi Pico W,希望实现按下蓝牙遥控器按键时触发对应动作。目前已能读取遥控器的服务与特征,但找不到按键操作的数据传输路径。已确认遥控器可正常连接手机,但监听ble.irq未捕获到按键相关事件,也无法获取按键按下时的传输信息。
蓝牙遥控器服务与特征
Service: 12 30 UUID(0x180a) Characteristic: 18 16 2 UUID(0x2a24) Characteristic: 16 14 2 UUID(0x2a29) Characteristic: 24 22 2 UUID(0x2a26) Characteristic: 22 20 2 UUID(0x2a27) Characteristic: 20 18 2 UUID(0x2a25) Characteristic: 32 30 2 UUID(0x2a50) Characteristic: 30 28 2 UUID(0x2a2a) Characteristic: 28 26 2 UUID(0x2a23) Characteristic: 26 24 2 UUID(0x2a28) Service: 8 11 UUID(0x1801) Characteristic: 11 10 32 UUID(0x2a05) Service: 1 7 UUID(0x1800) Characteristic: 9 7 2 UUID(0x2a04) Characteristic: 7 5 2 UUID(0x2a01) Characteristic: 5 3 2 UUID(0x2a00) Service: 74 79 UUID(0xae40) Characteristic: 78 76 4 UUID(0xae41) Characteristic: 79 78 16 UUID(0xae42) Service: 35 73 UUID(0x1812) Characteristic: 41 39 26 UUID(0x2a4d) Characteristic: 39 37 6 UUID(0x2a4e) Characteristic: 52 50 26 UUID(0x2a4d) Characteristic: 48 47 14 UUID(0x2a4d) Characteristic: 45 43 26 UUID(0x2a4d) Characteristic: 64 62 26 UUID(0x2a4d) Characteristic: 60 58 26 UUID(0x2a4d) Characteristic: 56 54 26 UUID(0x2a4d) Characteristic: 75 73 4 UUID(0x2a4c) Characteristic: 73 71 2 UUID(0x2a4a) Characteristic: 69 68 26 UUID(0x2a33) Characteristic: 68 66 2 UUID(0x2a4b) Service: 31 34 UUID(0x180f) Characteristic: 34 33 18 UUID(0x2a19) Service: 128 133 UUID(0xae00) Characteristic: 132 130 4 UUID(0xae01) Characteristic: 133 132 16 UUID(0xae02)
现有MicroPython代码
from util import singleton from wifi import WLAN from micropython import const import bluetooth import aioble import asyncio def log_info(*args): print("[aioble] I:", *args) def ble_irq(event, data): log_info(event, data) aioble.core.ble_irq(event, data) ble = bluetooth.BLE() ble.irq(ble_irq) SERVICE_UUID = bluetooth.UUID(0xAE40) device_service = aioble.Service(SERVICE_UUID) recv_characteristic = aioble.Characteristic( device_service, SERVICE_UUID, write=True, read=True, notify=True, capture=True, ) _L2CAP_PSN = const(22) _L2CAP_MTU = const(128) l2cap_event = asyncio.Event() recv_hids = aioble.Characteristic( aioble.Service(bluetooth.UUID(0x1812)), bluetooth.UUID(0x2A4D), write=True, read=True, notify=True, ) @singleton class Bluetooth: def __init__(self, scheduler): self.wifi = WLAN(scheduler) self.scheduler = scheduler scheduler.schedule("Bluetooth", 2000, self.try_to_connect) async def try_to_connect(self): try: print(f"Trying bluetooth") device = aioble.Device(aioble.ADDR_PUBLIC, "47:26:9c:1f:28:c1") connection = await device.connect(timeout_ms=2000) print(connection) if connection and connection.is_connected(): print("Is connected") data = connection.read() print(data) services = [] async for service in connection.services(): services.append(service) for s in services: print(s) async for c in s.characteristics(): recv_characteristic = aioble.Characteristic( aioble.Service(bluetooth.UUID(s.uuid)), bluetooth.UUID(c.uuid), write=True, read=True, notify=True, capture=True, ) # data = recv_characteristic.read() # if data: print(f" {c}") # print(f" {data}") except asyncio.TimeoutError: print("Bluetooth Timeout")
解决方向
聚焦HIDS核心特征
该设备是HIDS设备,按键数据必然通过UUID0x1812服务下的**HID报告特征(UUID0x2a4d)**传输。你列出的多个0x2a4d特征就是不同类型的HID报告通道,需要针对这些特征做监听。开启特征通知并监听数据
当前代码仅遍历特征但未开启通知订阅。连接成功后,需找到0x2a4d特征并调用subscribe(),同时通过协程循环接收通知数据:async def listen_hid_reports(connection): hids_service = await connection.service(bluetooth.UUID(0x1812)) async for char in hids_service.characteristics(bluetooth.UUID(0x2a4d)): await char.subscribe(notify=True) while True: data = await char.notified() print("收到按键数据:", data) # 此处根据数据格式解析对应按键动作在
try_to_connect的连接成功分支中,启动该协程:asyncio.create_task(listen_hid_reports(connection))解析HID报告格式
先读取UUID0x2a4c(HID描述符)的特征数据,解析出遥控器的按键映射规则,才能将收到的二进制data转换成具体的按键动作。优化连接状态管理
在Bluetooth类中添加self.is_connected状态变量,连接成功后标记为True,避免try_to_connect重复执行连接操作。简化BLE中断处理
若无需额外日志,可简化ble_irq函数为直接调用aioble.core.ble_irq(event, data),避免日志输出干扰数据监听。
内容的提问来源于stack exchange,提问作者CPTblackadder
相关产品推荐
相关产品推荐

