使用CircuitPython通过ESP32-S3向索尼相机BLE写入指令失败求助
解决CircuitPython连接索尼相机BLE触发快门的问题
先给你揪出代码里的几个关键错误:
- UUID匹配失效:你把特征UUID改成了
0xff01短格式,但相机的目标特征是完整128位UUID0000ff01-0000-1000-8000-00805f9b34fb,短格式在匹配128位特征时会直接失败,必须用完整UUID或正确解析的UUID对象。 - 依赖私有API:你用了
connection._discovered_bleio_services这种下划线开头的私有属性,Adafruit BLE库不保证私有API的兼容性,应该用公开方法获取服务和特征。 - 特征写入方式错误:
characteristic.value()是属性访问,不是方法调用;而且你传的是16位整数0x0107,BLE特征需要的是字节序列,得用你定义的COM1A这种bytes对象。 - 冗余广告代码:作为客户端连接相机,你完全不需要启动自己的BLE广告,这部分代码纯浪费资源。
下面是修正后的完整代码:
import time import board import adafruit_ble from adafruit_ble.uuid import VendorUUID, UUID # 目标服务和特征的完整UUID TARGET_SERVICE_UUID = VendorUUID("8000ff00-ff00-ffff-ffff-ffffffffffff") TARGET_CHAR_UUID = UUID("0000ff01-0000-1000-8000-00805f9b34fb") # 触发快门的指令字节序列 SHUTTER_CMD = bytes([0x01, 0x07]) # 初始化BLE radio ble = adafruit_ble.BLERadio() while True: print("扫描索尼ILCE-6100...") target_device = None # 扫描设备,找到目标相机 for device in ble.start_scan(timeout=5): if device.complete_name == "ILCE-6100": target_device = device break ble.stop_scan() if not target_device: print("未找到相机,重试...") time.sleep(1) continue print("找到相机,尝试连接...") connection = ble.connect(target_device) if not connection.connected: print("连接失败,重试...") time.sleep(1) continue print("已连接相机!") try: # 获取目标服务 target_service = connection[TARGET_SERVICE_UUID] # 获取目标特征 target_char = target_service[TARGET_CHAR_UUID] print("找到目标特征,发送快门指令...") # 写入指令字节序列 target_char.value = SHUTTER_CMD print("快门指令已发送") time.sleep(2) except KeyError: print("未找到目标服务或特征,请检查相机BLE设置") finally: # 断开连接 connection.disconnect() print("已断开连接") time.sleep(3)
额外注意事项:
- 确保相机已经开启BLE遥控功能,并且处于可配对状态
- 部分索尼相机需要先通过官方APP配对一次,才能允许第三方BLE设备连接
- 如果还是无法找到特征,可以在连接后遍历所有服务和特征,打印UUID确认实际值:
for service in connection.discovered_services: print(f"服务UUID: {service.uuid}") for char in service.characteristics: print(f" 特征UUID: {char.uuid}, 可写: {char.writable}")
内容的提问来源于stack exchange,提问作者Sierra
相关产品推荐
相关产品推荐

