Problema parseando string con indexOf y substring.

Hola!

Bueno estoy armando un pequeño webserver para prender y apagar la luz de mi habitación desde donde quiera e hice un código para obtener la url a la que ingresa el cliente…

En el HTTP Request que recibe el servidor una parte se compone por GET /UrlQueIngresa HTTP/1.1 entonces lo que hice fue obtener el string que está entre “GET /” y " HTTP/1.1" para obtener “UrlQueIngresa” con el siguiente código:

/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,200);

// 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);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


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

void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    String GET = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (GET.length() < 256){
          GET = GET+c;
        }
        if (c == '\n' && currentLineIsBlank) {
          int pos1 = GET.indexOf('GET /')+1;
          int pos2 = GET.indexOf('HTTP/1.1')-6;
          Serial.println("POSICION 1: "+String(pos1));
          Serial.println("POSICION 2: "+String(pos2));
          Serial.println("'"+GET.substring(pos1,pos2)+"'");
          client.println("HTTP/1.1 200 OK");
          //client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          //client.println();
          //client.println("<!DOCTYPE HTML>");
          //client.println("<html>");
          //client.println("test");
          //client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

Cuando uso solamente letras, funciona de maravilla. Ahora si pongo 123 por ejemplo sale:

POSICION 1:5
POSICION 2:-1
'123 HTTP/1.1
Host: 192.168.0.200
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Acc'

Y no entiendo por qué…

Y ya que estamos, me acabo de dar cuenta que cuando tengo el código del webserver todos los pines entregan voltaje y tampoco puedo apagarlos con digitalWrite(13, LOW) … alguien tiene idea?

Este code estoy usando, e ingreso con lalala y la función cambiarEstado se llama bien pero no se apaga el led. Si saco el webserver y pongo un código que prenda y apague el pin 13 anda perfecto (incluso con el shield puesto).

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,200);
EthernetServer server(80);

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  digitalWrite(13, LOW);
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    String GET = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (GET.length() < 256){
          GET = GET+c;
        }
        if (c == '\n' && currentLineIsBlank) {
          int pos1 = GET.indexOf('GET /')+1;
          int pos2 = GET.indexOf('HTTP/1.1')-6;
          String data = GET.substring(pos1,pos2);
          if (data == "lalala"){
             cambiarEstado();
          }
          client.println("HTTP/1.1 200 OK");
          //client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          //client.println();
          //client.println("<!DOCTYPE HTML>");
          //client.println("<html>");
          //client.println("test");
          //client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}
bool estado = false;
void cambiarEstado(){
  String shit = estado?"apagado":"prendido";
  Serial.println("Cambiando estado a "+shit);
  digitalWrite(13, !estado?HIGH:LOW);
  estado = !estado;
}