使用Python Bleak获取BLE魔方通知失败的技术求助
解决GoCube BLE通知无响应问题
核心问题
你的代码在调用start_notify后立刻执行disconnect,程序直接退出,根本没留时间接收魔方的通知数据。另外,GoCube需要先接收特定指令,才会主动上报转动状态。
修复后代码示例
结合GoCube的协议逻辑,需要做两点调整:保持连接以接收通知,发送指令触发魔方上报数据。
import asyncio from bleak import BleakClient address = "E0:F4:65:59:81:EF" MODEL_NBR_UUID = "00002a00-0000-1000-8000-00805f9b34fb" # GoCube UART服务特征:TX收数据,RX发指令 UART_TX_UUID = "6e400003-b5a3-f393-e0a9-e50e24dcca9e" UART_RX_UUID = "6e400002-b5a3-f393-e0a9-e50e24dcca9e" async def cube_update(sender, data): print(f"原始上报数据: {data.hex()}") # 根据GoCube协议解析转动动作(示例逻辑,需按协议完善) if len(data) >= 3: face_code = data[1] dir_code = data[2] face_map = {1: "U", 2: "R", 3: "F", 4: "D", 5: "L", 6: "B"} dir_map = {0: "", 1: "'", 2: "2"} move = f"{face_map.get(face_code, '?')}{dir_map.get(dir_code, '')}" print(f"解析转动动作: {move}") async def main(address): client = BleakClient(address) try: await client.connect() model_number = await client.read_gatt_char(MODEL_NBR_UUID) print(f"Model Number: {''.join(map(chr, model_number))}") # 启动通知监听 await client.start_notify(UART_TX_UUID, cube_update) # 发送指令让魔方开启状态上报(协议规定的启动指令) await client.write_gatt_char(UART_RX_UUID, bytearray([0x01, 0x01]), response=True) # 保持连接,持续接收数据(可根据需求修改退出逻辑,比如监听键盘输入) print("等待魔方转动数据...") while True: await asyncio.sleep(1) except Exception as e: print(f"错误信息: {e}") finally: await client.disconnect() asyncio.run(main(address))
关键说明
- 保持连接:用
while True + asyncio.sleep让程序持续运行,避免立即断开连接。你也可以替换成更优雅的退出逻辑,比如监听Ctrl+C中断。 - 触发指令:必须向魔方的RX特征写入启动上报的指令,它才会主动发送转动数据,示例中的
0x01 0x01是协议规定的基础启动指令。 - 数据解析:
cube_update里的解析逻辑需要根据GoCube的协议细节完善,确保能把原始字节数据转换成U、R'这类标准魔方转动符号。
额外排查项
- 确认系统BLE权限:比如Linux下要确保当前用户有权限访问BLE设备。
- 核对特征UUID:再次确认UART服务的TX/RX UUID与魔方实际提供的一致。
内容的提问来源于stack exchange,提问作者Beautiful Blobfish
相关产品推荐
相关产品推荐

