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
- Placa Arduino or Genuino
- Escudo GSM/GPRS Telefonica + Arduino
- Tarjeta SIM
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";
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();
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)
{
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();
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.");
}
}
{
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!.");
}
}
{
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);
}
{
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;
}
}
{
//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);
}
}
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;
}
}
}
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);
}
{
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