Laggger164

ESP32CAM_FTPClient library Ethernet fork

Jul 7th, 2021 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <EthernetClient.h>
  2. #include "ESP32_FTPClient.h"
  3.  
  4. ESP32_FTPClient::ESP32_FTPClient(char* _serverAdress, uint16_t _port, char* _userName, char* _passWord, uint16_t _timeout, uint8_t _verbose){
  5.   userName = _userName;
  6.   passWord = _passWord;
  7.   serverAdress = _serverAdress;
  8.   port = _port;
  9.   timeout = _timeout;
  10.   verbose = _verbose;
  11. }
  12.  
  13. ESP32_FTPClient::ESP32_FTPClient(char* _serverAdress, char* _userName, char* _passWord, uint16_t _timeout, uint8_t _verbose){
  14.   userName = _userName;
  15.   passWord = _passWord;
  16.   serverAdress = _serverAdress;
  17.   port = 21;
  18.   timeout = _timeout;
  19.   verbose = _verbose;
  20. }
  21.  
  22. EthernetClient* ESP32_FTPClient::GetDataClient() {
  23.   return &dclient;
  24. }
  25.  
  26. bool ESP32_FTPClient::isConnected(){
  27.   if(!_isConnected)
  28.   {
  29.     FTPerr("FTP error: ");
  30.     FTPerr(outBuf);
  31.     FTPerr("\n");
  32.   }
  33.  
  34.   return _isConnected;
  35. }
  36.  
  37. void ESP32_FTPClient::GetLastModifiedTime(const char  * fileName, char* result) {
  38.   FTPdbgn("Send MDTM");
  39.   if(!isConnected()) return;
  40.   client.print(F("MDTM "));
  41.   client.println(F(fileName));
  42.   GetFTPAnswer (result, 4);
  43. }
  44.  
  45. void ESP32_FTPClient::WriteClientBuffered(EthernetClient* cli, unsigned char * data, int dataLength) {
  46.   if(!isConnected()) return;
  47.  
  48.   size_t clientCount = 0;
  49.   for(int i = 0; i < dataLength;i++){
  50.     clientBuf[clientCount] = data[i];
  51.     //client.write(data[i])
  52.     clientCount++;
  53.     if (clientCount > bufferSize-1) {
  54.         cli->write(clientBuf, bufferSize);
  55.       clientCount = 0;
  56.     }
  57.   }
  58.   if (clientCount > 0){
  59.       cli->write(clientBuf, clientCount);
  60.   }
  61. }
  62.  
  63. void ESP32_FTPClient::GetFTPAnswer (char* result, int offsetStart) {
  64.   char thisByte;
  65.   outCount = 0;
  66.  
  67.   unsigned long _m = millis();
  68.   while (!client.available() && millis() < _m + timeout) delay(1);
  69.  
  70.   if( !client.available()){
  71.     memset( outBuf, 0, sizeof(outBuf) );
  72.     strcpy( outBuf, "Offline");
  73.  
  74.     _isConnected = false;
  75.     isConnected();
  76.     return;
  77.   }
  78.  
  79.   while (client.available()) {
  80.     thisByte = client.read();
  81.     if (outCount < sizeof(outBuf)) {
  82.       outBuf[outCount] = thisByte;
  83.       outCount++;
  84.       outBuf[outCount] = 0;
  85.     }
  86.   }
  87.  
  88.   if(outBuf[0] == '4' || outBuf[0] == '5' ){
  89.     _isConnected = false;
  90.     isConnected();
  91.     return;
  92.   }
  93.   else
  94.   {
  95.     _isConnected = true;
  96.   }
  97.  
  98.   if(result != NULL){
  99.     FTPdbgn("Result start");
  100.     // Deprecated
  101.     for(int i = offsetStart; i<sizeof(outBuf); i++){
  102.       result[i] = outBuf[i - offsetStart];
  103.     }
  104.     FTPdbg("Result: ");
  105.     //Serial.write(result);
  106.     FTPdbg(outBuf);
  107.     FTPdbgn("Result end");
  108.   }
  109. }
  110.  
  111. void ESP32_FTPClient::WriteData (unsigned char * data, int dataLength) {
  112.   FTPdbgn(F("Writing"));
  113.   if(!isConnected()) return;
  114.   WriteClientBuffered(&dclient, &data[0], dataLength);
  115. }
  116.  
  117. void ESP32_FTPClient::CloseFile () {
  118.   FTPdbgn(F("Close File"));
  119.   dclient.stop();
  120.  
  121.   if(!_isConnected) return;
  122.  
  123.   GetFTPAnswer();
  124. }
  125.  
  126. void ESP32_FTPClient::Write(const char * str) {
  127.   FTPdbgn(F("Write File"));
  128.   if(!isConnected()) return;
  129.  
  130.   GetDataClient()->print(str);
  131. }
  132.  
  133. void ESP32_FTPClient::CloseConnection() {
  134.   client.println(F("QUIT"));
  135.   client.stop();
  136.   FTPdbgn(F("Connection closed"));
  137. }
  138.  
  139. void ESP32_FTPClient::OpenConnection() {
  140.   FTPdbg(F("Connecting to: "));
  141.   FTPdbgn(serverAdress);
  142.   if( client.connect(serverAdress, port) )
  143.   {
  144.     FTPdbgn(F("Command connected"));
  145.   }
  146.  
  147.   GetFTPAnswer();
  148.  
  149.   FTPdbgn("Send USER");
  150.   client.print(F("USER "));
  151.   client.println(F(userName));
  152.   GetFTPAnswer();
  153.  
  154.   FTPdbgn("Send PASSWORD");
  155.   client.print(F("PASS "));
  156.   client.println(F(passWord));
  157.   GetFTPAnswer();
  158.  
  159.   FTPdbgn("Send SYST");
  160.   client.println(F("SYST"));
  161.   GetFTPAnswer();
  162. }
  163.  
  164. void ESP32_FTPClient::RenameFile(char* from, char* to) {
  165.   FTPdbgn("Send RNFR");
  166.   if(!isConnected()) return;
  167.   client.print(F("RNFR "));
  168.   client.println(F(from));
  169.   GetFTPAnswer();
  170.  
  171.   FTPdbgn("Send RNTO");
  172.   client.print(F("RNTO "));
  173.   client.println(F(to));
  174.   GetFTPAnswer();
  175. }
  176.  
  177. void ESP32_FTPClient::NewFile (const char* fileName) {
  178.   FTPdbgn("Send STOR");
  179.   if(!isConnected()) return;
  180.   client.print(F("STOR "));
  181.   client.println(F(fileName));
  182.   GetFTPAnswer();
  183. }
  184.  
  185. void ESP32_FTPClient::InitFile(const char* type){
  186.   FTPdbgn("Send TYPE");
  187.   if(!isConnected()) return;
  188.   FTPdbgn(type);
  189.   client.println(F(type));
  190.   GetFTPAnswer();
  191.  
  192.   FTPdbgn("Send PASV");
  193.   client.println(F("PASV"));
  194.   GetFTPAnswer();
  195.  
  196.   char *tStr = strtok(outBuf, "(,");
  197.   int array_pasv[6];
  198.   for ( int i = 0; i < 6; i++) {
  199.     tStr = strtok(NULL, "(,");
  200.     if (tStr == NULL) {
  201.       FTPdbgn(F("Bad PASV Answer"));
  202.       CloseConnection();
  203.       return;
  204.     }
  205.     array_pasv[i] = atoi(tStr);
  206.   }
  207.   unsigned int hiPort, loPort;
  208.   hiPort = array_pasv[4] << 8;
  209.   loPort = array_pasv[5] & 255;
  210.  
  211.   IPAddress pasvServer(array_pasv[0],array_pasv[1],array_pasv[2],array_pasv[3]);
  212.  
  213.   FTPdbg(F("Data port: "));
  214.   hiPort = hiPort | loPort;
  215.   FTPdbgn(hiPort);
  216.   if (dclient.connect(pasvServer, hiPort)) {
  217.     FTPdbgn(F("Data connection established"));
  218.   }
  219. }
  220.  
  221. void ESP32_FTPClient::AppendFile (char* fileName) {
  222.   FTPdbgn("Send APPE");
  223.   if(!isConnected()) return;
  224.   client.print(F("APPE "));
  225.   client.println(F(fileName));
  226.   GetFTPAnswer();
  227. }
  228.  
  229. void ESP32_FTPClient::ChangeWorkDir(const char * dir) {
  230.   FTPdbgn("Send CWD");
  231.   if(!isConnected()) return;
  232.   client.print(F("CWD "));
  233.   client.println(F(dir));
  234.   GetFTPAnswer();
  235. }
  236.  
  237. void ESP32_FTPClient::DeleteFile(const char * file) {
  238.   FTPdbgn("Send DELE");
  239.   if(!isConnected()) return;
  240.   client.print(F("DELE "));
  241.   client.println(F(file));
  242.   GetFTPAnswer();
  243. }
  244.  
  245. void ESP32_FTPClient::MakeDir(const char * dir) {
  246.   FTPdbgn("Send MKD");
  247.   if(!isConnected()) return;
  248.   client.print(F("MKD "));
  249.   client.println(F(dir));
  250.   GetFTPAnswer();
  251. }
  252.  
  253. void ESP32_FTPClient::ContentList(const char * dir, String * list) {
  254.   char _resp[ sizeof(outBuf) ];
  255.   uint16_t _b = 0;
  256.  
  257.   FTPdbgn("Send MLSD");
  258.   if(!isConnected()) return;
  259.   client.print(F("MLSD"));
  260.   client.println(F(dir));
  261.   GetFTPAnswer(_resp);
  262.  
  263.   // Convert char array to string to manipulate and find response size
  264.   // each server reports it differently, TODO = FEAT
  265.   //String resp_string = _resp;
  266.   //resp_string.substring(resp_string.lastIndexOf('matches')-9);
  267.   //FTPdbgn(resp_string);
  268.  
  269.   unsigned long _m = millis();
  270.   while( !dclient.available() && millis() < _m + timeout) delay(1);
  271.  
  272.   while(dclient.available())
  273.   {
  274.     if( _b < 128 )
  275.     {
  276.       list[_b] = dclient.readStringUntil('\n');
  277.       //FTPdbgn(String(_b) + ":" + list[_b]);
  278.       _b++;
  279.     }
  280.   }
  281.  
  282. }
  283.  
  284. void ESP32_FTPClient::ContentListWithListCommand(const char * dir, String * list) {
  285.   char _resp[ sizeof(outBuf) ];
  286.   uint16_t _b = 0;
  287.  
  288.   FTPdbgn("Send LIST");
  289.   if(!isConnected()) return;
  290.   client.print(F("LIST"));
  291.   client.println(F(dir));
  292.   GetFTPAnswer(_resp);
  293.  
  294.   // Convert char array to string to manipulate and find response size
  295.   // each server reports it differently, TODO = FEAT
  296.   //String resp_string = _resp;
  297.   //resp_string.substring(resp_string.lastIndexOf('matches')-9);
  298.   //FTPdbgn(resp_string);
  299.  
  300.   unsigned long _m = millis();
  301.   while( !dclient.available() && millis() < _m + timeout) delay(1);
  302.  
  303.   while(dclient.available())
  304.   {
  305.     if( _b < 128 )
  306.     {
  307.       String tmp = dclient.readStringUntil('\n');
  308.       list[_b] = tmp.substring(tmp.lastIndexOf(" ") + 1, tmp.length());
  309.       //FTPdbgn(String(_b) + ":" + tmp);
  310.       _b++;
  311.     }
  312.   }
  313.  
  314. }
  315.  
  316. void ESP32_FTPClient::DownloadString(const char * filename, String &str) {
  317.   FTPdbgn("Send RETR");
  318.   if(!isConnected()) return;
  319.   client.print(F("RETR "));
  320.   client.println(F(filename));
  321.  
  322.   char _resp[ sizeof(outBuf) ];
  323.   GetFTPAnswer(_resp);
  324.  
  325.   unsigned long _m = millis();
  326.   while( !GetDataClient()->available() && millis() < _m + timeout) delay(1);
  327.  
  328.   while( GetDataClient()->available() )
  329.   {
  330.     str += GetDataClient()->readString();
  331.   }
  332.  
  333. }
  334.  
  335. void ESP32_FTPClient::DownloadFile(const char * filename, unsigned char * buf, size_t length, bool printUART ) {
  336.   FTPdbgn("Send RETR");
  337.   if(!isConnected()) return;
  338.   client.print(F("RETR "));
  339.   client.println(F(filename));
  340.  
  341.   char _resp[ sizeof(outBuf) ];    
  342.   GetFTPAnswer(_resp);
  343.  
  344.   char _buf[2];
  345.  
  346.   unsigned long _m = millis();
  347.   while( !dclient.available() && millis() < _m + timeout) delay(1);
  348.  
  349.   while(dclient.available())
  350.   {
  351.     if( !printUART )
  352.       dclient.readBytes(buf, length);
  353.  
  354.     else
  355.     {
  356.       for(size_t _b = 0; _b < length; _b++ )
  357.       {
  358.         dclient.readBytes(_buf, 1),
  359.         Serial.print(_buf[0], HEX);
  360.       }
  361.     }
  362.   }
  363. }
Add Comment
Please, Sign In to add comment