Nuova libreria GSM_GPRS per GPRS shield di FuturaElettronica con modulo SIM900

Ciao a tutti,
sto tentando di usare la nuova libreria GSM_GPRS su Arduino UNO R2 con il compilatore 1.0 ma con scarsi risultati.
La compilazione non restituisce errori. Riesco ad uploadare correttamente lo sketch, arduino esegue il codice ma non ho i risultati.
Ad esempio se tento di inviare una SMS con l'esempio a corredo della libreria, mi viene scritto sul SerialMonitor "SMS sent" ma io non ricevo nulla! Nello sketch di esempio, ovviamente, ho modificato solo il numero di telefono di destinazione mettendo quello del mio cellulare...

Altro tentativo che ho fatto è usare l'esempio GSM_GPRSLibray_Client che crea una connessione GPRS a Internet e tenta di leggere una URL. Qui ho modificato solo l'APN ma niente, ricevo 0 byte. Ho pravato a cambiare anche vari APN del mio gestore ma nulla. =(

Ho provato ad utilizzare la vecchia versione della libreria per inviare gli SMS e tutto funziona regolarmente!
Garantisco quindi che le SIM (ho provato con 2) funzionano sia per il traffico dati GPRS sia per gli SMS. Arduino funziona. Lo shield funziona e si registra sulla rete GPRS.

Il mio obiettivo è passare dei parametri via QueryString ad una pagina APSX che ho sviluppato.
Ormai sono 3 giorni che prendo di mira tutti gli spigoli di casa!! :~

Mi sapete dare qualche dritta?

Grazie e un felice Natale a tutti! :slight_smile:

ciao
se parli di questa nuova libreria http://code.google.com/p/gsm-shield-arduino/downloads/detail?name=GSM_Shield_GPRS_Ver_3_02_(IDE100).zip&can=2&q=
prova a modificare le prime righe del file GSM.cpp

tu dovresti avere

#include "GSM.h"
#include "WideTextFinder.h"


//#define _GSM_TXPIN_ 4
//#define _GSM_RXPIN_ 5

#define _GSM_TXPIN_ 2
#define _GSM_RXPIN_ 3	

GSM::GSM():_cell(_GSM_TXPIN_,_GSM_RXPIN_),_tf(_cell, 10),_status(IDLE){
};

questo vuol dire che arduino dovrebbe usare i pin 2 e 3 per trasmettere e ricevere dati dallo shield, ma non è fisicamente vero perchè usa o i pin 4 e 5 (deviatore dello shield su software) o 0 e 1 (deviatore dello shield su hardware)
lasciando il deviatore su software commenta le righe così

#include "GSM.h"
#include "WideTextFinder.h"


#define _GSM_TXPIN_ 4
#define _GSM_RXPIN_ 5

//#define _GSM_TXPIN_ 2
//#define _GSM_RXPIN_ 3	

GSM::GSM():_cell(_GSM_TXPIN_,_GSM_RXPIN_),_tf(_cell, 10),_status(IDLE){
};

federico

Ciao,
si intendo proprio quella libreria.
Ho modificato il GSM.cpp come mi hai indicato ma non è cambiato nulla eseguendo gli esempi.
Ho un dubbio, nell'esempio, che inserisco qui sotto, non c'è nessun riferimento al file GSM.cpp... il compilatore quando va a leggere il file gsm.cpp?

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

//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[30];
int i=0;

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");
  else Serial.println("\nstatus=IDLE");
  
  //GPRS attach, put in order APN, username and password.
  //If no needed auth let them blank.
  if (gsm.attachGPRS("web.omnitel.it", "", ""))
    Serial.println("status=ATTACHED");
  else Serial.println("status=ERROR");
  delay(10000);

  //Read IP address.
  gsm.SimpleWrite("AT+CIFSR\r");
  delay(5000); 
  
  //TCP Client GET, send a GET request to the server and
  //save the reply.
  numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);
  //Print the results.
  Serial.println("\nNumber of data received:");
  Serial.println(numdata);  
  Serial.println("Data received:"); 
  Serial.println(msg); 

  //Tweet
  //inet.tweet("*********************key************", "An Arduino at #cpes15");

};

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();
}

Esguito su arduino l'esempio, sul Serial Monitor mi compare questo:

GSM Shield testing.

status=READY
status=ATTACHED

Number of data received:
0
Data received:

Grazie

Ho fatto un tentativo con l'esempio che invia un SMS e funziona!
Che c' che non va nell'esempio del Client HTTP?
Come avrai capito sono alle prime armi con Arduino :stuck_out_tongue:

ora vado a fare un po' di stretching per lo stomaco che tra poco iniziano le abbuffate!

Buon Natale ancora....
ciao ciao e grazie

non vorrei dirte baggianate, ma non devi usare wep.omnitel.it ma mobile.vodafone.it..
da http://assistenza.vodafone.it/privati/cellulari_e_smartphone/configurazioni/apn_servizi_e_tariffe

Scusa se quel che sto dicendo non ti può aiutare ma volevo chiederti se hai comprato direttamente lo shield per arduino da 63 euri o il modulo da solo...

Buone vacanze a tutti!!!!

se ti puo essere utile, io ho comrpato lo shield da 63 €, anche perchè il modulo da solo, se non sbaglio, costa poco meno (50€)..

federico

djpatrik1824:
Scusa se quel che sto dicendo non ti può aiutare ma volevo chiederti se hai comprato direttamente lo shield per arduino da 63 euri o il modulo da solo...

Buone vacanze a tutti!!!!

Si ho comprato quello da 63 completo... http://www.futurashop.it/allegato/8100-GSMSHIELD.asp?L2=SHIELD E ACCESSORI ARDUINO&L1=SOFTWARE E SISTEMI DI SVILUPPO&L3=&cd=8100%2DGSMSHIELD&nVt=&d=63,00

lesto:
non vorrei dirte baggianate, ma non devi usare wep.omnitel.it ma mobile.vodafone.it..
da http://assistenza.vodafone.it/privati/cellulari_e_smartphone/configurazioni/apn_servizi_e_tariffe

Ho provato con due SIM normali (voce+dati):
mobile.vodafone.it
web.omnitel.it
wap.omnitel.it

e con una SIM M2M (solo dati):
m2m.omnitel.it
m2mbis.omnitel.it

e l'output è lo stesso identico, medesimo, preciso... cioè ZERO byte ricevuti! :((((
Mi viene da pensare che non sia l'APN il problema.... boh...

Grazie

apri la classe inteGPS e vedi come funziona la funzione: httpGET(), magri mettici dentro una print() per mostrare la get che viene inviata al server

Lesto ho fatto come mi hai suggerito e ho modificato il file così:

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';

  /*
  Status = ATTACHED.
  if(gsm.getStatus()!=GSM::ATTACHED)
    return 0;
  */
  
  Serial.println("=============================================");
  Serial.println("Inizio output da inetGSM.cpp");

  Serial.print("Server:");
  Serial.println(server);
  Serial.print("Porta:");
  Serial.println(port);
  Serial.print("Path:");
  Serial.println(path);
  Serial.println("");

  Serial.print("GPRS:");
  if(gsm.getStatus()==GSM::ERROR) Serial.println("ERROR");
  if(gsm.getStatus()==GSM::IDLE) Serial.println("IDLE");
  if(gsm.getStatus()==GSM::READY) Serial.println("READY");
  if(gsm.getStatus()==GSM::ATTACHED) Serial.println("ATTACHED");
  if(gsm.getStatus()==GSM::TCPSERVERWAIT) Serial.println("TCPSERVERWAIT");
  if(gsm.getStatus()==GSM::TCPCONNECTEDCLIENT) Serial.println("TCPCONNECTEDCLIENT");
  Serial.println("");

  if(gsm.connectTCP(server, port))
    Serial.println("connectTCP=true");
  else Serial.println("connectTCP=false");
  Serial.println("");

  Serial.println("Fine output da inetGSM.cpp");
  Serial.println("=============================================");
  Serial.println("");

  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;
}

il risultat di output sul monitor è ilseguente:

GSM Shield testing.

status=READY
status=ATTACHED
=============================================
Inizio output da inetGSM.cpp
Server:www.google.com
Porta:80
Path:/

GPRS:READY

connectTCP=false

Fine output da inetGSM.cpp
=============================================


Number of data received:
0
Data received:

Quindi è la funzione gsm.connectTCP che non riesce a connettersi al serverweb....
continuo a indagare ma se avete qualche dritta sono tutto orecchie e occhi :slight_smile:

ciao e grazie

Forse non riesce a leggere la pagina perchè CREDO che la connessione alla rete GPRS in realtà non sia effettuata al 100%...
Se uso getStatus() in vari punti mi restituisce sempre READY (stato 2) e non ATTACHED (stato 3)... forse per funzionare deve essere in stato 3.
Ho appena scaricato il manuale dei comandi AT del SIM900 ma non riesco ad inviarglieli... ho provato sia con il SerialMonitor del compilatore che con HyperTerminal...

mumble mumble....

prova con la vecchia libreria

federico

Nella vecchia libreria non è presente nessuna funzione per il traffico HTTP... =(

:wink: ti avevo consigliato la vecchia libreria per verificare la ricezione e l'invio dei comandi AT nel qual caso la nuova facesse brutti scherzi

se con la veccjia va, potresti prendere le funzioni per HTTP e adattarle ad essa

federico

EDIT: prima di tutto assicurati di avere l'ultima versione, Google Code Archive - Long-term storage for Google Code Project Hosting.
che la precedente aveva un problema molto simile a quello che descrivi.

Ciao, puoi fare questa prova:
Carica il file di esempio AT.
Una volta lanciato aspetti che il modulo invii qualche stringa di accensione (10-15 sec)
e invii i seguenti comandi:
AT

-->OK (questa è la risposta che dovresti ottenere, questo comando vede se c'è comunicazione con il modulo)

AT+CSTT="nomeapn","username","password"

-->OK (imposti l'APN, dove al posto di nomeapn, username e password metti quelli del gestore, se non hai username e pass lasci vuoto)

AT+CIICR

-->OK (avvii una connessione internet)

AT+CIFSR

-->192.xxx.xxx.xxx (restituisce l'IP)

Così vediamo di capire, dov'è il problema in fase di connesione.

Marco

evildeejay:
EDIT: prima di tutto assicurati di avere l'ultima versione, Google Code Archive - Long-term storage for Google Code Project Hosting.
che la precedente aveva un problema molto simile a quello che descrivi.

Ciao, puoi fare questa prova:
Carica il file di esempio AT.
Una volta lanciato aspetti che il modulo invii qualche stringa di accensione (10-15 sec)
e invii i seguenti comandi:
AT

-->OK (questa è la risposta che dovresti ottenere, questo comando vede se c'è comunicazione con il modulo)

AT+CSTT="nomeapn","username","password"

-->OK (imposti l'APN, dove al posto di nomeapn, username e password metti quelli del gestore, se non hai username e pass lasci vuoto)

AT+CIICR

-->OK (avvii una connessione internet)

AT+CIFSR

-->192.xxx.xxx.xxx (restituisce l'IP)

Così vediamo di capire, dov'è il problema in fase di connesione.

Marco

Grande dritta marco :wink:

Si comunque la versione è la 3.02 del 15 dicembre.

Ho eseguito i comandi che mi hai indicato e mi hanno restituito tutti OK.
Ho provato con gli APN web.omnitel.it e mobile.vodafone.it ed entrambi mi hanno restituito un indirizzo IP pubblico valido.
Guardandomi la libreria sono andato oltre e ho provato a fare una connessione TCP con AT+CIPSTART="TCP","www.google.it","80"

e mi ha restituito

OK

CONNECT OK

dopo ho provato a inviare il comando AT+CIPSEND
e mi è comparso ">" e credo che sia il prompt del web server.
invio quindi questi comandi ed ho la seguente risposta:

> GET / HTTP/1.0
Host: www.google.it
User-Agent: Arduino

aspetto un po'.... e poi ricevo

CLOSED

ERROR

e ho come l'impressione che la richiesta GET al web server vada in timeout....

Ho visto che nel file inetGSM.cpp esegue gsm.SimpleWrite(end_c); dopo aver scritto la richiesta GET. La costante end_c è = a 2.
Ho provato anche a inviargli il 2 come comando ma non cambia nulla...

Dove sbaglio secondo te?

ho eseguito anche un AT+CDNSGIP="www.google.it" con risultato:

OK

+CDNSGIP: 1,"www.google.it","173.194.35.48"

Quindi sono connesso e addirittura il DNS mi risolve i nomi di dominio... :smiley:

Piano piano....

Ti dico cosa mi viene in mente,
dopo scritto la tua HTTP request devi effettivamente inviarla al server, quindi:
una volta completato tutto scrivi /END
con questo comando lui effettivamente invia tutto ciò che hai scritto al server.
Come giustamente hai detto tu, se dopo un po' google non riceve nulla, chiude tutto per timeout.
Ricordati due "a capo" alla fine della request.

Per quanto riguarda lo sketch del Client,
prova con quest'ultima versione, è stata aggiunta un "AT+CIFSR" per richiedere l'IP,
in quanto a volte è necessaria per il funzionamento della connessione.

Tienimi aggiornato :wink:

EDIT: Google Code Archive - Long-term storage for Google Code Project Hosting.
Mancava il link

Marco

Ecco il risultato con i due /END

GSM Shield testing.

status=READY

OK
AT

OK
AT+CSTT="web.omnitel.it","",""

OK
AT+CIICR

OK
AT+CIFSR

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

OK

CONNECT OK
AT+CIPSEND

> GET / HTTP/1.0
Host: www.google.it
User-Agent: Arduino
_

SEND OK
_

CLOSED

(il trattino - rapprensenta il /END)
Quindi ora google.it ha ricevuto correttamente richiesta ma non mi ha restituito nulla a schermo... è normale?
Do un'occhiata al nuovo esempio che mi hai linkato...

grazie

Ok già è un passo avanti, se google non risponde è perché non gli piace la GET request.
Così a occhio mi sembra non ci siano i due "\n" alla fine, sei sicuro di averceli messi?