2017-09-10 2 views
-1

J'ai un code qui lit un état de commutateur et l'affiche sur une page Web. La page Web est stockée sur la carte SD du blindage Ethernet. Mais maintenant, je l'ai déplacé à un autre endroit. Je veux utiliser le même principe, mais au lieu d'une page Web stockée sur une carte SD, je le veux sur le serveur XAMPP de l'ordinateur local. Quels sont les changements que je dois faire? Veuillez suggérer.Déplacement d'un serveur Web hébergé sur un serveur Arduino vers un serveur local

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

page de carte 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> 

Répondre

1

Votre programme est trop grand, comprendre sa logique serait trop difficile. Mais à partir de votre question, votre besoin est très clair. Je peux donc vous guider dans la bonne direction.

Vous pouvez également utiliser this.

Voici ce que vous devez faire:

  • Vous devez d'abord héberger le site sur votre hôte local, utiliser PHP pour servir son back-end. Créer un code php et le lier avec votre site Web, de telle sorte que lorsque vous demandez la page php de l'Arduino, il devrait à son tour charger la page Web. Structure de base:

    <?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(); 
    ?> 
    
  • ensuite modifier le code arduino de telle sorte que vous pouvez demander cette page php qui est sur votre machine locale. La structure de base de ce serait:

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

Cette video link serait utile.

+0

Généralement, j'ai besoin, quand un interrupteur presse qui se connecte à Arduino. afficher sur la page Web (commutateur -1, commutateur-2 est allumé/éteint comme) et lorsque l'interrupteur appuyez sur puis la date et l'heure en temps réel enregistrer dans database.thanks – user6905616

+0

Ok. alors vous pouvez utiliser ce que j'ai dit ci-dessus, si mes réponses étaient utiles, accepter et upvote – Billa