How can I join these two codes on an Arduino board?

1

Maybe the question sounds a bit too much, but I have no idea how to join them. As I said in another question related to the arduino, I was trying to make a login session to validate the user, redirect me to a page simulator of an FTP (something like that).

The code of the beginning of the session I have already handy and is as follows:

   void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if(bufferSize < 400) header[bufferSize++] = c;


        if (c == '\n' && currentLineIsBlank) {       

          // send a standard http response header
          if(strstr(header, "YXJkdWlubzphZG1pbg==") != NULL) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");  // the connection will be closed after completion of the response

            client.println();
            if(strstr(header, "GET / HTTP/1.1")) {
              client.println("<!DOCTYPE HTML>");
              client.println("<html>");
              client.println("AQUI TENDRIA QUE MOSTRAR LA PAGINA 'FTP' al validar el usuario");
              client.println("</html>");
            } else {
              client.println("<!DOCTYPE HTML>");
              client.println("<html>");
              client.println("some other page");
              client.println("</html>");
            }

          } else {
            // wrong user/pass
            client.println("HTTP/1.1 401 Unauthorized");
            //client.println("HTTP/1.1 401 Authorization Required");
            client.println("WWW-Authenticate: Basic realm=\"Secure\"");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<html>Denegado</html>"); // really need this for the popup!


          }

          bufferSize = 0;
          StrClear(header, 400);

          break;

        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}


// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

I saw another code in this source in which they explain how to list files with hyperlinks . Take the code that they offered to download, how poor it is and it works perfectly ... and it's the following:

    #include <Ethernet.h>
#include <SPI.h>
#include <SD.h>

/************ ETHERNET STUFF ************/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 117 };
EthernetServer server(80);

/************ SDCARD STUFF ************/
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

// store error strings in flash to save RAM
#define error(s) error_P(PSTR(s))

void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

void setup() {
  Serial.begin(9600);

  PgmPrint("Free RAM: ");
  Serial.println(FreeRam());  

  // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  // breadboards.  use SPI_FULL_SPEED for better performance.
  pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH);                    // but turn off the W5100 chip!

  if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");

  // initialize a FAT volume
  if (!volume.init(&card)) error("vol.init failed!");

  PgmPrint("Volume is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();

  if (!root.openRoot(&volume)) error("openRoot failed");

  // list file in root with date and size
  PgmPrintln("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();

  // Recursive list of all directories
  PgmPrintln("Files found in all dirs:");
  root.ls(LS_R);

  Serial.println();
  PgmPrintln("Done");

  // Debugging complete, we start the server!
  Ethernet.begin(mac, ip);
  server.begin();
}

void ListFiles(EthernetClient client, uint8_t flags) {
  // This code is just copied from SdFile.cpp in the SDFat library
  // and tweaked to print to the client output in html!
  dir_t p;

  root.rewind();
  client.println("<ul>");
  while (root.readDir(p) > 0) {
    // done if past last used entry
    if (p.name[0] == DIR_NAME_FREE) break;

    // skip deleted entry and entries for . and  ..
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;

    // only list subdirectories and files
    if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;

    // print any indent spaces
    client.print("<li><a href=\"");
    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print('.');
      }
      client.print((char)p.name[i]);
    }
    client.print("\">");

    // print file name with possible blank fill
    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print('.');
      }
      client.print((char)p.name[i]);
    }

    client.print("</a>");

    if (DIR_IS_SUBDIR(&p)) {
      client.print('/');
    }

    // print modify date/time if requested
    if (flags & LS_DATE) {
       root.printFatDate(p.lastWriteDate);
       client.print(' ');
       root.printFatTime(p.lastWriteTime);
    }
    // print size if requested
    if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {
      client.print(' ');
      client.print(p.fileSize);
    }
    client.println("</li>");
  }
  client.println("</ul>");
}

// How big our line buffer should be. 100 is plenty!
#define BUFSIZ 100

void loop()
{
  char clientline[BUFSIZ];
  int index = 0;

  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean current_line_is_blank = true;

    // reset the input buffer
    index = 0;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        // If it isn't a new line, add the character to the buffer
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          // are we too big for the buffer? start tossing out data
          if (index >= BUFSIZ) 
            index = BUFSIZ -1;

          // continue to read more data!
          continue;
        }

        // got a \n or \r new line, which means the string is done
        clientline[index] = 0;

        // Print it out for debugging
        Serial.println(clientline);

        // Look for substring such as a request to get the root file
        if (strstr(clientline, "GET / ") != 0) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          // print all the files, use a helper to keep it clean
          client.println("<h2>Files:</h2>");
          ListFiles(client, LS_SIZE);
        } else if (strstr(clientline, "GET /") != 0) {
          // this time no space after the /, so a sub-file!
          char *filename;

          filename = clientline + 5; // look after the "GET /" (5 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;

          // print the file we want
          Serial.println(filename);

          if (! file.open(&root, filename, O_READ)) {
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<h2>File Not Found!</h2>");
            break;
          }

          Serial.println("Opened!");

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/plain");
          client.println();

          int16_t c;
          while ((c = file.read()) > 0) {
              // uncomment the serial to debug (slow!)
              //Serial.print((char)c);
              client.print((char)c);
          }
          file.close();
        } else {
          // everything else is a 404
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>File Not Found!</h2>");
        }
        break;
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}

It has exactly what I'm looking for! and works! first try creating an HTML file with hyperlinks to the text files that the SD card contains. In the separate computer it works, but when you insert it to the board and try to do such a thing, you can not find them. Try to join these two codes but two things happen to me:

1. The IP address changes and the browser does not respond to the request.

2. The SD card gets corrupted and I need to format it to be able to retest.

So far I have not managed to join both codes ... and I ask for your help: How to join both codes?

We already know that the place where I should show the list with the hyperlinks to the files is in this code block:

        client.println();
        if(strstr(header, "GET / HTTP/1.1")) {
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("AQUI TENDRIA QUE MOSTRAR LA PAGINA 'FTP' al validar el usuario");
          client.println("</html>");
        } else {
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("some other page");
          client.println("</html>");
        }
    
asked by TwoDent 06.04.2017 в 03:33
source

1 answer

2

First thing: no idea of arduino , but joining those codes does not seem to be too complicated.

The include s:

#include <Ethernet.h>
#include <SPI.h>
#include <SD.h>

We modify your setup( ) , so that it is also in charge of the SD:

void setup( ) {
  // Open serial communications and wait for port to open:
  Serial.begin( 9600 );

  // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  // breadboards.  use SPI_FULL_SPEED for better performance.
  pinMode( 10, OUTPUT );                       // set the SS pin as an output (necessary!)
  digitalWrite( 10, HIGH );                    // but turn off the W5100 chip!

  if( !card.init( SPI_HALF_SPEED, 4 ) ) error( "card.init failed!" );

  // initialize a FAT volume
  if( !volume.init( &card ) ) error( "vol.init failed!" );
  if( !root.openRoot( &volume ) ) error( "openRoot failed" );

  // start the Ethernet connection and the server:
  Ethernet.begin( mac, ip );
  server.begin( );
  Serial.print( "server is at " );
  Serial.println( Ethernet.localIP( ) );
}

And now, in the part where you indicate, a slight change:

client.println( );
if(strstr( header, "GET / HTTP/1.1" ) ) {
  client.println( "<!DOCTYPE HTML>" );
  client.println( "<html>" );
  ListFiles( client, 0 ); // <- Ponemos esto aquí, para que liste.
  client.println( "</html>" );
} else {
  client.println( "<!DOCTYPE HTML>" );
  client.println( "<html>" );
  client.println( "some other page" );
  client.println( "</html>" );
}

The 2nd parameter can be 0 , or a combination of LS_SIZE and LS_DATE , to show you the size and date of the files.

You should copy, in your code file, the whole body of the function ListFiles( ) of the example you have:

void ListFiles( EthernetClient client, uint8_t flags ) {
  ...
}

One last thing: it only supports SD in FAT format, so to see what you get: -)

    
answered by 06.04.2017 в 06:59