Leggere dati da pagina WEB

Ciao a tutti … sto impazzendo dietro un problema che non riesco a risolvere…

Utilizzo un Arduino con una SHIELD GSM/GPRS ( SIM900 ) ed ho realizzato un semplice CLIENT

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"


InetGSM inet;
char msg[50];
char inSerial[50];
int i=0;
boolean started=false;

void setup() 
{
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  
  
  if(started){
    if (inet.attachGPRS("internet.wind", "", ""))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
    
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    gsm.WhileSimpleRead();
  
    inet.httpGET("www.maxiphone.it", 80, "/stato.php", msg, 50);
      
  }
  
   
};

void loop() 
{
  gsm.SimpleRead();
  
};

Tutto OK , a video ottengo :

GSShield testing.
GSM Shield testing.

status=READY
status=ATTACHED

10.16.209.124
HTTP/1.1 200 OK
Date: Sat, 28 Sep 2013 09:50:57 GMT
Server: Apache
X-Powered-By: PleskLin
Connection: close
Content-Type: text/html

10
CLOSED

Ora il mio problema e che ho bisogno di attivare 2 LED in base al valore letto dalla pagina PHP come di seguito :

10 → LED1ON , LED2OFF
11 → LED1ON , LED2ON
01 → LED1OFF , LED2ON
00 → LED1OFF , LED2OFF

ma non riesco a creare una STRINGA che contiene il valore letto per poterlo utilizzare :frowning:

La richiesta viene fatta alla classe SIM900.h nella parte di codice

void SIMCOM900::SimpleRead()
{
    
    
	char datain;
	if(_cell.available()>0){
		datain=_cell.read();
		if(datain>0){
			Serial.print(datain);
		}
	}
    
}

che lo stampa solo a video…

Ormai e troppo tempo che ci sto provando , non conosco bene il C , qualcuno potrebbe darmi una dritta ?

Grazie 1000 a tutta la comunity

Ipotizziamo che nel pacchetto che manda il php ci sia "blala=bla?server#pins=10?=ready=eccetera@eccetera" 2 a te interessa solo il "pins=10"
il tuo programma php dovrà spedire #pins=10
Hai 2 soluzioni;

1)o ti concateni tutti i char in una stringa e poi ti vai a cercare "pins=" leggendo poi i 2 caratteri che vengono dopo, ma se il pacchetto è troppo lungo quella stringa satura la ram e si inchioda il micro

2)scorrendo un carattere alla volta come già stai facendo, cerchi il carattere # dicendo al programma "attenzione dopo il # potrebbe esserci il comando che mi serve .... ma potrebbe anche non esserci, quindi ti salvi in una stringa i 7 caratteri che vengono dopo il # e vai a vedere se in quella stringa c'è pins= .... se è presente ti prendi l'ultimo e il penultimo carattere della tua nuova stringa.

lavorando con i char singoli e poca memoria non c'è molta scelta.

ciao

Il mio problema e che quello che stampa a video non riesco a trasformarlo in una stringa da poter elaborare !!!!

Non è mio solito ma ... potresti farmi un esempio ???

Grazie ancora

per farti un esempio dovrei sapere come è fatto il pacchetto che ricevi, è quello che hai messo nel primo post?
se le linee sono così corte si può pensare di cercare lo '\n' e analizzare le 8-9 righe

Si il pacchetto che ricevo e solo quello , tolto l'intestazione della pagina quello che a me serve e solo il numero 10 finale

Il problema e che la funzione lo stampa nel monitor , non riesco ad utilizzarlo per compararlo con ciò che serve a me

Ho preso lo steck che trovi negli esempi chiamato GSM_GPRSLibrary_Client e gli ho semplicemente aggiunto il controllo del testo ricevuto…

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to start a connection as client.

InetGSM inet;
//CallGSM call;
//SMSGSM sms;

char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;



void setup() 
{

  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.wind", "", ""))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
    
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();
  
    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpGET("www.maxiphone.it", 80, "/stato.php", msg, 50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);  
    Serial.println("\nData received:"); 
    Serial.println(msg); 
    
    
    [color=red]// ricerca all'interno del messaggio le stringhe
    String miastringa;
    miastringa = String(msg);
    int cerca1 = miastringa.indexOf('#');
    int cerca2 = miastringa.indexOf('

Nonostante nella pagina maxiphone.it/stato.php mi trovo la stringa # arduino NON la vede…
non ho piu idee…

Help me =( =(
);
    int cerca3 = miastringa.indexOf(’%’);
    int cerca4 = miastringa.indexOf(‘£’);
   
    Serial.println('ricerca # → ');
    Serial.print(cerca1);
    Serial.println('ricerca $ → ');
    Serial.print(cerca2);
    Serial.println('ricerca % → ');
    Serial.print(cerca3);
    Serial.println('ricerca £ → ');
    Serial.print(cerca4);[/color]
   
   
  }
};

void loop()
{

serialswread();
};

void serialswread(){
 
  gsm.SimpleRead();
 
}


Nonostante nella pagina maxiphone.it/stato.php mi trovo la stringa # arduino NON la vede...
non ho piu idee....

Help me =( =(

Non so se fa al caso tuo, ma io avevo fatto uno sketch che se incontrava il carattere del punto interrogativo rovesciato iniziava a concatenare una stringa fino al carattere speciale successivo. Poi confrontavo la stringa salvata e facevo i miei controlli…

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
byte mac[] = {0x90, 0xa2, 0xda, 0x0d, 0xb1, 0x05 };
byte ip[] = { 192,168,1,1 };
byte subnet[] = { 255,255,255, 0 };

String lista;
File htmlFile;

EthernetServer server(80);
 
void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac,ip,subnet);
  server.begin();
  if (!SD.begin(4)) { return; }
}
 
void loop()
  {
  lista ="";
  EthernetClient client = server.available();
  if (client) {
      boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
int a=-1; 
boolean salva=false;
          htmlFile = SD.open("index.htm");
          if (htmlFile) {
            while (htmlFile.available()) 
              {
              a=(htmlFile.read());  
              if (a==191)
                {
                a=0;  
                while (a!=191)
                  {
                  a=(htmlFile.read());  
                  if (a!=191)
                    lista+=char(a);
                  }
                if (lista=="maury")
                  client.write("GRANDEEEE!!!");
                }
              else
                client.write(a);
              }  
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
Serial.println(lista);
}