Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发送用户和密码时出现问题(HTTP登录)_Http_Arduino_Arduino Uno - Fatal编程技术网

发送用户和密码时出现问题(HTTP登录)

发送用户和密码时出现问题(HTTP登录),http,arduino,arduino-uno,Http,Arduino,Arduino Uno,我试图在输入Arduino板的IP地址时,打开一个登录屏幕,如果输入了正确的信息,则显示SD卡中的文件。关于这一点,我在这里问了两次问题,但都没有得到很好的回应。经过几次尝试,到目前为止,我取得的成绩是离开登录屏幕,但是。。。奇怪的事情发生了:如果插入micro SD卡,登录就不起作用 守则: #include <SPI.h> #include <Ethernet.h> #include <SD.h> byte mac[] = { 0xDE, 0xAD,

我试图在输入Arduino板的IP地址时,打开一个登录屏幕,如果输入了正确的信息,则显示SD卡中的文件。关于这一点,我在这里问了两次问题,但都没有得到很好的回应。经过几次尝试,到目前为止,我取得的成绩是离开登录屏幕,但是。。。奇怪的事情发生了:如果插入micro SD卡,登录就不起作用

守则:

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

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 117);
EthernetServer server(80);
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

#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);
}

struct Millis{
    unsigned long offset = 0;
    unsigned long get(){return millis() - offset;}
    void reset(){offset = millis();}
    void set(unsigned long value){offset - millis() - value;}
};


void setup() {
  Serial.begin(9600);
  pinMode( 8, OUTPUT );                   
  digitalWrite( 9, HIGH );
  if( !card.init( SPI_HALF_SPEED, 4 ) ) error( "card.init failed!" );
  if( !volume.init( &card ) ) error( "vol.init failed!" );
  if( !root.openRoot( &volume ) ) error( "openRoot failed" );
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


#define BUFSIZ 100
Millis lol;

void loop()
{
  char clientline[BUFSIZ];
  int index = 0;
  LEDCunt();
  EthernetClient client = server.available();
  if (client) {
    boolean current_line_is_blank = true;
    boolean activo = false;
    index = 0;

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

        while(!activo){
           activo = login();
        }

        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          //Se comprueba si el tamaño del Buffer es demasiado grande
          if (index >= BUFSIZ) 
            index = BUFSIZ -1;

          //Si no es grande, se continua normalmente el codigo
          continue;
        }

        // Si esta linea se cumple, significa que ya salio el bucle de la condicion anterior.
        // Osea.... ya se encontro el espacio en blanco final (\n,\t)
        clientline[index] = 0;

        // Insertamos el array para proseguir con la solicitacion de directorios de la tarjeta SD (ROOT)
        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();
          client.println("<h2>Archivos:</h2>");
          //Listamos archivos
          ListFiles(client, 0);
        } else if (strstr (clientline, "GET /") != 0) {

          char *filename;

          filename = clientline + 5; 

          //Limpiamos el array igualando elementos a 0
          (strstr (clientline, " HTTP"))[0] = 0;

          // Cuando demos click al archivo que vamos abrir, imprime el nombre por consola.
          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) {
              client.print((char)c);
          }
          file.close();
        } else {
          //Si no encuentra el archivo o no puede abrirlo
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>File Not Found!</h2>");
        }
        break;
      }
    }
    delay(1);
    client.stop();
  }
}

boolean login(){
  int bufferSize;
  char header[300];
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if(bufferSize < 75) header[bufferSize++] = c;


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

          //'arduino:admin' (user:password) encriptado base64

          Serial.println(header);

          if(strstr(header, "YXJkdWlubzphZG1pbg==") != NULL) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close"); 

            client.println();
            if(strstr(header, "GET / HTTP/1.1")) {
              return true;
            } else {
              return false;
            }

          } else {
            client.println("HTTP/1.1 401 Unauthorized");
            client.println("WWW-Authenticate: Basic realm=YXJkdWlubzphZG1pbg==");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<html>¿Quien eres?</html>"); 
            return false;                    
          }

          bufferSize = 0;
          StrClear(header, 300);

          break;

        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("Login terminado");
  }
}

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

void ListFiles(EthernetClient client, uint8_t flags) {
  dir_t p;

  root.rewind();
  client.println("<ul>");
  while (root.readDir(p) > 0) {

    if (p.name[0] == DIR_NAME_FREE) break;

    // omite entradas (archivos) eliminadas
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;

    // enlista subdirectorios y archivos(solamente)
    if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;

    // imprime espacios en blanco para extension del archivo
    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("\">");

    // imprime el nombre del archivo
    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('/');
    }

    // imprime la fecha de ultima modificacion si se solicita
    if (flags & LS_DATE) {
       root.printFatDate(p.lastWriteDate);
       client.print(' ');
       root.printFatTime(p.lastWriteTime);
    }
    // imprime el tamaño del archivo si se solicita
    if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {
      client.print(' ');
      client.print(p.fileSize);
    }
    client.println("</li>");
  }
  client.println("</ul>");
}

void LEDCunt(){
  if(lol.get() < 700){
    digitalWrite(9,HIGH);
  }
  if(lol.get() > 700){
    digitalWrite(9,LOW);
  }
  if(lol.get() == 1400){
    lol.reset();
  }
}
在这里,我分享一个关于发生了什么的捕获。如果我取出SD卡,运行代码,我甚至不会离开登录屏幕,因为主板会检测到没有插入SD卡

出于某种原因,如果插入卡,它会抛出这些奇怪的象形文字,而不会抛出由base64加密的用户和密码

这里到底发生了什么?以太网卡使用的引脚有任何问题吗?我该怎么办

编辑:我的意思就是这部分

    Authorization:ÀéÊ?®¿Þ-¦Û’õUÞ>jß¿<úgÓzüýMömûÓÚà[Þ·3|i½X9}’u¿ÛöæÛº>tkÿKùN©þ›7ê:úñ¾½íØqÛ‡tÔ¯ï§NÞZÌ?óÔûwóÿ_`û쾈׽‡è¿ïãVû÷«è?-žÏÚzÚ7qÕÿ­ëö[·[ùúxÓ®_Õι÷ÖÝuOÝ{MÝö³S§qÉ÷ü~Ÿþê÷ú¸Ûˆ­ÿlÿ8:míï_m!ﯻÎ÷«ú]<®:Ÿ÷ý>Ÿ®]f›·þÌá\]Ü;Ê­¶ïéÿòÚ;Wû¿˜´B]¹è¶¬µvs}ú~ù¯šWÒ¡¯¸Ç›ÛGë¾Êõ_~î

它应该打印:YXJkdWlubzphZG1pbg=

奇怪的象形文字是Base64编码,解码为十六进制61726475696E6F3A61646D696E,ASCII为:arduino:admin


是时候深入研究编码了,包括ASCII、haxadecimal、,《p>但在抓捕中出来的不是加密的Bas64的红圈的加密Bas64的红圈的加密Bas64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64的基础64和unicode。p>但是在抓捕中出来的不是加密的不是加密的基础64的红圈的基础64的基础64的,在授权之后的授权:什么是授权:什么是什么?是什么?授权是什么?授权?授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:授权:托托托托托霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍托托托托托托托托托托托托托霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍霍7ÚZÚ7qࡗÿö[·[249现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场“WÒ¸ÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒ210。它可能是加密的数据。Base64是一种编码,不是加密,编码不需要密钥来解码,加密不需要密钥来解密。Base64通常用于将二进制数据编码为可打印字符。您永远不会以null结尾标题字符串。