文件传输服务

更新时间:2024-09-12 06:35:54下载pdf

本文介绍文件传输服务。

概述

蓝牙 LE 标准协议接入支持文件传输服务,主要用于 App 向设备传输文件。智能门锁、智能手表和手环等设备常需要更新语音文件、表盘文件等数据,这些数据通常需要 App 下发到智能设备。为了确保文件下发统一,蓝牙 LE 标准协议接入支持文件传输服务,MCU 只需通过蓝牙模组提供的文件下发通信接口,按照本文所述的文件下发协议实现即可。

适用固件:目前,仅 Telink 蓝牙单点通用固件 2.3.5 以上版本支持,而其他固件会在后续支持。

相关协议

该部分协议为蓝牙 LE 文件传输服务相关协议。

文件传输流程

开始
手机 App 下发文件请求
设备返回是否允许文件下发?
手机 App 下发文件信息
结束
设备返回是否有此文件?
手机 App 下发文件偏移量
设备返回文件偏移量
手机 App 下发文件数据
文件是否下发完成?
手机 App 下发文件结束
返回升级结果成功?
下发成功
下发失败

发送文件请求(CMD-0xF5)

文件传输开始时,蓝牙模组会向 MCU 发送文件信息。MCU 根据文件信息,返回是否接收文件以及接收文件时的最大单包长度。

模组发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF5
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
1 File Identifier Length
n File Identifier
4 File Version
4 File Length
16 File MD5
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • File Type

    • 0:通用文件类型
    • 其他:保留
  • File ID:文件 ID,应用层定义。

  • File Identifier Length:文件标识符长度。

  • File Identifier:文件标识符。

  • File Version:文件版本,应用层定义格式。

  • File Length:文件总长度。

  • File MD5:文件的 MD5 值。

设备端在解析该指令时,不能限制最大长度,便于后续扩展。

MCU 返回

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF5
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
1 Status
2 最大包长度
4 已存储文件长度
16 已存储文件 MD5 值
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • File Type 和 File ID 同请求帧。

  • Status:

    • 0x00:可以下发。

    • 0x01:无此文件,不可下发。

    • 0x02:有此文件,但版本低于或者等于当前版本。

    • 0x03:文件大小超过限制。

    • 其他:保留。

  • 最大包长度:MCU 允许的单包最大长度,单位字节。蓝牙模组允许的单包最大长度为 1024 字节。若 MCU 给出的最大包长度大于 1024 字节,则最终以蓝牙模组给出的长度为准,否则以 MCU 给出的长度为准。

为了支持断点续传,此处会返回设备端已经储存的文件信息。App 在收到后,首先根据设备返回的已储存文件长度,计算新文件对应长度的 MD5,然后和设备返回的 MD5 对比。

如果两者都吻合,那么在下面的文件起始传输请求中,将起始传输偏移量改为该长度值,否则文件起始传输偏移量改为 0,表示从头开始传输。

发送文件偏移请求(CMD-0xF6)

模组发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF6
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
4 File Offset
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • File Type 和 File ID 同请求帧。

  • File Offset:文件起始传输偏移量,四字节。

MCU 返回

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF6
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
4 File Offset
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余
  • File Type 和 File ID 同请求帧。

  • File Offset:文件起始传输偏移量,四字节。

实际文件传输的偏移地址应该以设备端要求的地址为准,且设备端要求的地址会小于等于 App 端给出的偏移。

发送文件数据(CMD-0xF7)

模组发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x10
命令字 CMD 1 0xF7
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
2 包号
2 当前包数据长度 n
2 当前包数据 CRC16
n 当前包数据
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

包号从 0 开始,当前包数据长度不能大于文件请求指令指定的最大包长度。

MCU 返回

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF7
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
1 Status
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

File Type 和 File ID 见文件信息描述。

Status 返回值说明:

  • 0x00:成功

  • 0x01:包号异常

  • 0x02:长度不一致

  • 0x03:CRC 校验失败

  • 0x04:其他

发送文件结束(CMD-0xF8)

模组发送

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF8
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

File Type 和 File ID 见文件信息描述。

MCU 返回

字段 字节数 说明
帧头 2 0x55,0xAA
版本号 1 0x00
命令字 CMD 1 0xF8
数据长度 Len 2 数据字段字节数之和
数据 1 File Type
2 File ID
1 Status
CRC8 1 从帧头开始按字节求和得出的结果对 256 求余

File Type 和 File ID 见文件信息描述。

Status 返回值说明:

  • 0x00:成功

  • 0x01:数据总长度错误

  • 0x02:文件总体 MD5 检验失败

  • 0x03:其他

常见问题

Q:协议中的 CRC16 如何计算?

A:参考如下函数,来计算 CRC16 值。

uint16_t tuya_ble_crc16_compute(uint8_t * p_data, uint16_t size, uint16_t * p_crc) {

    uint16_t poly[2] = {0, 0xa001};            //0x8005 <==> 0xa001
    uint16_t crc;
    int i, j;
    crc = (p_crc == NULL) ? 0xFFFF: *p_crc;

    for(j = size; j > 0; j--) {
        unsigned char ds = *p_data++;

        for(i = 0; i < 8; i++) {
            crc = (crc >> 1) ^ poly[(crc ^ ds) & 1];
            ds = ds >> 1;
        }
    }

    return crc;
}

联系涂鸦

如果在开发过程遇到问题,您可以登录 TuyaOS 开发者论坛 TuyaOS-蓝牙设备开发 版块进行沟通咨询。

咨询前,建议首先查阅 官方资料 或参考已有帖子,并认真阅读 发帖规范