You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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设备,按键数据必然通过UUID 0x1812服务下的**HID报告特征(UUID 0x2a4d)**传输。你列出的多个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报告格式
    先读取UUID 0x2a4c(HID描述符)的特征数据,解析出遥控器的按键映射规则,才能将收到的二进制data转换成具体的按键动作。

  • 优化连接状态管理
    在Bluetooth类中添加self.is_connected状态变量,连接成功后标记为True,避免try_to_connect重复执行连接操作。

  • 简化BLE中断处理
    若无需额外日志,可简化ble_irq函数为直接调用aioble.core.ble_irq(event, data),避免日志输出干扰数据监听。

内容的提问来源于stack exchange,提问作者CPTblackadder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:43:12