Nuova libreria GSM_GPRS per GPRS shield di FuturaElettronica con modulo SIM900

No i "\n" li avevo saltati :blush:
ora ho provato così:

AT+CIPSTART="TCP","www.google.it","80"

OK

CONNECT OK
AT+CIPSEND 

> GET 
www.google.it
 HTTP/1.0\nHost: 
www.google.it
\n
User-Agent: Arduino
\n\n
_

SEND OK

CLOSED

ma il risultato non è cambiato...
ho provato anche il nuovo esempio che mi hai linkato ma non è cambiato nulla...
gli esempi si intoppano ed "crashano" nel inetGSM.cpp proprio all'inizio della funzione httpGET, alla riga
if(!gsm.connectTCP(server, port))
** return 0;**

questa è la funzione...

int InetGSM::httpGET(const char* server, int port, const char* path, char* result, int resultlength)
{
  int length_write;
  char end_c[2];
  end_c[0]=0x1a;
  end_c[1]='\0';

  if(!gsm.connectTCP(server, port))
    return 0;
  
  gsm.SimpleWrite("GET ");
  gsm.SimpleWrite(path);
  gsm.SimpleWrite(" HTTP/1.0\nHost: ");
  gsm.SimpleWrite(server);
  gsm.SimpleWrite("\n");
  gsm.SimpleWrite("User-Agent: Arduino");
  gsm.SimpleWrite("\n\n");

  gsm.SimpleWrite(end_c);

  switch(gsm.WaitResp(10000, 100, "SEND")){
	case RX_TMOUT_ERR: 
		return 0;
	break;
	case RX_FINISHED_STR_NOT_RECV: 
		return 0; 
	break;
  }

  Serial.println("SENT");
  int res= gsm.read(result, resultlength);

  //gsm.disconnectTCP();
  
  //int res=1;
  return res;
}

in pratica la funzione connectTCP restituisce false e quindi termina la httpGET.
Ora sto cercando di capire a che punto della funzione connectTCP si interrompe il flusso del programma...

la mia pazienza si sta esaurendo :0
ora prendo zio Arduino e lo frullo dalla finestra!!

ciao ciao :slight_smile:

Dai dai resisti :slight_smile: ...
Allora,
nel file SIM900.cpp
c'è la funzione int SIMCOM900::connectTCP(const char* server, int port){
prova a decommentare i Serial.println di DEBUG come "CONNECTED" e "RCVD INPUT"
compila e ricarica, e vediamo cosa esce fuori lanciando lo sketch.
(Ti compare il tuo IP durante l'avvio?)

Altro consiglio, nel file di esempio AT, gli puoi assegnare delle funzioni alla scritta TEST, tipo
gsm.connectTCP("www.google.it",80);
così basta scrivere TEST sulla serial monitor per fare le prove.

Tengo duro...
il problema da quanto capisco è che quando esegue nello sketch il comando gsm.attachGPRS il programma non passa in stato ATTACHED ma rimane in READY e quindi successivamente nella funzione connectTCP esce...

i serial.println di DEBUG sono già NON commentati, il programma termina prima, non c'arriva neanche su quelle righe...

vediamo....

EUREKA!!!
Ho avuto un response decente dal web server di Google!! Yabadabaduuuuuu :grin:

GSM Shield testing.

status=READY
Byte: 0

OK

OK

ERROR

ERROR

109.114.125.79

OK

CONNECT
SEND OK
HTTP/1.0 302 Found
Location: http://www.google.it/
Cache-Control: private
Content-Type:ttm aeU8S-o:R==6832:=T106:=295=RVOjcxr=u2e238: Tp= mnglc
t e2D2183 TSv sCt-nh2
X-otn1meo
-aOisSOG
M<A<at-u=nnteoe=xhlhsu->TE0Me/L<E>D
12odH
 ce  v
 Fhp/woetheA
/Y/M

CLOSED

e l'ho fatto da uno sketch inviando direttamente i comandi AT senza usare la libreria.
Certo ho saltato tutti controlli sui vari stati della connesione che fa la libreria... ma è un inizio... :wink:

In realtà nella gsm.connectTCP il controllo sullo stato è commentato (è stata adattata un'altra libreria per l'inplementazione del GPRS e alcune cose devono ancora essere sistemate).
Ho caricato un nuovo file .zip su googlecode. Test.zip
Prova con quella libreria.
Altra cosa IMPORTANTISSIMA... Quando uno preme sul RESET si resetta solamente l'Arduino! Il modulo no... di conseguenza se per caso sta in modalità ricezione testo (tipo dopo AT+CIPSEND) li non risponde più a nessun comando e sembra non funzionare. Ad ogni riavvio di Arduino è consigliabile effettuare qualche secondo prima un reset della SIM900 (togliendo l'alimentazione).

Marco

Buonasera,
scusate se mi intrometto ma anche io sto avendo problemi con la libreria.
Sto usando lo stesso shield di ghini76, preso da Futura Elettronica, e Arduino IDE 1.0
Non riesco a far funzionare nemmeno lo sketch GSM_GPRSLibrary_AT!

oltre al fatto che impiega più di 30 secondi per ottenere status=READY, questo è quello che ottengo da serial monitor:

GSGSM Shield testing.

status=READY
AT

come vedete non risponde al comando AT...

qualcuno più esperto di me può gentilmente darmi una mano? Per ora ho la sensazione di aver buttato 63 euro :~

evildeejay:
In realtà nella gsm.connectTCP il controllo sullo stato è commentato (è stata adattata un'altra libreria per l'inplementazione del GPRS e alcune cose devono ancora essere sistemate).
Ho caricato un nuovo file .zip su googlecode. Test.zip
Prova con quella libreria.
Altra cosa IMPORTANTISSIMA... Quando uno preme sul RESET si resetta solamente l'Arduino! Il modulo no... di conseguenza se per caso sta in modalità ricezione testo (tipo dopo AT+CIPSEND) li non risponde più a nessun comando e sembra non funzionare. Ad ogni riavvio di Arduino è consigliabile effettuare qualche secondo prima un reset della SIM900 (togliendo l'alimentazione).

Marco

Wow non avevo idea di scrivere con uno dei padri della libreria! Complimenti :slight_smile:

Ho provato la nuova libreria (test.zip) ma ho gli stessi problemi....
riguardo al pulsante reset sapevo già che resetta solo Arduino... per oggi penso che possa bastare... riprenderò domattina con rinnovato vigore :)...

cioa e grazie

marchins:
Buonasera,
scusate se mi intrometto ma anche io sto avendo problemi con la libreria.
Sto usando lo stesso shield di ghini76, preso da Futura Elettronica, e Arduino IDE 1.0
Non riesco a far funzionare nemmeno lo sketch GSM_GPRSLibrary_AT!

oltre al fatto che impiega più di 30 secondi per ottenere status=READY, questo è quello che ottengo da serial monitor:

GSGSM Shield testing.

status=READY
AT




come vedete non risponde al comando AT...

qualcuno più esperto di me può gentilmente darmi una mano? Per ora ho la sensazione di aver buttato 63 euro :~

Ciao Marchins, allora la libreria per quanto rigaurda gli SMS e Chiamate è perfettamente funzionante, per adattarla al nuovo IDE 1.00 è sufficiente seguire le seguenti istruzioni:
The WProgram.h file, which provides declarations for the Arduino API,
has been renamed to Arduino.h. To create a library that will work in
both Arduino 0022 and Arduino 1.0, you can use an #ifdef that checks
for the ARDUINO constant, which was 22 and is now 100. For example:

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

[via http://arduino.cc/en/Main/ReleaseNotes]

Per il capitolo GPRS la libreria è in fase Beta, ti consiglio di rimanere sempre aggiornato tramite google code
http://code.google.com/p/gsm-shield-arduino/downloads/list
dove usciranno release mano mano che emergono i nuovi problemi :slight_smile: che speriamo di risolvere.
Penso che il tuo problema sia lo stesso che aveva ghini76 all'inizio del topic (ossia i pin 2 e 3), a momenti carico una nuova versione della libreria
dove è possibile selezionare dallo sketch stesso i pin utilizzati.
Controlla la pagina dei download (su google code) tra una mezz'oretta :wink:
Aggiornato, ora è presente la versione 3.03 che dovrebbe risolvere il problema dei Pin, fammi sapere :wink:

Un'ultima cosa,
ho fatto questo sketch per fare una GET con i comandi AT a un webserver, come dicevo in qualche post fa sono riuscito ad avere una risposta decente dal web server di Google ma funziona solo con certi domini e non capisco perchè....

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

char msg[150];
int numdata;
char inSerial[40];
int i=0;
char* result;
int resultlength;

void setup() 
{
  char end_c[2];
  end_c[0]=0x1a;
  end_c[1]='\0';

  //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(9600))
    Serial.println("\nstatus=READY");
  else Serial.println("\nstatus=IDLE");
  
  delay(10000); 
  
  gsm.SimpleWrite("AT");
  delay(2000);
  
  gsm.SimpleWrite("AT+CSTT=\"mobile.vodafone.it\",\"\",\"\"");
  delay(2000);
  
  gsm.SimpleWrite("AT+CIICR");
  delay(2000);

  gsm.SimpleWrite("AT+CIFSR");
  delay(2000);
  
  //gsm.SimpleWrite("AT+CIPSTART=\"TCP\",\"91.81.87.70\",80\r");
  gsm.SimpleWrite("AT+CIPSTART=\"TCP\",\"www.aruba.it\",80\r");
  //gsm.SimpleWrite("AT+CIPSTART=\"TCP\",\"www.softwellitalia.it\",80\r");
  //gsm.SimpleWrite("AT+CIPSTART=\"TCP\",\"173.194.35.20\",80\r");
  delay(4000);

  gsm.SimpleWrite("AT+CIPSEND");
  delay(2000);

  gsm.SimpleWrite("GET ");
  //gsm.SimpleWrite("/custos/ricevi.aspx?op=2&id=1");
  //gsm.SimpleWrite("/custos/ricevi.aspx");
  gsm.SimpleWrite("/");
  gsm.SimpleWrite(" HTTP/1.0\nHost: ");
  //gsm.SimpleWrite("91.81.87.70");
  gsm.SimpleWrite("www.aruba.it");
  //gsm.SimpleWrite("www.softwellitalia.it");
  //gsm.SimpleWrite("173.194.35.20");
  gsm.SimpleWrite("\n");
  gsm.SimpleWrite("User-Agent: Arduino");
  gsm.SimpleWrite("\n\n");
  
  gsm.SimpleWrite(end_c);
  
  int res= gsm.read(result, resultlength);
  Serial.print("Byte: ");
  Serial.println(res);
  
};

void loop() 
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
};

void serialhwread(){
  i=0;
  if (Serial.available() > 0){            
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;      
    }
    
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWrite(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWrite("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    
    else{
      Serial.println(inSerial);
      gsm.SimpleWrite(inSerial);
    }    
    
    inSerial[0]='\0';
  }
}

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

con google.it e google.com funziona come con trenitalia.it e libero.it.
Ma ad esempio con aruba.it, globalitalia.it oltre che con un mio server puntando al suo IP pubblico non funziona.

GSM Shield testing.

status=READY
Byte: 0

OK

Call Ready

OK

OK

OK

2.42.151.214

OK

C
SEND OK
HTTP/1.0 302 Found
Location: http://www.google.it/
Cache-Control: private
Content-Type:ttt;aeU-S-oeP==b530aF:1573=229=U42xgeisu2D-3333Tph;mnggc
a:u2D 1333M
v:wCttet2
-Soco melkXa-tn EIN
T>E>thpqvoe-ecttt/mcr=f"<T3 v/T>HDO>H3Me/>eomtaodAE"t/woli"r/.<O<T>
CLOSED

quando non funziona ho il seguente output:

GSM Shield testing.

status=READY
Byte: 0

OK

OK

ERROR

ERROR

2.45.201.160

OK

CONNECT O
SEND OK
HTTP/1.1 400 Bad Request
Content-Type: text/html
Date: Tue, 27 Dec 2011 23:37:48 GMT
Coei:l
oe-g:4
haRutnl Lh
CLOSED

E comunque anche il response del GET su google.it contiene un po' troppi caratteri strani secondo me.
Secondo voi a cosa sono dovuti questi due problemucci?

Grazie ancora

@ghini76
Stavo cercando di capire dove potrebbe essere il problema, ma non riesco veramente a capire :stuck_out_tongue: ma ce la faremo!
Per i caratteri strani:
Prova ad abbassare il baudrate con il SIM900, di solito con il download di pagine web è consigliabile 2400 o 4800. Nella mia esperienza, se alzo a 9600, salta un po' di caratteri. Per quanto riguarda il problema della libreria, potresti inviarmi l'output di un gsm.connectTCP("www.google.it",80) (anche domani mattina :stuck_out_tongue: se preferisci) decommentando i print di debug dentro al file SIM900.cpp (nella funzione connectTCP righe 199, 210,222)
La versione nuova caricata è leggermente diversa dalla test.zip quindi non credo che ti potrà aiutare.. però non si sa mai :stuck_out_tongue:

Dimenticavo (sarà l'ora) della prima domanda.
La GET request non è proprio identica per tutti i siti: alcuni richiedono per forza alcuni parametri, altri no.
Infatti il server risponde: Bad Request.
Questo è appunto ciò che ti dicevo, dovresti vedere quali sono i parametri che vogliono i siti e provare ad aggiungerli.
(Può essere pure che durante la comunicazione si perda un carattere e il server non riconosce più la richiesta)
A segnale come sei messo? :wink:
AT+CSQ?

Buongiorno evildeejay,
allora questo è l'output della funzione gsm.connectTCP("www.google.it",80) fatto con l'ultima versione della libreria scaricata questa mattina:

GSM Shield testing.

status=READY
status=ATTACHED

Number of data received:
0
Data received:

Come vedi non arriva proprio a quelle righe... ma a te funziona?

Per quello che riguarda il mio sketch che invia i comandi AT ho provato a cambiare la velocità del gsm.begin sia a 2400 che a 4800 e il programma non funzionaproprio. Si blocca dopo status=READY... bah

Per la GET è sicuramente come dici te visto che mi sembra di notare che tutti i server che mi rispondono con "bad request" sono tutti IIS6. Mi sono collegato con il telnet sulla porta 80 ed è bastato inviargli "GET /[path]\n\n" e mi ha restituito correttamente la pagina. Mi studierò il metodo GET sul sito del W3.

Ciao ciao

Buondì ghini,
mhhh un attimo... quello è l'output di tutto lo sketch "Client", che al suo interno contiene la funzione httpGET (che a sua volta ha la connect).
Io intendo solamente la funzione gsm.connectTPC .
Per capirci, una cosa simile:
http://code.google.com/p/gsm-shield-arduino/source/browse/branches/CompatibleVerIDE100/example/GSM_GPRSLibrary_AT/GSM_GPRSLibrary_AT%20-%20Copia.ino

dove è il solito solo che è stato modificato:

    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("TCP");
      gsm.connectTCP("www.google.it",80);
    }

In modo che dopo i soliti comandi per connettersi:
AT+CSTT="...
AT+CIICR
AT+CIFSR
invii un comando TEST, e vediamo l'output.

A me ovviamente funziona (non sono ancora così pazzo :stuck_out_tongue: ma ci siamo vicini)...
La cosa che mi viene in mente è che io ho usato sempre Wind per i miei test, e magari Vodafone
ha dei tempi sui timeout diversi (per questo ti chiedevo l'output di gsm.connectTCP).

Hai ragione Marco,sono un po' di coccio :stuck_out_tongue:
ecco l'output che volevi

GSM Shield testing.

status=READY

OK

Call Ready
TCP
RCVD INPUT
CONNECTED
TEST

Sembra funzionare...
andando a pranzo passo a comprarmi una scheda Wind ricaricabile così possiamo fare i test e paragonarli...

Tranquillo :slight_smile:
Bene.. allora esegue la connessione correttamente (escluderei dunque il problema della Vodafone), riceve l'ok "CONNECT OK" e manca l'ultimo controllo "MOD INVIO"... ossia non vede il ">" che gli consente di inviare i dati.
Dopo aver eseguito la funzione TEST il modulo risponde ai comandi AT? o entra appunto nella "modalità invio" quindi non fa nulla se non riceve un /END?

Si ho provato a sostituire www.google.it con altri domini e indirizzi IP e funziona bene ugualmente.

Dopo aver eseguito TEST risponde ai comandi AT, ad esempio ho chiesto di mostrarmi il segnale:

GSM Shield testing.

status=READY

OK

Call Ready
TCP
RCVD INPUT
CONNECTED
TEST
AT+CSQ

+CSQ: 17,0

OK

Quindi se dopo TEST fai AT+CIPSEND lui risponde con ">" in attesa di input? (ci stiamo avvicinando...)

mi da errore:

GSM Shield testing.

status=READY

OK

Call Ready
TCP
RCVD INPUT
CONNECTED
TEST
AT+CIPSEND

ERROR
AT+CIPSEND

ERROR

Dopo il primo ERROR ho provato un'altra volta ma nada....

La situazione ammetto che è strana.. altra prova (sempre dopo un TEST)
AT+CIPSTATUS?

GSM Shield testing.

status=READY

OK
TCP
RCVD INPUT
CONNECTED
TEST
AT+CIPSTATUS

OK

STATE: PDP DEACT