Prikaz jedne poruke
Stara 22.1.2019, 3:48   #4
Luka Filipovic
Starosedelac
 
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
Određen forumom Re: IoT termostat (Arduino + ESP-01)

Kod:
  void sendHtml() {   
  havePass = goodPass = false;  
    if (haveText("points=")) {
      havePass = true;
      haveText("&");
      temppos  = atoi(reply);
      haveText("psw=");
      getReply(20);
      if (strcmp(reply, pass) == 0) {
        goodPass = true;
        pos = temppos; 
        EEPROM.write(address, pos);
        servo.write(544+80.6956521739*(28-pos));
      }
      espSend("HTTP/1.1 201 Created\r\n");
    }
    else espSend("HTTP/1.1 200 OK\r\n");
    getString(0); if (espSend(buffer) == -1) return;
    delay(50);
    getString(1); if (espSend(buffer) == -1) return;
    getString(2); if (espSend(buffer) == -1) return;
    getString(3); if (espSend(buffer) == -1) return;
    itoa( pos, temp, 10); strcpy(buffer, temp); if (espSend(buffer) == -1) return;
    getString(4); if (espSend(buffer) == -1) return;
    itoa( pos, temp, 10); strcpy(buffer, temp); if (espSend(buffer) == -1) return;
    getString(5); if (espSend(buffer) == -1) return;
    if (havePass && !goodPass) { getString(8) ; if (espSend(buffer) == -1) return; }
    if (havePass && goodPass)  { getString(9) ; if (espSend(buffer) == -1) return; }
    if (!havePass)             { getString(10); if (espSend(buffer) == -1) return; }
    getString(6); if (espSend(buffer) == -1) return;
    getString(7); if (espSend(buffer) == -1) return;
    espSerial.print( "AT+CIPCLOSE=0\r\n" );
    getReply( timeconst );
  }
Prvo se proverava da li je klijent uz request poslao i podatke POST metodom.
Za sad postoje samo dva podatka - pozicija i password.
Ukoliko nalazi da je poslata pozicija, smesta je u temppos sve dok ne potvrdi autenticnost passworda. Ukoliko je ispravan, temppos se smesta u pos, pos u eeprom i servo dobija novu poziciju. Ukoliko nije ispravan password, pomocu dve bool promenljive ce se ispisati greska na web stranici.
Posle toga se samo salju paketi htmla uz poneko ubacivanje vrednosti pozicije koja mora da se konveruje u string da bi mogla da se posalje kao html.

Kod:
  void getAdr(char *adr) {
    char c;
    int i = 0;
    haveText("\"");
    long int time = millis();
    while ( ((time + 1000) > millis()))
    {
      while (espSerial.available()) {
        c = espSerial.read();
        if (c == '\"') return;
        adr[i++] = c;
      }
    }
  }
Funkcija za vadjenje IP i mac adrese iz odgovora ESPa prilikom povezivanja na mrezu. Nije neophodno, moglo je i sa getReply ali bez provere ispravnosti ip adrese.
Kod:
 bool haveText(const char *text) {
    char c;
    int i = 0;
    int j = 0;
    long int time = millis();
    while ( ((time + 1000) > millis())) {
      while (espSerial.available()) {
        c = espSerial.read();
        reply[j % 20] = c;
        j++;
        Serial.print(c);
        if (text[i] == c) i++;
        else {
          if (c == text[1]) i = 1;
          else i = 0;
        }
        if (i == strlen(text)) {
          reply[(j - 1) % 20] = 0;
          return true;
        }
      }
    }
    reply[i % 20] = 0;
    return false;
  }
Funkcija koja pronalazi odredjeni string u porukama ESPa, cim ga pronadje vraca true, ako ga nema vraca false. U medjuvremenu cuva poslednjih 20 karaktera poruke u reply stringu.
Kod:
  int getReply(int wait) {
    bool isEnd = false;
    int i = 0;
    long int time = millis();
    while ( ((time + wait) > millis()) && !isEnd)
    {
      while (espSerial.available()) {
        char c = espSerial.read();
        Serial.print(c);
        reply[i % 20] = c; i++;
        if (reply[(i - 5) % 20] == 'E' && reply[(i - 4) % 20] == 'R' && reply[(i - 3) % 20] == 'R' && reply[(i - 2) % 20] == 'O' && reply[(i - 1) % 20] == 'R') return -1;
        if (reply[(i - 4) % 20] == 'F' && reply[(i - 3) % 20] == 'A' && reply[(i - 2) % 20] == 'I' && reply[(i - 1) % 20] == 'L') return -1;
        if (reply[(i - 2) % 20] == 'O' && reply[(i - 1) % 20] == 'K') {
          isEnd = true;
          break;
        }
      }
      reply[i % 20] = 0;
    }
    Serial.println();
    Serial.println(line);
  }
Prima odredjeno vreme za koje iscitava odgovor ESPa, u medjuvremenu cuva poslednjih 20 karaktera u stringu reply i proverava da li je doslo do greske (fail ili error), ili je doslo do kraja odgovora (OK).
Ako je doslo do greske vraca -1.

Kod:
  int espSend(const char *html) {
    int lenHtml;
    char command[20];
    char temp[5];
 
    lenHtml = strlen( html );
    strcpy(command, "AT+CIPSEND=0,");
    itoa( lenHtml, temp, 10);
    strcat(command, temp);
    strcat(command, "\r\n");
    espSerial.print(command);
    if (getReply( timeconst * 10 ) == -1) return -1;
    espSerial.print(html);
    if (getReply( timeconst * 10 ) == -1) return -1;
  }
Salje html klijentu. Prvo mora da utvrdi duzinu paketa, da je konevrtuje u string i nalepi uz komandu za slanje. Potom sledi string htmla.

Kod:
  void getString(int i) {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i])));
  }
Izvlaci html string iz flash memorije i cuva ga u string buffer
Luka Filipovic je offline   Odgovor sa citatom ove poruke