Авторизация на web-сервере

Тема в разделе "Arduino & Shields", создана пользователем Alex007, 1 ноя 2020.

  1. Alex007

    Alex007 Нуб

    Здравствуйте, помогите пожалуйста добавить авторизацию на web-сервере:
    Код (C++):
    #include <dht11.h>
    #include <SPI.h>
    #include <Ethernet.h>
    #include <SD.h>
    #define DHT11_PIN 7
    #define REQ_BUF_SZ 40

    dht11 DHT;
    File webFile;
    char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
    char req_index = 0; // index into HTTP_req buffer
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
    IPAddress ip(192, 168, 1, 10);

    EthernetServer server(80);
    bool pin1;
    bool pin2;
    bool pin3;
    bool pin4;
    int pin5;
    //int button = 8; // объявляем геркон на вход дверь
    void setup() {
      digitalWrite(2, HIGH);  // Подать нулевое напряжение на пин 2
      digitalWrite(3, HIGH);  // Подать нулевое напряжение на пин 3
      digitalWrite(5, HIGH);  // Подать нулевое напряжение на пин 5
      digitalWrite(6, HIGH);  // Подать нулевое напряжение на пин 6
      pinMode(2, OUTPUT); // Реле1
      pinMode(3, OUTPUT); // Реле2
      pinMode(5, OUTPUT); // Реле3
      pinMode(6, OUTPUT); // Реле4
      pinMode(9, OUTPUT); // ШИМ
      pinMode(8, INPUT); // Геркон слушает вход

      SD.begin(4);
      Ethernet.begin(mac, ip);
      server.begin();
      pin1 = pin2 = pin3 = pin4 = 0;
    }



    void loop() {
      // listen for incoming clients /слушать входящих клиентов
      EthernetClient client = server.available();
      if (client) {

        // an http request ends with a blank line /HTTP-запрос заканчивается пустой строкой
        boolean currentLineIsBlank = true;
        while (client.connected()) { //
          if (client.available()) {
            char c = client.read();
            if (req_index < (REQ_BUF_SZ - 1)) {
              HTTP_req[req_index] = c; // save HTTP request character /сохранить символ HTTP-запроса
              req_index++;
            }
            if (c == '\n' && currentLineIsBlank) {
              if (StrContains(HTTP_req, "GET /")) {
                if (StrContains(HTTP_req, "/ ")
                    || StrContains(HTTP_req, "/index.htm")) {
                  sendHtmlFile(client, "index.htm");
                } else if (StrContains(HTTP_req, "/favicon.ico")) {
                  sendFile(client, "favicon.ico");
                } else if (StrContains(HTTP_req, "/temp.png")) {
                  sendFile(client, "temp.png");
                } else if (StrContains(HTTP_req, "/humid.png")) {
                  sendFile(client, "humid.png");
                } else if (StrContains(HTTP_req, "/flame.png")) {
                  sendFile(client, "flame.png");
                } else if (StrContains(HTTP_req, "/my.css")) {
                  sendFile(client, "my.css");
                } else if (StrContains(HTTP_req, "ajax_flame")) {
                  sendBaseAnswer(client);
                  int smoke_gas = 0; //пин на котором подключен MQ-2
                  int sensorReading = analogRead(smoke_gas);
                  int chk;
                  chk = DHT.read(DHT11_PIN);

                  char buff[32];
                  sprintf(buff, "%d:%d:%d:%d:%d:%d:%d:%d:",
                          sensorReading, DHT.temperature, DHT.humidity,
                          digitalRead(2), digitalRead(3), digitalRead(5), digitalRead(6),
                          pin5);
                  client.println(buff);
                } else if (StrContains(HTTP_req, "setpin?")) {
                  if (StrContains(HTTP_req, "pin=1")) {
                    pin1 = !pin1;
                    digitalWrite(2, pin1); // Реле1
                  } else if (StrContains(HTTP_req, "pin=2")) {
                    pin2 = !pin2;
                    digitalWrite(3, pin2); // Реле2
                  } else if (StrContains(HTTP_req, "pin=3")) {
                    pin3 = !pin3;
                    digitalWrite(5, pin3); // Реле3
                  } else if (StrContains(HTTP_req, "pin=4")) {
                    pin4 = !pin4;
                    digitalWrite(6, pin4); // Реле4
                  } else if (StrContains(HTTP_req, "pin=5")) {
                    String input = HTTP_req;
                    int posStart = input.indexOf("value=");
                    int posEnd = input.indexOf(' ', posStart);
                    String param = input.substring(posStart + 6, posEnd + 1);
                    pin5 = param.toInt();
                    analogWrite(9, pin5=255-pin5); //для изменения стороны ползунка место pin5 поставил pin5=255-pin5
                  }
                  sendBaseAnswer(client);
                }
              }
              req_index = 0;
              StrClear(HTTP_req, REQ_BUF_SZ);
              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();
      }
    }
    bool sendHtmlFile(EthernetClient client, char *fileName) {
      webFile = SD.open(fileName);
      sendBaseAnswer(client);
      return sendFile(client, webFile);
    }
    bool sendFile(EthernetClient client, char *fileName) {
      webFile = SD.open(fileName);
      sendHttpOkAnswer(client);
      client.println();
      return sendFile(client, webFile);
    }
    bool sendFile(EthernetClient client, File &webFile) {
      if (webFile) {
        while (webFile.available())
          client.write(webFile.read()); // send web page to client /отправить веб-страницу клиенту
        webFile.close();
        return 1;
      }
      return 0;
    }
    void sendBaseAnswer(EthernetClient client) {
      sendHttpOkAnswer(client);
      client.println(F("Content-Type: text/html"));
      client.println(F("Connection: close"));
      client.println();
    }
    void sendHttpOkAnswer(EthernetClient client) {
      client.println(F("HTTP/1.1 200 OK"));
    }

    void StrClear(char *str, char length) {
      for (int i = 0; i < length; i++) {
        str[i] = 0;
      }
    }

    char StrContains(char *str, char *sfind) {
      char found = 0;
      char index = 0;
      char len;
      len = strlen(str);
      if (strlen(sfind) > len) {
        return 0;
      }
      while (index < len) {
        if (str[index] == sfind[found]) {
          found++;
          if (strlen(sfind) == found) {
            return 1;
          }
        }
        else {
          found = 0;
        }
        index++;
      }
    //управление реле 2 с пина 8
    //если пин 8 на Graur - реле2 выключено, если на +5v - реле2 включено
    {
    if (digitalRead(8) == LOW) { // LOW проверка входа геркона
    digitalWrite(3, HIGH); // включаем светодиод на пине 9 при открытие двери
    }
    else if (digitalRead(8) == HIGH) { // HIGH проверка входа кнопки
    digitalWrite(3, LOW); // выключаем светодиод на пине 9 при закрытие двери
    }
    }
    //конец управленя реле 2 с пина 8
      return 0;
    }