Gestión del PIN GSM

Este ejemplo es parte de las herramientas suministradas por el  escudo GSM Arduino y le ayuda a cambiar o quitar el PIN de una tarjeta SIM.

Hardware necesitado

Circuito


Código

En primer lugar, importar la biblioteca de GSM

#include <GSM.h>
  
Inicializar una instancia de la clase GSM.

GSMPIN PINManager;
  
Crear sus variables, iniciar una cadena para almacenar la entrada del monitor serie. También hacer una bandera para el controlar que la f SIM ha sido autenticada con un PIN válido, y los mensajes para el monitor serie.

String user_input = "";
boolean auth = false;
String oktext = "OK";
String errortext = "ERROR";

En setup, abra una conexión serie al ordenador. Después de abrir la conexión, enviar un mensaje al monitor serie que indica que el programa se ha iniciado. Llame a PAYManager.begin () para reiniciar el módem.

void setup(){
   Serial.begin(9600);
   Serial.println("Ejemplo de cambio de PIN\n");
   PINManager.begin();

Compruebe si la tarjeta SIM está bloqueada con un PIN

while(!auth){
     int pin_query = PINManager.isPIN();
     if(pin_query == 1)
     {
  
Si está bloqueado, solicite el PIN a través del monitor de serie. Vamos a usar una función personalizada denominada readSerial () para analizar la información.

Serial.print("Introduzca el codigo PIN: ");
       user_input = readSerial();

Si el PIN es válido, establecer la bandera de autenticación a true. Enviar un mensaje de estado al monitor serie que indica el resultado. Si no  introduce el PIN de forma incorrecta, puede intentarlo de nuevo. Después de 3 intentos fallidos, el PIN se bloqueará, y necesitará el código PUK para desbloquearlo.

if(PINManager.checkPIN(user_input) == 0)
       {
         auth = true;
         PINManager.setPINUsed(true);
         Serial.println(oktext);
       }
       else
       {
         Serial.println("PIN incorrecto. Recuerde que tiene 3 oprtunidades.");
       }
     }

Si la tarjeta SIM está en modo de bloqueo PUK, solicite el código PUK y un nuevo PIN

else if(pin_query == -1)
     {
       Serial.println("PIN bloqueado. Introducir el codigo PUK: ");
       String puk = readSerial();
       Serial.print("Ahora introducir el nuevo codigo PIN: ");
       user_input = readSerial();
       if(PINManager.checkPUK(puk, user_input) == 0)
       {
         auth = true;
         PINManager.setPINUsed(true);
         Serial.println(oktext);
       }
       else
       {
         Serial.println("PUK incorrecto o nuevo PIN no valido. Intentelo de nuevo!.");
       }
     }

Si hay un error, y el número PIN y PUK están bloqueados, envía un correspondiente mensaje de estado:

else if(pin_query == -2)
     {
       Serial.println("PIN yPUK bloqueados. Use PIN2/PUK2 en un telefono movil.");
       while(true);
     }

Si no hay un número PIN, establecer la bandera de autenticación a true

else
     {
       //SIM no requiere autenticación
       Serial.println("PIN no necesario.");
       auth = true;
     }
   }
  
Compruebe el registro en la red GSM, e indicar si está conectado o no, y si está en itinerancia.

Serial.print("Comprobando registro en la red GSM...");
   if(PINManager.checkReg() == 0)
     Serial.println(oktext);
   else if(PINManager.checkReg() == 1)
     Serial.println("ROAMING " + oktext);
   else
   {
     Serial.println(errortext);
     while(true);
   }
 }

Va a crear una función personalizada para controlar la entrada  del monitor serie. Realiza una función denominada de tipo String.

String readSerial()
 {

Mientras haya información disponible en el monitor serie, leerla en una nueva cadena. Si se encuentra un carácter de nueva línea, volver al programa principal.

String text = "";
   while(1)
   {
     while (Serial.available() > 0)
     {
       char inChar = Serial.read();
       if (inChar == '\n')
       {
         return text;
       }
       if(inChar!='\r')
         text += inChar;
     }
   }
 }

loop () actúa como una herramienta de gestión de PIN, lo que le permite el encendido o apagado PIN, y el cambio de este.

void loop()
 {

   Serial.println("Elegir una opcion:\n1 - On/Off PIN.");
   if(PINManager.getPINUsed())
     Serial.println("2 - Cambio de PIN.");
   String user_op = readSerial();
   if(user_op == "1")
   {
     Serial.println("Introducir nuevo codigo PIN:");
     user_input = readSerial();

     PINManager.switchPIN(user_input);
   }
   else if(user_op == "2" & PINManager.getPINUsed())
   {
     Serial.println("Introducir su actual codigo PIN:");
     String oldPIN = readSerial();
     Serial.println("Ahora introducir el nuevo codigo PIN:");
     String newPIN = readSerial();

     PINManager.changePIN(oldPIN, newPIN);
   }
   else
   {
     Serial.println("Opcion incorrecta. Intentelo de nuevo!.");
   }
   delay(1000);
 }
  
Una vez que se carga el código, abrir el monitor serie para trabajar con el PIN.

El esquema completo se encuentra a continuación.



// Gestion de banda
 
// Este programa, para el escudo Arduino GSM, comprueba la banda actualmente 
// configurada en el módem y le permite cambiarla. 

// Por favor, visite la página http://www.worldtimezone.com/gsm.html 

// Configuraciones habituales: 
// Europa, África, Oriente Medio: E-GSM (900) + DCS (1800) 
// EE.UU., Canadá, América del Sur: GSM (850) + PCS (1900) 
// México: PCS (1900) 
// Brasil: GSM (850) + E-GSM (900) + DCS (1800) + PCS (1900) 

// Circuito: 
// * Escudo GSM 

// Creado 12 de junio de 2012 por Javier Zorzano, Scott Fitzgerald 

// Este ejemplo es de dominio público. 

// bibliotecas
#include <GSM.h>

// initializa la instancia biblioteca
GSMBand band;

void setup() {
  // inicializa las comunicaciones serie y espera a que se abra el puerto:
  Serial.begin(9600);
  while (!Serial) {
    ; // espera a que el puerto serie se conecte. Necesario para Leonardo solamente
  }

  // El gestor de banda comienza reiniciandi el  modem
  Serial.println("Reiniciando el modem...");
  band.begin();
  Serial.println("Modem reiniciado.");

};


void loop() {
  // Obtiene la banda actual
  String bandName = band.getBand(); // Obtiene e imprime el nombre de la banda
  Serial.print("Banda actual:");
  Serial.println(bandName);
  Serial.println("¿Quiere cambiar la banda?");
  String newBandName;
  newBandName = askUser();
  // Avisar al usuario de lo que vamos a hacer ...
  Serial.print("\nConfigurando la banda ");
  Serial.println(newBandName);
  // Cambia la banda
  boolean operationSuccess;
  operationSuccess = band.setBand(newBandName);
  // Avisa al usuario de que el cambio ha sido OK
  if (operationSuccess) {
    Serial.println("Conseguido");
  } else {
    Serial.println("Error mientras se cambiaba la banda");
  }

  if (operationSuccess) {
    while (true);
  }
}

// Esta función ofrece al usuario diferentes opciones
// por medio de la interfaz de serie
// el usuario selecciona una
String askUser() {
  String newBand;
  Serial.println("Seleccionar la banda:");
  // Print the different options
  Serial.println("1 : E-GSM(900)");
  Serial.println("2 : DCS(1800)");
  Serial.println("3 : PCS(1900)");
  Serial.println("4 : E-GSM(900)+DCS(1800) ex: Europa");
  Serial.println("5 : GSM(850)+PCS(1900) Ex: USA, Sudamerica.");
  Serial.println("6 : GSM(850)+E-GSM(900)+DCS(1800)+PCS(1900)");

  // Buffer de entrada vacio
  while (Serial.available()) {
    Serial.read();
  }

  // Espera una respuesta, basta con ver el primer carácter
  while (!Serial.available());
  char c = Serial.read();
  if (c == '1') {
    newBand = GSM_MODE_EGSM;
  } else if (c == '2') {
    newBand = GSM_MODE_DCS;
  } else if (c == '3') {
    newBand = GSM_MODE_PCS;
  } else if (c == '4') {
    newBand = GSM_MODE_EGSM_DCS;
  } else if (c == '5') {
    newBand = GSM_MODE_GSM850_PCS;
  } else if (c == '6') {
    newBand = GSM_MODE_GSM850_EGSM_DCS_PCS;
  } else {
    newBand = "GSM_MODE_UNDEFINED";
  }
  return newBand;


No hay comentarios:

Publicar un comentario