pagina web su scheda sd

sto giocando con arduino e una pagina web su sd un mini web server
domanda.... ma se io metto la pagina html su sd e voglio usare un css o uno script su file esterno o uno su pagina html sempre nella stessa sd.....funziona?
ma come fa a caricare per esempio un css ......ancora non ho provato ma penso che non la carica dato che per accedere alla sd va fatta una richiesta ad arduino
spero di essermi spiegato
:slight_smile:

dipende dal tuo codice. In generale ti arriva la get esempio

GET / HTTP\1.1
etc...

allora se vedi / invii l'index.html o quel che l'è. a quel punto il browser vede che vi vuole il file.css, allora invia una seconda get:

GET /file.css HTTP\1.1
etc...

quindi a questo punto sta a te elaborare la get per capire che non vuole l'index.html ma la file.css.

so che esistiono dei codici già fatti che gestiscono i file, quindi funzionano esattamente come ci si aspetterebbe, anche per le immagini etc..
però non ne ho visto nessuno che elabora anche le queryString o le POST, anche se non è complesso da fare. Però è anche vero che queste librerie le ho sempre viste di sfuggita e non le ho mai usate

ma senza aspettare la richiesta posso inviare subito dopo il file css, in teoria se lo aspetta ?
ma per quanto riguarda uno script interno all'html che poi punta a un file sempre su sd , sto file lo deve leggere e ricevere ed eseguire prima della fine pagina html
altrimenti la pagina non si popola di niente
esempio una pagina che si popola tramite file xml che viene chiamato da uno script java
come fa :slight_smile:
grazie

no, devi aspettare la sua richiesta.. il browser tenterà di accederein parallelo, arduino non vorrà se non fai le cose fatte in un certo modo, allora il broser salva i vari pezzi in file temporanei, e quando li ha tutti li assembla

Riprendo la discussione.

Ho messo su SD una pagina index.php, con anche le cartelle delle immagini, del css, e degli script js.
Il sketch di Arduino che "carica" la pagina è questo:

  client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          
         htmlFile = SD.open("index.php");
          if (htmlFile) {
            while (htmlFile.available()) {
              client.write(htmlFile.read());
            }

            htmlFile.close();
          }

La pagina viene caricata, ma viene visualizzata nel seguente modo (immagine):
www.morpheus1st.altervista.org/screen.png

Da quello che ho capito, non si riesce ad accedere ai file all'interno dell'SD. Infatti, caricando le immagini su un server, queste vengono visualizzate correttamente nella pagina index.php.

Ci sono soluzioni???
Ci sto sbattendo da 2 giorni. E' un progetto di tesi... :cry:

[EDIT]
infatti, non riesco nemmeno ad accedere ai vari file nel seguente modo: http://10.224.20.251/dati_tot.txt

il php è codice eseguito lato server. ovviamente arduino NON ha un intreprete PHP, ed è abbastzanza impossibile farlo.

o usi linguaggi lato client, come javascrip, o traduci quel php in c e al posto che nalla pagina lo metti nello sketch, sperando di avere abbastanza spazio...

L'uso del php nasce dall'esigenza di dover leggere in dei file .txt, e javascript non può farlo per motivi di sicurezza.
Lo posso scrivere nello sketch, ma ho la necessità che ogni tot secondi deve rileggere i dati in un file...senza refreshare la pagina.

Consigli?

Ho risolto cosi. Un iFrame nascosto e recupero i dati. Non sarà elegante, ma almeno risolvo il vincolo di javascript...senza usare ActiveX..

<!doctype html>  
<head>
<meta charset="UTF-8">
<title>ArduMeter</title>
<script type="text/javascript">
function extract(){
 var theLoader = document.getElementById('loader');
 document.write(theLoader.contentWindow.document.body.innerHTML);
 }

</script>

<body bgcolor="seagreen" onload="extract();">

<iframe id="loader" src="dati_parz.txt" style="display:
none"></iframe>

</body>
</html>

Con javascript puoi fare una get al server e prendere il file, rielaborarlo in modo più complesso e poi iniettarlo nella pagina...

Allora, come ho scritto, tramite javascript sono riuscito a prendere i dati.
Purtroppo, continuo a non riuscire ad utilizzare i file presenti sull'SD necessari per la corretta visualizzazione del sito(ovviamente succede solo se carico sull'Arduino), ad esempio

 <script src="lib/RGraph.common.core.js" ></script>

anche se cambio il path

 <script src="/lib/RGraph.common.core.js" ></script>
<script src="./lib/RGraph.common.core.js" ></script>

Non riesce proprio ad accedervi. Idem per le immagini...

che codice usi lato arduino?

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

#define maxLength 25

File myFile;
File htmlFile;
int num_sd = 4;

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0x38, 0x41 };

IPAddress ip(192,168,1,251);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  pinMode(num_sd, OUTPUT);

  Serial.print("Initializing SD card...");
  if (!SD.begin(num_sd)) 
  {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("done!");


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  delay(4000);
}


void loop() {
  
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
   
//        Serial.write(c);

        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          
         htmlFile = SD.open("index.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
              client.write(htmlFile.read());
            }

            htmlFile.close();
          }
          
          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();
    Serial.println("client disonnected");
  }
}

Sei la mia sola speranza.. considerando che devo presentare il tutto tra meno di 30gg :slight_smile: :frowning:

Questo è quello che fai:

lient.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          
         htmlFile = SD.open("index.htm");

e questo quello che ti ho detto io:

dipende dal tuo codice. In generale ti arriva la get esempio

GET / HTTP\1.1
etc...

allora se vedi / invii l'index.html o quel che l'è. a quel punto il browser vede che vi vuole il file.css, allora invia una seconda get:

GET /file.css HTTP\1.1
etc...

Insomma, tu invece che rispondere con i vari file che il browser/javascript richiede, rispondi solo con index.html.... e ci credo che va in crisi :wink:

Forse ho risolto...e appena fatto, posto tutto :stuck_out_tongue:

Dopo aver sbattuto per molto tempo la testa nel muro =(, e fattomi venire anche la febbre, ho finalmente risolto il problema.
Domani posto il codice, ma vi avviso che è importante accorciare i nome dei file ed evitare anche i caratteri speciali. Ho perso tempo e sonno solo per quest'ultimo motivo. ]:slight_smile: ]:slight_smile: =( =(

bhe i caratteri speciali nopn è una novità.. per i nomi del file il formato fat32 non dovrebbe avere problemi fino a 255 caratteri, ma in realtà potrebbe dare problemi in alcune implementazioni, in tal caso il caro formato della FAT originale è 8.3 (8 di nome, 3 di estensione)