Traffico dati GPRS

Ciao a tutti , un quesito per i più esperti ;

Ho un GPRS SHIELD acquistato da FUTURA ELETTRONICA con modulo SIM900
Invio una richiesta inet.httpGET ad una pagina su un server in PHP , esempio

http://miosito.php/pagina.php?data=12345678

Tutto funziona in maniera egregia

La domanda : quanto traffico dati consumo ( espresso in Kbyte ) ?
Dovrei attivare una SIM dati M2M ( machine to machine ) ma dovrei sapere quanto traffico effettuo

Grazie in anticipo

i byte usati sono difficili da calcolare:
i byte della richiesta GET (dipende da quali header stai inviando)
da160 a 250 bit (non byte) di header TCP (in IPv4, in IPv6 vanno da 480 ad oltre 512)

almeno 20 byte per il protocollo IP (40 per IPv6)

poi nel caso di Ethernet ci sono i protocolli sottostanti che aggiungono circa altri 40 byte (ma non contanto per l'MTU)

Ciao Lesto grazie sei sempre presente !

Entrò un po' più nel dettaglio , ho creato un sistema che monitorizza un ingresso analogico e ogni 5 minuti si connette alla rete e mi invia il valore ad un server in ascolto PHP

Il tutto funziona bene , ieri ricevo la bolletta dalla WIND ( ho un abbonamento che prevede 10 giga di traffico al mese ) e vedo che ho generato 3,5 giga di traffico dati

Mi sembra veramente un esagerazione !!

Visto che volevo passare ad un piano dati M2M a consumo con quei volumi di traffico pagherei una cifra improponibile

Ecco il perché avrei la necessità di capire quanto "consuma" un invio

Grazie

In un mese di 30 giorni ci sono (302460) 43200 minuti. Se invii ogni 5 hai effettuato 8640 invii.
Per aver consumato 3.5GB = 3'580MB = 3'670'016KB = 3'758'096'384 B in ogni invio hai mandato 434965 B ovvero circa 425KB.
Se fossero Gigabit dovresti dividere per 8 e allora sarebbero 53KB.
Mi sembrano comunque molti. :roll_eyes:

confermo, valore assolutamente esagerato...
sopratutto se poi non leggi la risposta della get

ps. c'è l'offerta mobile con 1 giga in alta velocità e infinito a bassa velocità al mese per 8€ al mese (ricaricabile)

Vi posto il codice completo , magari sbaglio io qualche cosa

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
#include <avr/wdt.h>

#include "sms.h"
#include "call.h"

SMSGSM sms;
CallGSM call;
InetGSM inet;

String Z;
int RSSI;
int BER;
int I;
int J;
    
char msg[50];
boolean started=false;
int resetsystem = 0 ;
int ledtx = 6 ;
int ledber = 7 ;

char risultato[100];
char ip_address [50];



    int IP1  ;
    int IP2  ;
    int IP3  ;
    int IP4  ;
    
    
    
void setup() 
{
  Serial.begin(9600);
  
  pinMode (ledtx,OUTPUT);
  digitalWrite ( ledtx,LOW );
  
  
  pinMode (ledber,OUTPUT);
  digitalWrite ( ledber,LOW );

  

  if (gsm.begin(4800)){
    Serial.println("INIZIALIZZAZIONE MODULO GSM REGOLARE");
    started=true;
  } else {
    
    Serial.println("INIZIALIZZAZIONE MODULO GSM FALLITA");
    wdt_enable(WDTO_1S);
  
  }
  
  
  
      if (inet.attachGPRS("internet.wind", "", "")) {
      
      Serial.println("COLLEGAMENTO AL PROVIDER");
      digitalWrite(ledtx,HIGH);
      // accendo il LED di aggancio alla rete
    } else {
       Serial.println("ERRORE COLLEGAMENTO AL PROVIDER");
        wdt_enable(WDTO_1S); 
        // accendo il LED di errore di aggancio alla rete
    }
    
    
  
  // ricavo l'indirizzo IP e lo divido in 4 numeri interi
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    gsm.WhileSimpleRead(risultato);
    
    
    
    Serial.println(risultato);
    
    
    
    String Risposta2 = String(risultato);
    byte SEP1 = Risposta2.indexOf(".");    
    String ip_1 = Risposta2.substring(0,SEP1);
    
    String rimanenza1 = Risposta2.substring(SEP1+1,30);
    byte SEP2 = rimanenza1.indexOf("."); 
    String ip_2 = rimanenza1.substring(0,SEP2);
    
    String rimanenza2 = rimanenza1.substring(SEP2+1,30);
    byte SEP3 = rimanenza2.indexOf("."); 
    String ip_3 = rimanenza2.substring(0,SEP3); 
   
    String rimanenza3 = rimanenza2.substring(SEP3+1,30);
    byte SEP4 = rimanenza3.indexOf("."); 
    String ip_4 = rimanenza3.substring(0,SEP4);
    
    IP1 = ip_1.toInt();
    IP2 = ip_2.toInt();
    IP3 = ip_3.toInt();
    IP4 = ip_4.toInt();
  
  
};


void loop(){

  
    send_data();
    
    Serial.println(resetsystem);
    
    if (BER <= 20) {
           
      digitalWrite( ledber , LOW ) ; 
      delay(500); 
      digitalWrite( ledber , HIGH ) ; 
      delay(500); 
      digitalWrite( ledber , LOW ) ;
      delay(500); 
      digitalWrite( ledber , HIGH ) ; 
      delay(500); 
      digitalWrite( ledber , LOW ) ;
      delay(500); 
      digitalWrite( ledber , HIGH ) ; 
      
    } else if ( BER > 20 ) {
           
      digitalWrite( ledber , HIGH ) ; 
      
    }
    
    

};


void send_data() {
  
  
  
    int ANALOG0 = digitalRead(A0);
    int ANALOG1 = digitalRead(A1);
    int ANALOG2 = digitalRead(A2);
    int ANALOG3 = digitalRead(A3);
    int ANALOG4 = digitalRead(A4);
    int ANALOG5 = digitalRead(A5);
    
    int DIGITAL10 = digitalRead(10);
    int DIGITAL11 = digitalRead(11);
    int DIGITAL12 = digitalRead(12);
    int DIGITAL13 = digitalRead(13);


   
  
    resetsystem = resetsystem + 1 ;
    if ( resetsystem == 10 ) {
     wdt_enable(WDTO_1S);  
    }
 
    if(started){

    if (inet.attachGPRS("internet.wind", "", "")) {
      
      Serial.println("COLLEGAMENTO AL PROVIDER");
      digitalWrite(ledtx,HIGH);
      // accendo il LED di aggancio alla rete
    } else {
       Serial.println("ERRORE COLLEGAMENTO AL PROVIDER");
        wdt_enable(WDTO_1S); 
        // accendo il LED di errore di aggancio alla rete
    }
      
  
      
    
    
    gsm.SimpleWriteln("AT+CSQ");
    delay(500);
    gsm.WhileSimpleRead(risultato);
    
    String Risposta = String(risultato);
    
    
    // da qui sotto serve per pulire cio che ricevo dal comando CSQ 
    // e tengo solo il valore senza virgole
    
    I = Risposta.indexOf("+CSQ");
    I = Risposta.indexOf(":");
    J = Risposta.indexOf(",");
    Z = Risposta.substring(I,J);
    RSSI = Z.toInt();
    Z = Risposta.substring(J -2);
    BER = Z.toInt();
    // ho ottenuto BER che e il segnale espresso in numero intero
    
  
  
    
   
    
    inet.httpGET("www.miosito.it",80,"/data_rx/ricezione_data.php?seriale=98890211&campo=",BER,"&ip1=",IP1,"&ip2=",IP2,"&ip3=",IP3,"&ip4=",IP4,
    "&analog0=",ANALOG0,"&analog1=",ANALOG1,"&analog2=",ANALOG2,"&analog3=",ANALOG3,"&analog4=",ANALOG4,"&analog5=",ANALOG5,
    "&digital10=",DIGITAL10,"&digital11=",DIGITAL11,"&digital12=",DIGITAL12,"&digital13=",DIGITAL13,msg,50);

  }
  
 
  digitalWrite(ledtx,LOW);
  
};

magari ho sbagliato qualche cosa , tipo aprire e chiudere le connessioni !!!!

P.S.

Ho modificato la libreria "inetGSM.h" in modo che accetti le richieste inet.httpGET con i campi da me specificati

Grazie

Prova a chiudere sempre la connessione. Mai tenere connessioni apere, inviano i keep alive, in oltre occupi la cella telefonica per nulla

Si in effetti non ci avevo pensato :astonished:

Faccio subito delle prove ma ci vorranno un paio di giorni prima che veda il traffico sul sito della WIND ( non viene aggiornato i tempo reale )

Vi aggiorno in settimana allegando tutti i testi fatti magari potrebbero servire ad altri utenti

Grazie

Non avendo molta esperienza con questa shield GPRS vi chiedo se il listato che ho preparata è giusto :

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


InetGSM inet;



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

void setup() 
{
  Serial.begin(9600);

  // [color=red]INIZIALIZZO LA SHIELD A 4800 BAUD ( E' GIUSTO ?? ALCUNI CONSIGLIANO 2400 BAUD )[/color]
  Serial.println("GSM Shield testing.");
  if (gsm.begin(4800)){
    Serial.println("\nstatus=READY");

    // [color=red]SE INIZIALIZZATA CORRETTAMENTE ASSOCIO AL VALORE STARTED = TRUE[/color]
    started=true;  
    
  }
  else Serial.println("\nstatus=IDLE");
  

  // [color=red]ATTENDO CHE TUTTO SIA PRONTO[/color]
  delay(2000);
  

};

void loop() 
{
  
  
  if(started){
    

     
     readdata();
  }
  
  

  // [color=red]ATTENDO 20 SECONDI E INVIO UNA NUOVA RICHIESTA GET[/color] 
  delay (20000);


};


void readdata() {
  
  
  Serial.println("mi collego alla rete ");
  
  

  // [color=red]STABILISCO UNA CONNESSIONE ALLA RETE GPRS[/color] 
  if (inet.attachGPRS("internet.wind", "", ""))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
    



    // [color=red]LEGGO IL VALORE DI IP ASSEGNATO AL MODULO SIM900 DALLA RETE[/color] 
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    gsm.WhileSimpleRead();
  
  
  
    // [color=red]INVIO UNA RICHIESTA GET ALLA PAGINA PHP IN ASCOLTO[/color] 
    inet.httpMultiGET("www.miosito.php", 80, "/accessi/newip.php?", "ip1=",1,"&ip2=",2,"&ip3=",3,"&ip4=",4 , msg , 50);
    
    

    // [color=red]TEMPO DI RECUPERO[/color] 
    delay(1000);
    
    


    // [color=red]TERMINO LA CONNESSIONE ALLA RETE[/color] 
    Serial.println("mi Scollego alla rete ");
    inet.dettachGPRS();
   
   
  
};

Quello che succede è :

lo shield si avvia , si connette ed invia la GET alla pagina ( sono sicuro in quanto la pagina PHP mi invia un MAIL )
attende 20 secondi

riavvia una nuova connessione ma ottengo status = ERROR

e cosi per loop infinito

in ROSSO ho commentato il listato per una semplicita di lettura

Grazie