PingPongFTP嵌入式简单文件传输协议
一、命令帧格式
frame:cmd[2 Bytes]+len[2 Bytes]+payload[2^4 ~ 2^11 Bytes]+crc[2~4 Bytes]
备注:len指的是payload的长度,结合帧长度和payload长度len,则可以判断帧校验方式是CRC16还是CRC32
二、上位机与从机交互命令
1. masterBroadcastFileInfo[0x8080]
payload:filesize[4Bytes]+filepackagenum[2Bytes]+fileperpackagesize[2]+filetotalcrc[2~4Bytes]
2. masterSendFilePackage[0x8081]
payload: packageindex[2] + upgradefilepayload[16~2048Bytes]
3. nodeAskFileInfo[0x8070]
payload:1024[2Bytes]
4. nodeAskFilePackage[0x8071]
payload:currentpackageindex[2Bytes]
三、文件传输流程(广播传输流程)
1、首先上位机导入传输文件,并生成传输文件信息。其中包含传输文件总字节数,文件总校验,文件总包数,每帧数据最大字节数。
2、上位机先发送文件信息,然后一次性广播完所有文件切片。
3、slave接收传输文件切片,并统计没有收到的切片,然后向master请求剩余没接收到的文件切片。
4、slave获取完所有文件切片后,进行文件大小和文件总校验验证,来判断传输文件完整性。
5、传输过程中每帧数据都进行校验,传输完成后,对传输文件进行总校验,以确保传输文件完整性,校验方式有CRC16或者CRC32。
备注:点对点传输模式,是从机主动询问上位机文件信息,然后根据总包数,一包一包询问上位机要文件切片,直到把所有文件切片获取完成之后,再比较文件总字节数,文件总校验等信息来确定文件完整性。
四、校验算法
uint32_t CRC32( uint8_t *buffer, int length ){
uint32_t crc = 0xFFFFFFFF;
const uint32_t reversedPolynom = 0xEDB88320;
if( buffer == NULL || length <= 0 ){
return 0xFFFFFFFF;
}
for( uint16_t i = 0; i < length; ++i ){
crc ^= ( uint32_t )buffer[i];
for( uint16_t i = 0; i < 8; i++ ){
crc = ( crc >> 1 ) ^ ( reversedPolynom & ~( ( crc & 0x01 ) - 1 ) );
}
}
return ~crc;
}
uint16_t CRC16( uint8_t* buffer, int length ){
uint16_t i = 0;
uint16_t index = 0;
uint16_t crc = 0x1024;
const uint16_t CRC_CCITT_POLY = 0x1021;
if ( buffer == NULL || length <= 0 ){
return 0xFFFF;
}
while (--length >= 0){
crc = (uint16_t)(crc ^ ((buffer[index++]) << 8));
for (i = 0; i < 8; i++){
if ((crc & 0x8000) != 0){
crc = (uint16_t)((crc << 1) ^ CRC_CCITT_POLY);
}else{
crc = (uint16_t)(crc << 1);
}
}
}
return crc;
}