Go Down

Topic: Moduli gsm (Read 10997 times) previous topic - next topic

lesto

mannaggia io parteciperei,ma senza modulo ho paura di fare più danni che altro.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

pines

Ciao
volevo segnalare, penso un bug.

Ho caricato lo sketch gsm_shield, funziona bene al 99%, ma quando sul modulo ricevo una chiamata dal numero presente nella rubrica non viene segnalato nulla.
Spero di essere stato chiaro.

ypkdani

A me funziona utilizzando la funzione:
int call=gsm.CallStatus();//leggo lo stato del modulo GSM
che mi restituisce se o una chiamata in arrivo, attivo,...

pines

.. ho queste righe ..
  call=gsm.CallStatus();
  Serial.println(call);

se il numero è presente in rubrica mi da 0, se non cè mi visualizza 1.

ypkdani

Questa è la funzione che utilizzo per verificare ogni secondo se c'è una chiamata in arrivo:
Code: [Select]

//Funzione che controlla se chiamata in arrrivo
void Check_Call()
{     
  char number[15];//array dove salvo il numero chiamante
 
  int call=gsm.CallStatus();//leggo lo stato del modulo GSM 
  switch (call)
  {   
  case CALL_NONE:
    Serial.println("no call");
    break;
  case CALL_INCOM_VOICE:
    gsm.CallStatusWithAuth(number,0,0);       
    if(strcmp(number,"")!=0){
      Serial.print("incoming voice call from ");     
      Serial.println(number);
      delay(1000);
      gsm.HangUp();//riattacco la chiamata
      //funzione
    }
    break;
  case CALL_ACTIVE_VOICE:
    Serial.println("active voice call");   
    break;
  case CALL_NO_RESPONSE:
    Serial.println("no response");
    break;
  }
  return;
}



forse sono le autorizzazioni che ti danno prob prova a vedere

pines

si infatti è un sistema che aggira l'ostacolo,
pero era piu comodo inserire il numero in rubrica.
Scusami ma non ho capito quello che hai scritto prima
Quote
forse sono le autorizzazioni che ti danno prob prova a vedere


Grazie

ypkdani

Quello che dicevo riguardava la funzione:
CallStatusWithAuth
Code: [Select]

/**********************************************************
Method checks status of call(incoming or active)
and makes authorization with specified SIM positions range

phone_number: a pointer where the tel. number string of current call will be placed
              so the space for the phone number string must be reserved - see example
first_authorized_pos: initial SIM phonebook position where the authorization process
                      starts
last_authorized_pos:  last SIM phonebook position where the authorization process
                      finishes

                      Note(important):
                      ================
                      In case first_authorized_pos=0 and also last_authorized_pos=0
                      the received incoming phone number is NOT authorized at all, so every
                      incoming is considered as authorized (CALL_INCOM_VOICE_NOT_AUTH is returned)

return:
      CALL_NONE                   - no call activity
      CALL_INCOM_VOICE_AUTH       - incoming voice - authorized
      CALL_INCOM_VOICE_NOT_AUTH   - incoming voice - not authorized
      CALL_ACTIVE_VOICE           - active voice
      CALL_INCOM_DATA_AUTH        - incoming data call - authorized
      CALL_INCOM_DATA_NOT_AUTH    - incoming data call - not authorized 
      CALL_ACTIVE_DATA            - active data call
      CALL_NO_RESPONSE            - no response to the AT command
      CALL_COMM_LINE_BUSY         - comm line is not free
**********************************************************/


pines

io l'ho impostato cosi
Code: [Select]
  case CALL_INCOM_VOICE:
    gsm.CallStatusWithAuth(number_incoming,0,0); 

se ho letto bene la funzione server per
Quote
verifica lo stato delle chiamate (in entrata o in corso) e autorizza le posizioni di SIM;


L'ho inserito anche prima del controllo   switch (call) , ma mi resttuisce vuoto, nel caso di numero presente in rubrica.

il setup iniziale è questo.
Code: [Select]
gsm.TurnOn(9600);          //module power on
  gsm.InitParam(PARAM_SET_1);//configure the module 
  gsm.Echo(0);

Ciao

ypkdani

Ok allora vedendo meglio la libreria con la funzione:
CallStatus
torna se c'è una chiamata in arrivo o attiva o nessuna ma senza che nella stringa di risposta ci sia il numero chiamante
Per la funzione :
CallStatusWithAuth
invece ritorna anche il numero ma solo se autorizzato (da quello che ho visto).
Utilizza la funzione che ti ho postato e sei ok. Se fai la CallStatusWithAuth senza che non ci siano chiamate in arrivo è ovvio che restituisca vuoto. 

pines

si grazie .. la tua funzione "funziona", pero volevo utilizzare la rubrica per la verifica di un numero autenticato,
ma una volta memorizzato il numero , non riconosce la chiamata , lo stato è sempre "no call" , appena cancello il numero dalla rubrica  la chiamata viene riconosciuta.

Grazie..

ypkdani

Se hai il numero salvato in rubrica allora devi cambiare gli indici di:
gsm.CallStatusWithAuth(number_incoming,0,0);
cioè modificare gli 0 e mettere l'indirizzo di rubrica di partenza e quello di fine in modo che la libreria cerchi il numero in questo intervallo.

mimmofire

Salve ragazzi, ho da poco acquistato lo shield da futuraelettronica e devo dire che va benissimo. Ho scritto qualche altra funzione ma adesso vorrei interrogare il modulo con altri comandi AT. Stavo provando ad esempio con il comando AT+COPS=? per leggere il nome della rete e quindi stavo cercando di implementare tale funzione direttamente nella libreria e più precisamente nel file GSM_Shield.cpp e qui iniziano i problemi!!!
Invio il comando con il comando seguente
mySerial.print("AT+COPS=?");
ma poi non riesco a leggere la risposta.
Qualche dritta?

pines


Se hai il numero salvato in rubrica allora devi cambiare gli indici di:
gsm.CallStatusWithAuth(number_incoming,0,0);
cioè modificare gli 0 e mettere l'indirizzo di rubrica di partenza e quello di fine in modo che la libreria cerchi il numero in questo intervallo.


Ho smatettato un po, per far riconoscere un numero inserito in rubrica occorre utilizzare
Quote
gsm.CallStatusWithAuth(number_incoming,1,3);

che controlla a partire dalla posizione 1 per 3 celle

Ma le funzioni
Quote
gsm.CallStatus();
e
Quote
gsm.CallStatusWithAuth(number_incoming,1,3)

sono indipendenti cioè se chiamo con un numero in rubrica, questo  viene riconosciuto solo dalla funzione
Quote
gsm.CallStatusWithAuth
ma non  dalla
Quote
gsm.CallStatus();

naturalmente se il numero non è in rubrica succede il contrario.

ypkdani

Scusa ma gsm.CallStatus(); ti restituisce solo se c'è una chiamata in arrivo o una attiva o niente mentre gsm.CallStatusWithAuth(number_incoming,0,0); ritorna il numero del chiamante. Se vuoi vedere se il numero è in memoria allora (come hai fatto) cambi gli indici 0,0.
Riassumendo se vuoi che tu veda solo numeri in memoria allora metti gli indici tra cui cercare mentre se vuoi accettare tutti i numeri metti 0,0. Forse pero un motivo per cui non ti identifica il chiamante potrebbe essere che il numero salvato non ha il +39 iniziale. Prova a vedere

pines


Scusa ma gsm.CallStatus(); ti restituisce solo se c'è una chiamata in arrivo o una attiva o niente mentre gsm.CallStatusWithAuth(number_incoming,0,0); ritorna il numero del chiamante. Se vuoi vedere se il numero è in memoria allora (come hai fatto) cambi gli indici 0,0.
Riassumendo se vuoi che tu veda solo numeri in memoria allora metti gli indici tra cui cercare mentre se vuoi accettare tutti i numeri metti 0,0. Forse pero un motivo per cui non ti identifica il chiamante potrebbe essere che il numero salvato non ha il +39 iniziale. Prova a vedere


Ti ringrazio del tuo aiuto.
I numeri sono salvati con il +39.
Il fattore fondamentale è nella funzione gsm.callstatus() che restituisce zero se il numero è in rubrica, quindi non va nel case dove posso utilizzare CallStatusWithAuth.. con gli indici cambiati.

Go Up