FTP(File Transfer Protocol,檔案傳輸協議) 是 TCP/IP 協議組中的協議之一。FTP協議包括兩個組成部分,其一為FTP伺服器,其二為FTP客戶端。本篇文章將基於FTP協議實現CH395作FTP伺服器,採用Filezilla - Client軟體建立客戶端連線CH395伺服器進行檔案的上傳和下載。
FTP Server為主動模式時,FTP客戶端連線FTP伺服器的21埠,傳送相應的使用者名稱和密碼進行連線登入,使用者名稱和密碼驗證成功後,透過list命令進行目錄讀取相關列表和資料,之後客戶端傳送PORT命令
FTP客戶端連線到FTP伺服器的21埠,傳送使用者名稱和密碼登入,登入成功後要list列表或者讀取資料時,客戶端隨機開放一個埠(1024以上),傳送 PORT命令到FTP伺服器,告訴伺服器客戶端採用主動模式並開放埠;FTP伺服器收到PORT主動模式命令和埠號後,透過伺服器的20埠和客戶端開放的埠連線,傳送資料。
本文測試環境為CH32V307RCT6+CH395Q+FIlezilla clinet進行驗證。
CH395驅動和FTP驅動引數移植WCH官網EVT中的EXAM(文章結尾附程式碼),如下圖1示:
圖一
移植完成後,注意本地IP及使用者名稱和密碼如圖2示,在該段程式中,設定了需要正確使用者名稱和密碼才能正常訪問伺服器。
void CH395_FTPCmdRespond( char *recv_buff ) { UINT8 s; UINT8 len; UINT16 port; if( strncmp("USER", recv_buff, 4) == 0 ){ /* 使用者名稱 */ memset((void *)UserName,'\0',sizeof(UserName)); CH395_FTPGetFileName( recv_buff,UserName ); CH395_FTPSendData( (char *)FTP_SERVICE_CMD[2],strlen(FTP_SERVICE_CMD[2]),ftp.SocketCtl ); } else if( strncmp("PASS", recv_buff, 4) == 0 ){ /* 密碼 */ #if Access_Authflag /* 如果需要檢測使用者名稱*/ if(strncmp(pUserName, UserName, strlen(pUserName)) == 0){ /* 使用者名稱正確 */ CH395_FTPSendData( (char *)FTP_SERVICE_CMD[3],strlen(FTP_SERVICE_CMD[3]),ftp.SocketCtl ); } else{ /* 使用者名稱錯誤*/ CH395_FTPSendData( (char *)FTP_SERVICE_CMD[4],strlen(FTP_SERVICE_CMD[4]),ftp.SocketCtl ); } #else CH395_FTPSendData( (char *)FTP_SERVICE_CMD[3],strlen(FTP_SERVICE_CMD[3]),ftp.SocketCtl ); #endif memset((void *)UserName,'\0',sizeof(UserName)); CH395_FTPGetFileName( recv_buff,UserName ); if(strncmp(pPassWord, UserName, strlen(pPassWord)) == 0){ /* 驗證密碼是否正確(符合條件則有寫檔案許可權)*/ ftp.AuthFlag = 1; printf("have more authority\n"); } }
圖二
-----------------------------------------------------------------------------------------------------------------------------------------------------
驗證測試:開啟Filezilla clinet軟體進行配置,如圖三,注意主機的IP和使用者名稱密碼,埠填21(可不填)。
圖三
更改傳輸設定,將模式修改成主動模式,如圖四顯示:
圖四
--------------------------------------------------------------------------------------------------------------
設定完成後,將CH395進行復位及初始化,初始化完成後,點選Filezilla軟體上的連線,正常連線伺服器後,會彈出目錄及預存在MCU中檔案A、B,圖五示:
圖五
右擊右邊檔案中的A、B任意檔案後點選下載,如圖六示,如果正常,則顯示資料傳輸完成。
圖六
Filezilla軟體可自行搜尋下載(開源)。相關測試程式碼:https://files.cnblogs.com/files/blogs/805237/CH395FTP.rar?t=1712050453&download=true