Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GSMExamplesPinManagement

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

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

Цепь

GSMShield ArduinoUno.png

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

Код

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

  1. #include <GSM.h>

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

  1. GSMPIN PINManager;

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

  1. String user_input = "";
  2. boolean auth = false;
  3. String oktext = "OK";
  4. String errortext = "ERROR";

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

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

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

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

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

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

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

  1. if(PINManager.checkPIN(user_input) == 0)
  2.       {
  3.         auth = true;
  4.         PINManager.setPINUsed(true);
  5.         Serial.println(oktext);
  6.       }
  7.       else
  8.       {  
  9.         Serial.println("Incorrect PIN. Remember that you have 3 opportunities.");
  10.       }
  11.     }

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

  1. else if(pin_query == -1)
  2.     {
  3.       Serial.println("PIN locked. Enter PUK code: ");
  4.       String puk = readSerial();
  5.       Serial.print("Now, enter a new PIN code: ");
  6.       user_input = readSerial();
  7.       if(PINManager.checkPUK(puk, user_input) == 0)
  8.       {
  9.         auth = true;
  10.         PINManager.setPINUsed(true);
  11.         Serial.println(oktext);
  12.       }
  13.       else
  14.       {
  15.         Serial.println("Incorrect PUK or invalid new PIN. Try again!.");
  16.       }
  17.     }

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

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

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

  1. else
  2.     {
  3.       Serial.println("No pin necessary.");
  4.       auth = true;
  5.     }
  6.   }

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

  1. Serial.print("Checking register in GSM network...");
  2.   if(PINManager.checkReg() == 0)
  3.     Serial.println(oktext);
  4.   else if(PINManager.checkReg() == 1)
  5.     Serial.println("ROAMING " + oktext);  
  6.   else
  7.   {
  8.     Serial.println(errortext);
  9.     while(true);
  10.   }
  11. }

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

  1. String readSerial()
  2. {

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

  1. String text = "";
  2.   while(1)
  3.   {
  4.     while (Serial.available() > 0)
  5.     {
  6.       char inChar = Serial.read();
  7.       if (inChar == '\n')
  8.       {
  9.         return text;
  10.       }
  11.       if(inChar!='\r')
  12.         text += inChar;
  13.     }
  14.   }
  15. }

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

  1. void loop()
  2. {
  3.  
  4.   Serial.println("Choose an option:\n1 - On/Off PIN.");
  5.   if(PINManager.getPINUsed())
  6.     Serial.println("2 - Change PIN.");
  7.   String user_op = readSerial();
  8.   if(user_op == "1")
  9.   {
  10.     Serial.println("Enter your PIN code:");
  11.     user_input = readSerial();
  12.  
  13.     PINManager.switchPIN(user_input);
  14.   }
  15.   else if(user_op == "2" & PINManager.getPINUsed())
  16.   {
  17.     Serial.println("Enter your actual PIN code:");
  18.     String oldPIN = readSerial();
  19.     Serial.println("Now, enter your new PIN code:");
  20.     String newPIN = readSerial();
  21.  
  22.     PINManager.changePIN(oldPIN, newPIN);
  23.   }
  24.   else
  25.   {
  26.     Serial.println("Incorrect option. Try again!.");
  27.   }
  28.   delay(1000);
  29. }

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

  1. /*
  2. Этот пример помогает вам менять PIN-код SIM-карты, а также удалять его.
  3.  
  4. Цепь:
  5. * GSM Shield, подключенный к Arduino
  6.  
  7. Создан 12 июня 2012 Дэвидом дель Пералем (David del Peral).
  8. */
  9.  
  10. // Библиотека:
  11. #include <GSM.h>
  12.  
  13. // Объект для управления PIN-кодом:
  14. GSMPIN PINManager;
  15.  
  16. // Строка, в которой будем хранить данные введенные пользователем:
  17. String user_input = "";
  18.  
  19. // Флаг для аутентификации при помощи PIN-кода:
  20. boolean auth = false;
  21.  
  22. // Статусные сообщения для показа на Serial Monitor:
  23. String oktext = "OK";
  24. String errortext = "ERROR";  //  "Ошибка"
  25.  
  26. void setup()
  27. {
  28.   // Инициализируем последовательную передачу данных:
  29.   Serial.begin(9600);
  30.  
  31.   Serial.println("Change PIN example\n");  //  "Пример, демонстрирующий смену PIN-кода\n "
  32.   PINManager.begin();
  33.  
  34.   // Проверяем, заблокирована ли карта PIN-кодом:
  35.   while(!auth){
  36.     int pin_query = PINManager.isPIN();
  37.     if(pin_query == 1)
  38.     {
  39.       // Если SIM-карта заблокирована, вводим PIN-код:
  40.       Serial.print("Enter PIN code: ");  //  "Введите PIN-код: "
  41.       user_input = readSerial();
  42.       // Проверяем PIN-код:
  43.       if(PINManager.checkPIN(user_input) == 0)
  44.       {
  45.         auth = true;
  46.         PINManager.setPINUsed(true);
  47.         Serial.println(oktext);
  48.       }
  49.       else
  50.       {  
  51.         // Если PIN неверен:
  52.         Serial.println("Incorrect PIN. Remember that you have 3 opportunities.");  //  "Неправильный PIN. Помните, что у вас три попытки."
  53.       }
  54.     }
  55.     else if(pin_query == -1)
  56.     {
  57.       // PIN-код заблокирован, пользователю нужно ввести PUK-код:
  58.       Serial.println("PIN locked. Enter PUK code: ");  //  "PIN-код заблокирован. Введите PUK-код: "
  59.       String puk = readSerial();
  60.       Serial.print("Now, enter a new PIN code: ");  //  "Теперь введите новый PIN-код: "
  61.       user_input = readSerial();
  62.       // Проверяем PUK-код:
  63.       if(PINManager.checkPUK(puk, user_input) == 0)
  64.       {
  65.         auth = true;
  66.         PINManager.setPINUsed(true);
  67.         Serial.println(oktext);
  68. }
  69.       else
  70.       {
  71.         // Если PUK или новый PIN неверны:
  72.         Serial.println("Incorrect PUK or invalid new PIN. Try again!.");  //  "Неверный PUK-код или неверный новый PIN-код. Попробуйте снова!"
  73.       }
  74.     }
  75.     else if(pin_query == -2)
  76.     {
  77.       // Наихудшее развитие событий. PIN и PUK Заблокированы:
  78.       Serial.println("PIN & PUK locked. Use PIN2/PUK2 in a mobile phone.");  //  "PIN-код и PUK-код заблокированы. Воспользуйтесь PIN2/PUK2 в вашем мобильном телефоне."
  79.       while(true);
  80.     }
  81.     else
  82.     {
  83.       // SIM-карте не требуется аутентификация:
  84.       Serial.println("No pin necessary."); //  "PIN-код не нужен."
  85.       auth = true;
  86.     }
  87.   }
  88.  
  89.   // Запускаем GSM Shield:
  90.   Serial.print("Checking register in GSM network...");  //  "Проверяем регистрацию в сети GSM..."
  91.   if(PINManager.checkReg() == 0)
  92.     Serial.println(oktext);
  93.   // Если вы в зоне роуминга:
  94.   else if(PINManager.checkReg() == 1)
  95.     Serial.println("ROAMING " + oktext);  //  "Роуминг "
  96.   else
  97.   {
  98.     // Ошибка в подключении:
  99.     Serial.println(errortext);
  100.     while(true);
  101.   }
  102. }
  103.  
  104. void loop()
  105. {
  106.   // Блок loop() создает пользовательское меню для управления PIN.
  107.   // PIN-код можно поменять, только если ваша «симка» имеет PIN-блокировку.
  108.   // В переменной user_op хранятся данные, введенные пользователем.
  109.   Serial.println("Choose an option:\n1 - On/Off PIN.");  //  "Выберите вариант:\n1 - Вкл/Выкл PIN-блокировку."
  110.   if(PINManager.getPINUsed())
  111.     Serial.println("2 - Change PIN.");  //  "2 – поменять PIN-код."
  112.   String user_op = readSerial();
  113.   if(user_op == "1")
  114.   {
  115.     Serial.println("Enter your PIN code:");  //  "Введите ваш PIN-код:"
  116.     user_input = readSerial();
  117.     // активируем/деактивируем PIN-блокировку:
  118.     PINManager.switchPIN(user_input);
  119.   }
  120.   else if(user_op == "2" & PINManager.getPINUsed())
  121.   {
  122.     Serial.println("Enter your actual PIN code:");  //  "Введите действующий PIN-код:"
  123.     String oldPIN = readSerial();
  124.     Serial.println("Now, enter your new PIN code:");  //  "Теперь введите новый PIN-код:"
  125.     String newPIN = readSerial();
  126.     // Меняем PIN:
  127.     PINManager.changePIN(oldPIN, newPIN);
  128.   }
  129.   else
  130.   {
  131.     Serial.println("Incorrect option. Try again!.");  //  "Неверный вариант. Попробуйте снова!"
  132.   }
  133.   delay(1000);
  134. }
  135.  
  136. /*
  137. Пользовательская функция для считывания данных, введенных через Serial Monitor.
  138.  */
  139.  
  140. String readSerial()
  141. {
  142.   String text = "";
  143.   while(1)
  144.   {
  145.     while (Serial.available() > 0)
  146.     {
  147.       char inChar = Serial.read();
  148.       if (inChar == '\n')
  149.       {
  150.         return text;
  151.       }
  152.       if(inChar!='\r')
  153.         text += inChar;
  154.     }
  155.   }
  156. }

См.также

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

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

  1. Arduino - GSM PIN Management