CH395的FTP Server(主動模式)簡單應用參考

sw2222發表於2024-04-02

  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

  

  

相關文章