心跳#
| 端 | 方式 |
|---|---|
| Java,安卓,iOS | 协议层 ping,每 15 秒一次,30 秒收不到 pong 视为断线 |
| 网页,小程序 | 应用层心跳,连接后与开始后每 15 秒发 {"cmd": "ping"},服务端回 {"event": "pong", "ts": <毫秒>},不改变会话状态 |
发出结束帧后服务端在评测,期间不再发应用层心跳,改由终评等待时长判断,默认 300 秒。
断线重连语义#
服务端不支持会话续传,一个连接就是一个服务端会话。SDK 用新会话加整段重放实现等效续传:
- 连接意外断开,心跳超时,连接超时,终评超时,或收到可重试的错误帧时,会话进入重连中,按退避等待后建立新连接。
- 新连接上重发相同参数与同一个幂等键的开始帧,重放这一轮已发的全部音频,补发断线期间排队的音频,结束帧已发出时一并重发。
- 服务端按幂等键识别重发:首次评测已完成时直接重放首次结果,首次评测仍在进行时最多等 30 秒后重放,不重复评测,不重复计费。
- 默认连续重连 8 次,等待依次为 0.5,1,2,4,4,4,4,4 秒,约 23 秒内网络恢复即可接上,次数可配置。重连次数用尽时会话以错误结束,错误码 90006。
音频缓冲策略由调用方选择:
| 策略 | 行为 |
|---|---|
| REPLAY,默认 | 缓冲这一轮的全部音频,上限 10 MB,重连后整段重放,评分覆盖全部音频 |
| DROP | 不缓冲,重连期间送入的音频丢弃,新会话只评重连之后的音频 |
| FAIL | 不重连,断线即以错误结束 |
会话状态与回调:
| 状态 | 含义 |
|---|---|
| IDLE | 未连接 |
| CONNECTING | 建立连接中 |
| CONNECTED | 已连接,服务端已发 connected |
| STARTED | 服务端已回 started,可以送音频 |
| ENDING | 结束帧已发出,等待终评 |
| RECONNECTING | 断线后等待重连 |
| COMPLETED | 已收到终评 |
| FAILED | 以错误结束 |
| CANCELLED | 调用方取消 |
| CLOSED | 连接已关闭,会话结束 |
每个会话只触发终评回调与错误回调中的一个,最多一次。调用方主动取消时两者都不触发。连接关闭回调总在最后。任一时刻查询会话状态得到的值,与最近一次状态变化回调给出的新状态一致。