文档版本: v0.6.2
异常与问题排查¶
适用设备
本文档适用于 OpenZilo Q。
按异常类型判断失败原因,再检查连接、设备状态和调用顺序。
异常类型¶
OpenZiloError
# SDK 异常基类。只想统一捕获 SDK 异常时捕获这个类型。
TransportError
# BLE 传输异常,例如未安装 bleak、找不到设备、连接失败、未连接时写入或等待期间连接断开。
ProtocolError
# 协议异常,例如包头、CRC、包体长度、字段解析不符合预期。
TimeoutError
# 请求在排队、写入或等待响应阶段超时,或等待主动上报超时。写入被中断后需重连。
DeviceError
error_code: int # 设备返回的非 0 错误码。
# 设备明确返回错误时抛出,例如 busy、参数错误、文件不存在。
AudioDecodeError
# 录音数据无法解码为可播放 WAV,或 ffmpeg 30 秒内未完成。
SpeexDecoderUnavailable
# 缺少 ffmpeg 或自定义 Speex 解码器不可用。
OpusDecoderUnavailable
# 缺少 ffmpeg,无法解码 OP2C 录音。
TransportError: Install bleak to use BLE transport¶
当前 Python 环境没有安装 SDK 的依赖。请在运行脚本的项目中从 GitHub 安装 SDK,并使用 uv run 执行脚本:
uv add git+https://github.com/ziloai/OpenZilo.git
uv run python your_script.py
扫描不到设备或连接失败¶
- 使用扫描返回的设备地址,macOS 使用 UUID;SDK 不按广播名称筛选。
- 确认戒指正在广播,且没有被其他程序保持连接。
- Windows 上可以尝试关闭再打开蓝牙适配器。
- PyCharm 中确认解释器和安装依赖的虚拟环境一致。
Timed out waiting for command ...¶
表示指定响应或事件没有在超时时间内到达。常见原因:
- 设备忙,例如正在录音、写 Flash、传输大文件。
- 业务代码同时发起多个命令请求,导致响应被其他任务取走。
- 在
V2.001.0002.0000中尚未进入手势模式,或在V2.001.0002.0001中尚未启动 IMU 采集。
建议同一连接上同一时间只发起一个“命令-响应”类请求。
receive_auto_audio_file() 等待超时¶
首帧超时表示 SDK 在限定时间内没有收到录音保存后的 0x050A 或主动上报的 0x0505。确认调用期间 BLE 始终连接,并在开始等待后再让用户长按录音、松开。若程序连接过晚,设备可能已经发送完毕,此时应调用 get_audio_file_count() 查询文件,再用 download_audio_file() 重新下载。
不要让 receive_auto_audio_file() 与 download_audio_file()、read_audio_frame() 或手工 wait_for_command(0x0505) 并发运行;它们读取同一个 0x0505 接收队列,可能造成某个接收流程超时或出现偏移缺口。
start_sensor_report() 返回设备忙碌¶
先结束冲突操作。固件 V2.001.0002.0000 需先用按键进入手势模式;V2.001.0002.0001 直接调用 start_sensor_report()。确认成功响应后再等待数据。
录音可以下载但不能解码¶
确认安装了 ffmpeg,并且命令行能执行 ffmpeg -version。如果只需要保存原始录音,可以直接保留 download_audio_file() 返回的 bytes 或 save_audio_bundle() 生成的 raw 文件。
清空录音后能恢复吗¶
该函数会删除设备保存的所有录音,成功后无法通过 SDK 恢复。业务代码应把它放在明确的维护或测试入口中,不要在普通启动流程里自动调用。