String/Array auflösen bei Webabfrage

plaubel:
@jurs: wenn ich die ersten Stellen als "substring" ausgeben lasse, kommt irgendwas mit "HTTP/1.1.0 OK" oder so ein Kram, der mir gar keinen Sinn ergibt.
Ich würde den genauen Text ja gerne posten, aber aus irgendeinem Grunde bekomme ich grade "DNS failed" die letzten 15 Minuten, vorhin lief es wunderbar :~

Das HTTP/1.1.0 OK ergibt schon Sinn, denn das ist die Antwort des Webservers (HTTP-Response Header) Theoretisch muss danach noch eine "200" kommen.
Der Header ist von der eigentlichen Antwort (HTML-Ausgabe z.B.) durch 2 Zeilenumbrüche getrennt. Die Headerzeilen ansich sind nur jeweils durch einen Zeilenumbruch getrennt.
So wie ich die ENC28J60 Lib verstanden habe, sollte eigentlich der Wert "off" genau das Offset sein, das auf das Ende des header und den Anfang der eigentlichen Antwortdaten verweist. Daher auch das
String schalter = ((const char*) Ethernet::buffer + off);
Damit sollte der String eigentlich am Anfang der Nutzdaten anfangen.
Ich würde das String auch weglassen und stattdessen ein

const char* result = Ethernet::buffer + off;

machen. Damit hast Du einen C-String (readonly) der auf den gleichen Daten des Buffers arbeitet und keinen zusätzlichen Speicher verbraucht. Mit einem kleinen Trick kann man z.B. das Zeichen "$" vor die Zahl in der Textdatei schreiben und dann nach diesem Zeichen suchen, das kommt nämlich im Header nicht vor, falls das "off" doch "daneben" liegt.
Anschliessend kopiert man sich die nächsten 6 Zeichen.

static void my_callback (byte status, word off, word len){

//definiere 2 C-String mit 3 Zeichen (4. wird für \0 benötigt)
char val1[4] = "";
char val2[4] = "";


//result holen
const char* result = (const char*) Ethernet::buffer + off;

int index = 0;

//laufe solange durch result bis entweder "ende" oder zeichen '

Das wäre ein Ansatz ohne die String-Klasse.
Achtung, Code ist ungetestet, da ich weder die Lib noch ein ENC28J60 habe.

Mario. gefunden
while( result[index++] != '


Das wäre ein Ansatz ohne die String-Klasse. 
Achtung, Code ist ungetestet, da ich weder die Lib noch ein ENC28J60 habe.

Mario. && index < (len - off);
 
//wenn  noch nicht ende
if(index < (len - off)) {

  //ersten wert (3 zeichen aus result) in val1 stecken und \0-Terminierung anhängen
   val1[0] = result[index++];
   val1[1] = result[index++];
   val2[2] = result[index++];
   val1[3] = 0;

  //zweiten wert (nächste 3 zeichen aus result) in val2 stecken und \0-Terminierung anhängen
   val2[0] = result[index++];
   val2[1] = result[index++];
   val2[2] = result[index++];
   val2[3] = 0;

}

 //jetzt C-String vergleichen
 //ACHTUNG !strcmp ist richtig, da bei gleicheit 0 (unde damit eigntlich false) geliefert wird

 if (!strcmp(val1,"000")) {
   digitalWrite(2, LOW); 
 }

  
  if (!strcmp(val1,"999")) {
  digitalWrite(2, HIGH); 
 } 
  
 
//jetzt das Ganze für den 2. wert

  if (!strcmp(val2,"000")) {
    digitalWrite(3, LOW); 
  }
  
  if (!strcmp(val2, "999")) {
    digitalWrite(3, HIGH); 
  }
}

Das wäre ein Ansatz ohne die String-Klasse.
Achtung, Code ist ungetestet, da ich weder die Lib noch ein ENC28J60 habe.

Mario.