更新时间:2024-09-12 06:35:54下载pdf
本文介绍文件传输服务。
蓝牙 LE 标准协议接入支持文件传输服务,主要用于 App 向设备传输文件。智能门锁、智能手表和手环等设备常需要更新语音文件、表盘文件等数据,这些数据通常需要 App 下发到智能设备。为了确保文件下发统一,蓝牙 LE 标准协议接入支持文件传输服务,MCU 只需通过蓝牙模组提供的文件下发通信接口,按照本文所述的文件下发协议实现即可。
适用固件:目前,仅 Telink 蓝牙单点通用固件 2.3.5 以上版本支持,而其他固件会在后续支持。
该部分协议为蓝牙 LE 文件传输服务相关协议。
文件传输开始时,蓝牙模组会向 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,表示从头开始传输。
模组发送
字段 | 字节数 | 说明 |
---|---|---|
帧头 | 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 端给出的偏移。
模组发送
字段 | 字节数 | 说明 |
---|---|---|
帧头 | 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
:其他
模组发送
字段 | 字节数 | 说明 |
---|---|---|
帧头 | 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
:其他
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-蓝牙设备开发 版块进行沟通咨询。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈