# 基于 MQTT 的文件传输

物联网应用往往面临多元化数据传输的场景，设备与云端之间需要快速可靠传输各类数据。随着物联网在越来越多的行业中广泛应用，更多的应用场景被发掘出来。除了传感器数据和控制指令这样的实时结构化数据外，离线类型的文件数据，如音视频、图片和诊断日志等，也开始在物联网中扮演重要角色。

EMQX 提供了基于标准 MQTT 协议的文件传输功能，并实现了传输效率和可靠性的保障。

## 传统方式的缺点

在文件传输领域，已经有一些成熟的技术，例如 FTP 和 HTTP。用户可以将 MQTT 与这些技术结合使用：通过 HTTP/FTP 传输文件内容，并利用 MQTT 传输事件和文件位置信息。

这个方案实现了技术的异构融合，理论上能够充分发挥各自的优势，从而提高文件传输的效率和灵活性。然而在物联网环境下，用户可能会遇到以下问题：

- **难以协调整体流控**：在物联网设备低带宽、网络环境复杂且不可靠的情况下，采用多个连接同时向云端发送数据时，难以进行整体流量控制和优先级管理。特别是在通过 HTTP/FTP 进行大文件传输时，可能会长时间占用带宽，导致关键 MQTT 消息传输受阻。
- **多个技术栈共存问题**：在物联网终端中，设备通常资源有限。有些设备可能没有足够空间和处理能力引入额外技术栈。MQTT 更轻量，适用性比 HTTP/FTP 更好，能够绕过限制完成业务开发。
- **额外的开发与管理成本**：现有的 MQTT 通道已经有较为完备的设备认证与授权体系，新引入的 FTP 和 HTTP 技术需要将安全与管理体系再重新实现一次，增加额外的开发和管理成本。
- **性能的限制**：HTTP/FTP 技术不适用于需要支持海量连接的物联网应用，除此之外，弱网情况下频繁的重连与重传将进一步放大 HTTP/FTP 文件传输的劣势，为应用的开发和运维带来很大压力。

## EMQX 中的 MQTT 文件传输

MQTT 规范没有定义传输文件的标准方式。而 EMQX 扩展了 MQTT 协议、有助于客户端设备进行高效且安全的文件传输。它定义并实现了一个建于 MQTT 之上的简单应用级协议，使客户端设备能简单得处理文件传输。

### 特性

基于 MQTT 的文件传输面临多个挑战，既需要解决可靠性问题，确保文件 100% 完整，又需要解决文件管理与长期存储问题，同时，还需要适配各类应用的文件读取接口，实现更好的服务集成。

为此，EMQX 文件传输功能实现了以下特性：

- 支持与其他业务使用同一个 MQTT 连接，充分复用现有的客户端管理体系；

- 支持分块传输，这意味着轻量级的客户端也能够处理大型文件，同时超过 MQTT 协议限制大小（256MB）的文件也能够被传输；

- 支持断点续传，客户端设备可以随时暂停文件传输以进行更高优先级的数据传输，或从网络中断中恢复传输；

- 可靠性保障，通过 QoS 1 级别消息进行传输，提供了校验、重传机制确保文件传输完整性；

- 灵活的存储层配置，上传的文件能够保存到本地指定目录或与 S3 兼容的对象存储中，方便后续使用。

### 优势

MQTT 作为一种轻量、灵活的消息传输协议，为企业提供了一种更加便捷和高效的文件传输解决方案。通过结构化数据与文件类型数据传输的有机结合，物联网能够实现的业务变得更加丰富多样。

统一的 MQTT 数据通道能够简化系统架构，降低应用的复杂性和维护成本。利用 EMQX 的 MQTT 文件传输功能，企业将可以实现更加便捷和多样性的物联网应用开发。

在协议层面，EMQX 文件传输基于标准的 MQTT 实现，通过指定的 MQTT 主题以及 Payload 实现整个传输流程，无需改造现有的客户端与应用即可进行集成。详细的传输协议请参考[文件传输客户端开发](./client.md)。

## 下一步

了解更多关于 EMQX 中的 MQTT 文件传输：

- [MQTT 文件传输：轻松通过单个协议传输大型数据](https://www.emqx.com/en/blog/file-transfer-over-mqtt)

如何使用文件传输功能：

- [快速体验 MQTT 文件传输](./quick-start.md)
- [文件传输服务端配置](./broker.md)
- [文件传输客户端开发](./client.md)
