void loop() {
listenForClient();
}*/
}
void listenForClient() {
EthernetClient client = server.available(); // espera a que haya datos disponilbles
boolean currentLineIsBlank = true, flag = true;
bufferSize = 0;
if ( client ) {
while (client.connected()) {
while (client.available()) {
char c = client.read(); // Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
while(client.available()) { // Datos si es un POST
c = client.read();
bufferData[bufferSize++] = c;
}
bufferData[bufferSize] = 0; //Serial.println(bufferData);
client.println("HTTP/1.1 200 OK");
client.println();
createRequest(bufferData);
client.flush();
client.stop();
}
else if (c == '\n') { // NEW LINE
if (flag) {
flag = false;
currentLineIsBlank = true;
buffer[bufferSize] = 0; // no me pinta salto de linea si bufferSize+1
bufferSize = 0; // Serial.println(buffer);
if ( strstr(buffer, "GET / HTTP/1.1") ) {
filePrint("SRV.txt", client);
client.flush();
client.stop();
}
else
if ( strstr(buffer, "GET /fioList HTTP/1.1") ){
sendGetResponse(client);
client.flush();
client.stop();
}
else
if ( !strstr(buffer, "POST /changes HTTP/1.1") ) {
client.flush();
client.stop();
}
}
}
else if (c != '\r') { // caracter de la misma linea
currentLineIsBlank = false;
if ( (bufferSize < bufferMax) && flag )
buffer[bufferSize++] = c;
}
} // client.available
} // client.connected
} // end if
} // endListenForClient
// Petición recibida del tipo: "GET /192.168.112.31/fio HTTP/1.1"
void sendGetResponse(EthernetClient client) {
client.println("HTTP/1.1 200 OK\nContent-Type: application/json\nConnection: close");
client.println();
client.print("{\"fioList\":[\"asynchronus\":\"");
client.print(asynchronusCoord);
client.print("\",\"sleepCycle\":\"");
client.print(sleepCycleCoord);
client.print("\"},");
for (int k = 0; k < fioNumber; k++) {
char filename[9];
sprintf (filename, "F%d.JS", fioList[k]); // si Fx.js guardado en la microSd como Fx.JS
filePrint(filename, client);
if ( (k+1) != fioNumber)
client.println(",");
}
client.println("]}");
}
// fuente: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295739118
void filePrint (char filename[10], EthernetClient client){
if ((myFile = SD.open(filename, FILE_READ))) {
while ( myFile.available() )
client.print( (char) myFile.read() );
myFile.close(); // CERRAR FICHERO
}
}
void generateJson (uint8_t address, uint8_t temperature, uint8_t humidity, uint8_t sleepCycle, uint8_t asynchronus, uint8_t uid[]) {
char filename[9];
sprintf (filename, "F%d.JS", address); // String jsonString; Usando string no lo escribe correctamente
if ( SD.exists(filename) ) // Si ya existía lo borra
SD.remove(filename);
// CREACION FICHERO
if ((myFile = SD.open(filename, FILE_WRITE))) { // si esta abierto ...
myFile.print("{\"name\":\"fio");
myFile.print( address, DEC);
myFile.print("\",\"address\":\"");
myFile.print(address, DEC);
myFile.print("\",\"temperature\":\"");
myFile.print(temperature, DEC);
myFile.print("\",\"humidity\":\"");
myFile.print(humidity, DEC);
myFile.print("\",\"asynchronus\":\"");
myFile.print(asynchronus, DEC);
myFile.print("\",\"sleepCycle\":\"");
myFile.print(sleepCycle, DEC);
myFile.print("\",\"uid\":\"");
for ( int k = 0; k < 4; k++ )
myFile.print(uid[k], HEX);
myFile.print("\"}");
myFile.close(); // CERRAR FICHERO
}
}
void createRequest(char buffer[]) {
uint8_t frameId = millis()*0x00FF;
char *param, *equal, sleepCycle[3], asynchronus[2];
sleepCycle[0] = 0;
asynchronus[0] = 0;
//sleepCycle=20&asynchronus=0
equal = strstr(buffer, "=") + 1;
param = strstr(equal, "&");
strncat(sleepCycle, equal, param-equal); //sleepCycle
equal = strstr(param, "=") + 1;
strncat(asynchronus, equal, 1); //asynchronus
//Serial.print(atoi(sleepCycle)); Serial.print(atoi(asynchronus));
uint8_t data[] = {CONFIGURATION, 2, atoi(sleepCycle), atoi(asynchronus)}; // Configuration request: [0,2,SLEEP_CYCLE,ASYNCHRONUS]
uint8_t length = sizeof(data);
/*
if ( sendRequest( data, length, frameId) == false ) {
saveRequest(data, length, frameId);
flag2 = true; // al no ser enviada se levanta la bandera de pendientes
}
else { // se consiguió enviar
sleepCycleCoord = atoi(sleepCycle);
asynchronusCoord = atoi(asynchronus);
if (flag1 == true){ // solo vale true la primera vez que se envía el cambio de ciclo.
flag1 == false;
time1 = millis(); // time 1 toma su primer valor
}
}*/
}
void saveRequest(uint8_t data[], uint8_t length, uint8_t frameId) {
uint8_t k = 0;
char filename[9];
sprintf (filename, "%d.txt", 1);
SD.remove(filename); // borrar la anterior
// CREACION FICHERO
if ((myFile = SD.open(filename, FILE_WRITE))) { // si esta abierto ...
myFile.print(frameId, HEX);
while (k < length) {
myFile.println(data[k], HEX);
k++;
}
myFile.close(); // CERRAR FICHERO
}
}
void sendPendingRequest() {
uint8_t frameId, address, k = 0, data[] = {};
char filename[9];
sprintf (filename, "%d.txt", 1);
if ( SD.exists(filename) ) {
if ((myFile = SD.open(filename))) { // ABRIR FICHERO
frameId = myFile.read();
while ( myFile.available() ){
data[k] = myFile.read();
k++;
}
myFile.close(); // CERRAR FICHERO
/* if ( sendRequest( data, sizeof(data), frameId ) == true ){
flag2 = false; // baja la bandera de pendientes
SD.remove(filename);
}*/
} // myFile
} // SD.exists(filename)
} // sendPendingRequest