2017-09-10 50 views
-1

我有读取切换状态并将其显示在网页上的代码。该网页存储在以太网屏蔽的SD卡上。将托管在Arduino上的Web服务器移动到本地服务器

但现在我把它移到另一个区域。我想使用相同的原理,但我想在本地计算机的XAMPP服务器上使用它,而不是存储在SD卡上的网页。我需要做些什么改变?请建议。

的Arduino代码:

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

// size of buffer used to capture HTTP requests 
#define REQ_BUF_SZ 50 

// MAC address from Ethernet shield sticker under board 
byte mac[] = { 
    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED 
}; 
IPAddress ip(192, 168, 0, 20); // IP address, may need to change depending on network 
EthernetServer server(80); // create a server at port 80 
File webFile; // the web page file on the SD card 
char HTTP_req[REQ_BUF_SZ] = { 
    0}; // buffered HTTP request stored as null terminated string 
char req_index = 0; // index into HTTP_req buffer 

void setup() { 
// disable Ethernet chip 
    pinMode(10, OUTPUT); 
    digitalWrite(10, HIGH); 
    Serial.begin(9600); // for debugging 
// initialize SD card 
    Serial.println("Initializing SD card..."); 
    if (!SD.begin(4)) { 
    Serial.println("ERROR - SD card initialization failed!"); 
    return; // init failed 
    } 
    Serial.println("SUCCESS - SD card initialized."); 
    // check for index.htm file 
    if (!SD.exists("index.htm")) { 
    Serial.println("ERROR - Can't find index.htm file!"); 
    return; // can't find index file 
    } 
    Serial.println("SUCCESS - Found index.htm file."); 
    pinMode(7, INPUT); // switch is attached to Arduino pin 7 
    pinMode(8, INPUT); // switch is attached to Arduino pin 8 
    Ethernet.begin(mac, ip); // initialize Ethernet device 
    server.begin(); // start to listen for clients 
} 

void loop() { 
    EthernetClient client = server.available(); // try to get client 
    if (client) { // got client? 
    boolean currentLineIsBlank = true; 
    while (client.connected()) { 
     if (client.available()) { // client data available to read 
     char c = client.read(); // read 1 byte (character) from client 
     // buffer first part of HTTP request in HTTP_req array (string) 
     // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1) 
     if (req_index < (REQ_BUF_SZ - 1)) { 
      HTTP_req[req_index] = c; // save HTTP request character 
      req_index++; 
     } 
     // last line of client request is blank and ends with \n 
     // respond to client only after last line received 
     if (c == '\n' && currentLineIsBlank) { 
      // send a standard http response header 
      client.println("HTTP/1.1 200 OK"); 
      // remainder of header follows below, depending on if 
      // web page or XML page is requested 
      // Ajax request - send XML file 
      if (StrContains(HTTP_req, "ajax_inputs")) { 
      // send rest of HTTP header 
      client.println("Content-Type: text/xml"); 
      client.println("Connection: keep-alive"); 
      client.println(); 
      // send XML file containing input states 
      XML_response(client); 
      } else { 
      // web page request 
      // send rest of HTTP header 
      client.println("Content-Type: text/html"); 
      client.println("Connection: keep-alive"); 
      client.println(); 
      // send web page 
      webFile = SD.open("index.htm"); // open web page file 
      if (webFile) { 
       while(webFile.available()) { 
       client.write(webFile.read()); // send web page to client 
       } 
       webFile.close(); 
      } 
      } 
      // display received HTTP request on serial port 
      Serial.print(HTTP_req); 
      // reset buffer index and all buffer elements to 0 
      req_index = 0; 
      StrClear(HTTP_req, REQ_BUF_SZ); 
      break; 
     } 
     // every line of text received from the client ends with \r\n 
     if (c == '\n') { 
      // last character on line of received text 
      // starting new line with next character read 
      currentLineIsBlank = true; 
     } else if (c != '\r') { 
      // a text character was received from client 
      currentLineIsBlank = false; 
     } 
     } // end if (client.available()) 
    } // end while (client.connected()) 
    delay(1); // give the web browser time to receive the data 
    client.stop(); // close the connection 
    } // end if (client) 
} 

// send the XML file with switch statuses and analog value 
void XML_response(EthernetClient cl) { 
    int analog_val; 
    cl.print("<?xml version = \"1.0\" ?>"); 
    cl.print("<inputs>"); 
    cl.print("<button1>"); 
    if (digitalRead(7)) { 
    cl.print("ON"); 
    } else { 
    cl.print("OFF"); 
    } 
    cl.print("</button1>"); 
    cl.print("<button2>"); 
    if (digitalRead(8)) { 
    cl.print("ON"); 
    } else { 
    cl.print("OFF"); 
    } 
    cl.print("</button2>"); // read analog pin A2 
    analog_val = analogRead(2); 
    cl.print("<analog1>"); 
    cl.print(analog_val); 
    cl.print("</analog1>"); 
    cl.print("</inputs>"); 
} 

// 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; 
    } 
} 

// searches for the string sfind in the string str 
// returns 1 if string found 
// returns 0 if string not found 
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++; 
    } 
    return 0; 
} 

SD卡的网页:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Arduino SD Card Web Page using Ajax with XML</title> 
    <script> 
    function GetArduinoInputs() { 
     nocache = "&nocache=" + Math.random() * 1000000; 
     var request = new XMLHttpRequest(); 
     request.onreadystatechange = function() { 
     if (this.readyState == 4) { 
      if (this.status == 200) { 
      if (this.responseXML != null) { 
       // extract XML data from XML file (containing switch states and analog value) 
       document.getElementById("input1").innerHTML = 
       this.responseXML.getElementsByTagName('button1')[0].childNodes[0].nodeValue; 
       document.getElementById("input2").innerHTML = 
       this.responseXML.getElementsByTagName('button2')[0].childNodes[0].nodeValue; 
       document.getElementById("input3").innerHTML = 
       this.responseXML.getElementsByTagName('analog1')[0].childNodes[0].nodeValue; 
      } 
      } 
     } 
     } 
     request.open("GET", "ajax_inputs" + nocache, true); 
     request.send(null); 
     setTimeout('GetArduinoInputs()', 1000); 
    } 
    </script> 
    </head> 
    <body onload="GetArduinoInputs()"> 
    <h1>Arduino Inputs from SD Card Web Page using Ajax with XML</h1> 
    <p>Button 1 (pin 7): <span id="input1">...</span></p> 
    <p>Button 2 (pin 8): <span id="input2">...</span></p> 
    <p>Analog (A2): <span id="input3">...</span></p> 
    </body> 
</html> 

回答

1

你的程序太大,了解其逻辑未免太强硬。但从你的问题来看,你的需求非常明确。所以我可以引导你朝着正确的方向前进。您可以使用this

这里是你应该做的:

  • 首先需要主办的网站在本地主机上,使用PHP来服务它的后端。创建一个php代码并将其链接到您的网站,以这种方式,当您从arduino请求php页面时,它应该反过来加载网页。基本结构:

    <?php 
    
    // Connection information 
    $servername = "localhost"; 
    
    
    
    $username = "root"; 
    $password = ""; 
    $dbname = "arduinotest"; 
    
    // Create connection 
    $conn = new mysqli($servername, $username, $password, $dbname); 
    
    // SQL query 
    $sql = "INSERT INTO testdata (myTime) VALUES ('".$_GET["value"]."')"; 
    
    // Execute query 
    $conn->query($sql); 
    
    // Close connection 
    $conn->close(); 
    ?> 
    
  • 然后修改以这样一种方式,你可以要求这个PHP页面这是你的本地计算机上的Arduino的代码。这一基本结构是:

    #include <SPI.h> 
    #include <Ethernet.h> 
    
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
    
    IPAddress ip(192,168,0,10); 
    IPAddress server(192,168,0,4); 
    
    EthernetClient client; 
    
    int data = 10; 
    
    void setup() { 
    
    Serial.begin(9600); 
    Ethernet.begin(mac, ip); 
    } 
    
    void loop() { 
    
    if (client.connect(server, 80)) { 
    Serial.println("Connected successfully\n"); 
    
    // Print for debugging 
    Serial.print("GET /dbTest.php?"); 
    Serial.print("value="); 
    Serial.print(data); 
    Serial.println(" HTTP/1.1"); 
    Serial.print("Host: "); 
    Serial.println(server); 
    Serial.println("Connection: close"); 
    
    client.print("GET /dbTest.php?"); 
    client.print("value="); 
    client.print(data); 
    client.println(" HTTP/1.1"); 
    client.print("Host: "); 
    client.println(server); 
    client.println("Connection: close"); 
    client.println(); 
    client.println(); 
    client.stop(); 
    } 
    
        else { 
        Serial.println("Connection failed\n"); 
        } 
    
    delay(30000); 
    } 
    

video link将是有益的。

+0

通常我需要,当一个开关按连接到arduino。显示在网页上(开关-1,开关-2是开/关的),当开关按下时,实时日期和时间保存在数据库中。感谢 – user6905616

+0

好的。那么你可以使用我上面所说的,如果我的回答很有用,接受并赞扬 – Billa

相关问题