copko

Arduino simple webserver4

Jan 21st, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.33 KB | None | 0 0
  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <SD.h>
  4. #define LED1 3
  5. #define LED2 5
  6. #define CARDPIN 4
  7.  
  8. byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //MAC adresa
  9. //IPAddress ip(192, 168, 1, 177); //nahradna IP
  10.  
  11. EthernetServer server(80); //vytvorenie objektu pre HTTP(80) server
  12.  
  13. void setup() {
  14.   Serial.begin(9600); //seriova linka pre debugovacie ucely
  15.  // pinMode(LED1, OUTPUT);
  16.  // pinMode(LED2, OUTPUT);
  17.  
  18.   Serial.print("Inicializacia SD karty...");
  19.   if (!SD.begin(CARDPIN)) {
  20.     Serial.println(F("Poskodena alebo chybajuca karta.")); //pouzite F() makro kvoli setreniu RAM pamate
  21.     return;
  22.   }
  23.   Serial.println(F("Karta inicializovana."));
  24.  
  25.   if (!Ethernet.begin(mac)) //ak sa nepodari nacitat IP cez DHCP
  26.   //  Ethernet.begin(mac, ip); //nastavime ju na pevno
  27.   server.begin(); //spustime pocuvanie servera na poziadavky klientov
  28.   Serial.print(F("Server ma IP adresu "));
  29.   Serial.println(Ethernet.localIP());
  30. }
  31.  
  32. void loop() {
  33.   String buffer = ""; //buffer pre prijimanie znakov
  34.   String fileName = "";
  35.   char c; //premenna pre nacitanie znaku
  36.   EthernetClient client = server.available(); //ak server detegoval nejake prichadzajuce spojenie, vytvori klienta pre odosielanie dat
  37.  
  38.   while (client.connected()) { //pokial je klient pripojeny
  39.     if (client.available()) { //ak este existuju data poslane od klienta
  40.       c = client.read(); //nacitaj jeden znak z tychto dat
  41.       if (c != '\n') buffer += c; //ak to nie je znak konca riadku, pridaj ho do buffra
  42.       else { //ak to je znak konca riadku
  43.         if (buffer.indexOf('\r') == 0) { //zisti, ci pred tym prijaty znak \r v buffri je na prvom mieste (index 0), teda ci je to koniec requestu
  44.           //Serial.println(FreeRam());
  45.           File dataFile = SD.open(fileName); //otvor subor na citanie
  46.           if (dataFile) { // ak sa ho podarilo otvorit
  47.             client.println(F("HTTP/1.1 200 OK")); //posli HTTP response
  48.             client.println(F("Content-Type: text/html"));
  49.             client.println(F("Connection: close"));
  50.             client.println();
  51.             while (dataFile.available()) { //pokial nenarazis na koniec suboru
  52.               client.write(dataFile.read());  //posielaj znaky zo suboru na vystup
  53.             }
  54.             dataFile.close(); //po dokonceni zavri subor
  55.             client.stop(); // ukonci spojenie
  56.           }
  57.           else { //ak subor nebolo mozne otvorit
  58.             Serial.print("error opening file: ");
  59.             Serial.println(fileName);
  60.  
  61.             client.println(F("HTTP/1.1 404 Not Found")); //posli HTTP response
  62.             client.println(F("Content-Type: text/html"));
  63.             client.println(F("Connection: close"));
  64.             client.println();
  65.  
  66.             client.println(F("<!DOCTYPE HTML>"));
  67.             client.println(F("<html>"));
  68.             client.println(F("<head>"));
  69.             client.println(F("<meta charset=\"UTF-8\">"));
  70.             client.println(F("<title>Ovl&aacute;danie LED</title>"));
  71.             client.println(F("</head>"));
  72.  
  73.             client.println(F("<body>"));
  74.             client.println(F(" <h1>Po&zcaron;adovan&aacute; str&aacute;nka "));
  75.             client.println(fileName);
  76.             client.println(F(" sa na serveri nenach&aacute;dza</h1>"));
  77.             client.println(F("</body>"));
  78.             client.println(F("</html>"));
  79.  
  80.             client.stop();
  81.           }
  82.         }
  83.         if (buffer.startsWith("GET")) {
  84.           fileName=getFileName(buffer); //inak vrátime meno súboru
  85.         }
  86.         buffer = "";
  87.       }
  88.     }
  89.   }
  90. }
  91.  
  92.  
  93. String getFileName(String request) {
  94.   int start = request.indexOf("/"); //nájdeme prvé lomítko v requeste (GET /xyz.htm HTTP/1.1) a uložíme si ho ako štart pozíciu
  95.   int finish = request.indexOf("?", start); //ak je to request s premennými, nájdeme si ?, čo bude značiť koniec mena súboru
  96.   if (finish == -1) { //ak sa tam otáznik nenachádzal tak je to request bez premenných
  97.     finish = request.indexOf("HTTP"); //a tým pádom hľadáme koniec requestu (HTTP)
  98.     finish--; //keďže pred HTTP je medzera, odčítame jeden znak
  99.   }
  100.   if (finish-start-1==0) return String("index.htm"); //ak bol request prázdny (t.j. niekto zadal len IP resp. doménové meno arduina) tak vrátime ako názov index.htm
  101.   else return request.substring(start + 1, finish); //inak vrátime meno súboru
  102. }
Advertisement
Add Comment
Please, Sign In to add comment