Arduino:Примеры/GSMExamplesPinManagement

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление PIN-блокировкой с помощью GSM Shield[1]

Этот пример, использующий Arduino и модуль GSM Shield, позволяет менять или вовсе удалять PIN-код SIM-карты.

Необходимое оборудование

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • SIM-карта;

Цепь

Изображение модуля GSM Shield, установленного поверх платы Arduino Uno

Код

Для начала импортируем библиотеку GSM.

#include <GSM.h>

Создаем экземпляр класса GSMPin.

GSMPIN PINManager;

Создаем несколько переменных. Строку, которая будет хранить информацию, присланную через Serial Monitor, также boolean-флаг, который будет проверять, правильный ли PIN-код был введен, и, наконец, два статусных сообщения для Serial Monitor.

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

В секции setup() запускаем последовательную передачу данных на компьютер. Запустив соединение, отсылаем на Serial Monitor сообщение, оповещающее о том, что скетч начал работу. Далее вызываем функцию PINManager.begin(), с помощью которой перезагружаем модем.

void setup(){
  Serial.begin(9600); 
  Serial.println("Change PIN example\n");
  PINManager.begin();

Проверяем, заблокирована ли «симка» PIN-кодом.

while(!auth){
    int pin_query = PINManager.isPIN();
    if(pin_query == 1)
    {

Если заблокирована, запрашиваем у пользователя PIN-код через Serial Monitor. Для анализа данных, введенных пользователем, воспользуемся пользовательской функцией readSerial().

Serial.print("Enter PIN code: ");
      user_input = readSerial();

Если PIN-код верен, выставляем флаг auth в значение true, а также отсылаем на Serial Monitor статусное сообщение, информирующее о результате. Если пользователь ввел неправильный PIN-код, он может попробовать снова. После трех неудачных попыток PIN-код будет заблокирован, и разблокировать его можно будет только при помощи PUK-кода.

if(PINManager.checkPIN(user_input) == 0)
      {
        auth = true;
        PINManager.setPINUsed(true);
        Serial.println(oktext);
      }
      else
      {  
        Serial.println("Incorrect PIN. Remember that you have 3 opportunities.");
      }
    }

Если SIM-карта окажется в режиме разблокировки PUK-кодом, запрашиваем PUK и новый PIN.

else if(pin_query == -1)
    {
      Serial.println("PIN locked. Enter PUK code: ");
      String puk = readSerial();
      Serial.print("Now, enter a new PIN code: ");
      user_input = readSerial();
      if(PINManager.checkPUK(puk, user_input) == 0)
      {
        auth = true;
        PINManager.setPINUsed(true);
        Serial.println(oktext);
      }
      else
      {
        Serial.println("Incorrect PUK or invalid new PIN. Try again!.");
      }
    }

Если снова ошибка, а PIN и PUK заблокированы, отправляем соответствующее статусное сообщение.

else if(pin_query == -2)
    {
      Serial.println("PIN & PUK locked. Use PIN2/PUK2 in a mobile phone.");
      while(true);
    }

Если PIN-кода нет, выставляем флаг auth в положение true.

else
    {
      Serial.println("No pin necessary.");
      auth = true;
    }
  }

Проверяем регистрацию в сети GSM. Информируем, подключились мы или нет, а также, находимся ли мы в роуминге.

Serial.print("Checking register in GSM network...");
  if(PINManager.checkReg() == 0)
    Serial.println(oktext);
  else if(PINManager.checkReg() == 1)
    Serial.println("ROAMING " + oktext);  
  else
  {
    Serial.println(errortext);
    while(true);
  }
}

Создаем пользовательскую функцию, которая будет обрабатывать данные, введенные через Serial Monitor. Типом этой функции будет string.

String readSerial()
{

Итак, если в буфере последовательного порта (т.е. в буфере, куда приходит информация, введенная через Serial Monitor) есть какая-либо информация, считываем ее в новую строку. Добравшись до символа новой строки, возвращаемся к главной программе.

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

Блок loop() будет работать в качестве инструмента для управления PIN-кодом, позволяя вам включать и отключать PIN-код, а также менять его.

void loop()
{

  Serial.println("Choose an option:\n1 - On/Off PIN.");
  if(PINManager.getPINUsed())
    Serial.println("2 - Change PIN.");
  String user_op = readSerial();
  if(user_op == "1")
  {
    Serial.println("Enter your PIN code:");
    user_input = readSerial();

    PINManager.switchPIN(user_input);
  }
  else if(user_op == "2" & PINManager.getPINUsed())
  {
    Serial.println("Enter your actual PIN code:");
    String oldPIN = readSerial();
    Serial.println("Now, enter your new PIN code:");
    String newPIN = readSerial();

    PINManager.changePIN(oldPIN, newPIN);
  }
  else
  {
    Serial.println("Incorrect option. Try again!.");
  }
  delay(1000);
}

Чтобы начать работу с PIN-кодом, загрузите скетч, а затем откройте Serial Monitor.

/*
Этот пример помогает вам менять PIN-код SIM-карты, а также удалять его.

Цепь:
* GSM Shield, подключенный к Arduino 
 
Создан 12 июня 2012 Дэвидом дель Пералем (David del Peral).
*/

// Библиотека:
#include <GSM.h>

// Объект для управления PIN-кодом: 
GSMPIN PINManager;

// Строка, в которой будем хранить данные введенные пользователем:
String user_input = "";

// Флаг для аутентификации при помощи PIN-кода:
boolean auth = false;

// Статусные сообщения для показа на Serial Monitor:
String oktext = "OK";
String errortext = "ERROR";  //  "Ошибка"

void setup()
{
  // Инициализируем последовательную передачу данных: 
  Serial.begin(9600);

  Serial.println("Change PIN example\n");  //  "Пример, демонстрирующий смену PIN-кода\n "
  PINManager.begin();

  // Проверяем, заблокирована ли карта PIN-кодом:
  while(!auth){
    int pin_query = PINManager.isPIN();
    if(pin_query == 1)
    {
      // Если SIM-карта заблокирована, вводим PIN-код:
      Serial.print("Enter PIN code: ");  //  "Введите PIN-код: "
      user_input = readSerial();
      // Проверяем PIN-код:
      if(PINManager.checkPIN(user_input) == 0)
      {
        auth = true;
        PINManager.setPINUsed(true);
        Serial.println(oktext);
      }
      else
      {  
        // Если PIN неверен:
        Serial.println("Incorrect PIN. Remember that you have 3 opportunities.");  //  "Неправильный PIN. Помните, что у вас три попытки."
      }
    }
    else if(pin_query == -1)
    {
      // PIN-код заблокирован, пользователю нужно ввести PUK-код:
      Serial.println("PIN locked. Enter PUK code: ");  //  "PIN-код заблокирован. Введите PUK-код: "
      String puk = readSerial();
      Serial.print("Now, enter a new PIN code: ");  //  "Теперь введите новый PIN-код: "
      user_input = readSerial();
      // Проверяем PUK-код:
      if(PINManager.checkPUK(puk, user_input) == 0)
      {
        auth = true;
        PINManager.setPINUsed(true);
        Serial.println(oktext);
}
      else
      {
        // Если PUK или новый PIN неверны:
        Serial.println("Incorrect PUK or invalid new PIN. Try again!.");  //  "Неверный PUK-код или неверный новый PIN-код. Попробуйте снова!"
      }
    }
    else if(pin_query == -2)
    {
      // Наихудшее развитие событий. PIN и PUK Заблокированы:
      Serial.println("PIN & PUK locked. Use PIN2/PUK2 in a mobile phone.");  //  "PIN-код и PUK-код заблокированы. Воспользуйтесь PIN2/PUK2 в вашем мобильном телефоне."
      while(true);
    }
    else
    {
      // SIM-карте не требуется аутентификация: 
      Serial.println("No pin necessary."); //  "PIN-код не нужен."
      auth = true;
    }
  }

  // Запускаем GSM Shield:
  Serial.print("Checking register in GSM network...");  //  "Проверяем регистрацию в сети GSM..."
  if(PINManager.checkReg() == 0)
    Serial.println(oktext);
  // Если вы в зоне роуминга:
  else if(PINManager.checkReg() == 1)
    Serial.println("ROAMING " + oktext);  //  "Роуминг "
  else
  {
    // Ошибка в подключении:
    Serial.println(errortext);
    while(true);
  }
}

void loop()
{
  // Блок loop() создает пользовательское меню для управления PIN.
  // PIN-код можно поменять, только если ваша «симка» имеет PIN-блокировку.
  // В переменной user_op хранятся данные, введенные пользователем. 
  Serial.println("Choose an option:\n1 - On/Off PIN.");  //  "Выберите вариант:\n1 - Вкл/Выкл PIN-блокировку."
  if(PINManager.getPINUsed())
    Serial.println("2 - Change PIN.");  //  "2 – поменять PIN-код."
  String user_op = readSerial();
  if(user_op == "1")
  {
    Serial.println("Enter your PIN code:");  //  "Введите ваш PIN-код:"
    user_input = readSerial();
    // активируем/деактивируем PIN-блокировку:
    PINManager.switchPIN(user_input);
  }
  else if(user_op == "2" & PINManager.getPINUsed())
  {
    Serial.println("Enter your actual PIN code:");  //  "Введите действующий PIN-код:"
    String oldPIN = readSerial();
    Serial.println("Now, enter your new PIN code:");  //  "Теперь введите новый PIN-код:"
    String newPIN = readSerial();
    // Меняем PIN:
    PINManager.changePIN(oldPIN, newPIN);
  }
  else
  {
    Serial.println("Incorrect option. Try again!.");  //  "Неверный вариант. Попробуйте снова!"
  }
  delay(1000);
}

/*
Пользовательская функция для считывания данных, введенных через Serial Monitor.
 */

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

См.также

  1. GSMPIN
  2. begin()
  3. isPIN()
  4. checkPIN()
  5. checkPUK()
  6. changePIN()
  7. switchPIN()
  8. checkReg()
  9. getPINUsed()
  10. setPINUsed()

Внешние ссылки