一、角色分析
文件传输流程中核心分为「发送端」和「接收端」,角色定义取决于数据流向,具体适配场景如下:
(一)角色定义
- 发送端:数据提供方(可是APP或设备端);
- 接收端:数据接收方(可是APP或设备端)。
(二)API选择建议
针对摄像头类产品,需根据已集成的API框架选择文件传输实现方式:
- 已集成 AVAPIs 或 RDTAPIs(模块区别可参考:P2P SDK简介):直接基于对应AVAPIs或者RDTAPIs实现文件传输功能(本文档重点讲解);
- 已集成 P2PTunnelAPIs:通过「P2PTunnelAPIs + HTTP/FTP」实现,详细参考以下文档:
二、基于AVAPIs的文件下载
基于AVAPIs的文件下载(点击详情)适用于已集成AVAPI框架的产品,对接复杂度中等,弱网环境下效能表现优秀,是推荐的文件传输方案之一。
核心特性
- 设备端缓存区默认大小:每个通道256KB(可调整,如有调整,需同时调增客户端的buffer大小,建议客户端buffer大小为设备端的4倍);
- 每包数据大小:建议2~10KB(不超过缓存区大小即可,相关内容:公版AV帧信息定义);
- 可靠性:需检查API返回值(如 avSendFrameData),返回 -20006 时需重新发送该数据包。
三、基于AVAPIs的文件上传
当前公版文档暂未提供基于AVAPIs的文件上传详细实现流程,如需开发可参考文件下载逻辑,核心需注意:
- 保持发送端/接收端角色反转(APP作为发送端,设备作为接收端);
- 严格遵循文件名格式规范(不带路径、包含正确扩展名);
- 正确设置 endFlag(仅最后一个文件的最后一包设为1)。
说明:上传功能需结合设备端接收逻辑自定义开发,确保文件数据完整性校验和存储适配。
四、基于RDTAPIs的文件下载
核心特性
- 设备端缓存区大小:无限制(仅受设备RAM容量约束);
- 帧结构定义:无限制(可根据实际场景自定义,相关内容:公版RDT帧定义);
- 关键要求:设备端需自行打包包头和数据,APP端需对应实现切包和包头解析逻辑。
五、基于RDTAPIs的文件上传
当前公版文档暂未提供基于RDTAPIs的文件上传详细实现流程,核心开发要点:
- 遵循RDT协议的包头格式规范,自定义数据分片策略;
- 发送端需确保数据包顺序一致性,接收端需处理乱序、丢包场景;
- 参考下载逻辑中的通道调度策略,保障上传效率。
六、常见问题
1. 是否支持断点续传?
公版APP不支持断点续传功能,如需实现可自行开发:
- APP端维护下载表,记录文件名、已下载位置、文件总大小等信息;
- 断点续传时,从已下载位置开始请求剩余数据,设备端对应返回分片数据。
2. 设备端的下载通道数及文件调度逻辑如何设计?
通道数和调度逻辑由设备端自定义设计,公版协议不做绑定限制,常见设计方案:
- 按文件类型分通道:视频、图像、声音分别通过不同通道发送;
- 动态负载均衡:设备端可以根据传输文件数量,以及设备资源情况,自行定义开启的通道数;
- 核心原则:确保文件信息和数据完整传输,无额外限制。
3. 目前支持哪些类型的文件?
公版协议不对文件类型做限制,理论上支持所有类型文件,需满足以下条件:
- 设备端发送文件名时必须携带正确扩展名(如 .txt、.mp4、.jpg 等);
- 手机系统需支持对应文件的解析(否则仅能保存文件,无法直接打开)。
4. 对接需要注意哪些问题?
- API返回值检查:发送端需校验 avSendFrameData 等API返回值,返回 -20006 时需重新发送该数据包;
- endFlag 设定:仅最后一个文件的最后一包数据的 endFlag 设为1,其余均为0;
- RDT协议特殊处理:设备端需自行打包包头和数据,APP端需对应实现切包和包头解析;
- 通道关闭时机:发送完最后一包数据后,需检查发送缓存区是否有未发送完成的数据,确认无残留后再关闭通道;
- 文件名规范:文件名不带路径,必须包含正确的扩展名。
七、AVAPIs和RDTAPIs文件传输对比
| 对比选项 | AVAPIs | RDTAPIs |
|---|---|---|
| 对接复杂度 | 一般(无需自定义打包/切包) | 较高(需自行实现包头打包、数据切包) |
| 弱网效能 | 高(内置优化的重传和抗丢包机制) | 较AVAPIs低(需自行处理弱网场景) |
| 设备端缓存区默认大小 | 每个通道256KB(可调整,建议≤1MB) | 不限制(仅受设备RAM容量约束) |
| 每包数据大小建议 | 2~10KB(不超过缓存区大小) | 不限制(可自定义) |
选择建议:
- 优先选择 AVAPIs:弱网环境、对接效率要求高、无需复杂自定义场景;
- 选择 RDTAPIs:需灵活调整传输策略、对数据包大小无限制、需自定义包头解析场景。
