Arduino:Примеры/GSMExamplesPinManagement: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
 
Нет описания правки
Строка 23: Строка 23:
Для начала импортируем библиотеку '''GSM'''.
Для начала импортируем библиотеку '''GSM'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <GSM.h>
#include <GSM.h>
</syntaxhighlight>
</syntaxhighlight>
Строка 29: Строка 29:
Создаем экземпляр класса '''GSMPin'''.
Создаем экземпляр класса '''GSMPin'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
GSMPIN PINManager;
GSMPIN PINManager;
</syntaxhighlight>
</syntaxhighlight>
Строка 35: Строка 35:
Создаем несколько переменных. Строку, которая будет хранить информацию, присланную через '''Serial Monitor''', также boolean-флаг, который будет проверять, правильный ли '''PIN'''-код был введен, и, наконец, два статусных сообщения для '''Serial Monitor'''.
Создаем несколько переменных. Строку, которая будет хранить информацию, присланную через '''Serial Monitor''', также boolean-флаг, который будет проверять, правильный ли '''PIN'''-код был введен, и, наконец, два статусных сообщения для '''Serial Monitor'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
String user_input = "";
String user_input = "";
boolean auth = false;
boolean auth = false;
Строка 44: Строка 44:
В секции setup() запускаем последовательную передачу данных на компьютер. Запустив соединение, отсылаем на '''Serial Monitor''' сообщение, оповещающее о том, что скетч начал работу. Далее вызываем функцию PINManager.begin(), с помощью которой перезагружаем модем.
В секции setup() запускаем последовательную передачу данных на компьютер. Запустив соединение, отсылаем на '''Serial Monitor''' сообщение, оповещающее о том, что скетч начал работу. Далее вызываем функцию PINManager.begin(), с помощью которой перезагружаем модем.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void setup(){
void setup(){
   Serial.begin(9600);  
   Serial.begin(9600);  
Строка 53: Строка 53:
Проверяем, заблокирована ли '''«симка»''' '''PIN'''-кодом.  
Проверяем, заблокирована ли '''«симка»''' '''PIN'''-кодом.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while(!auth){
while(!auth){
     int pin_query = PINManager.isPIN();
     int pin_query = PINManager.isPIN();
Строка 62: Строка 62:
Если заблокирована, запрашиваем у пользователя '''PIN'''-код через '''Serial Monitor'''. Для анализа данных, введенных пользователем, воспользуемся пользовательской функцией readSerial().
Если заблокирована, запрашиваем у пользователя '''PIN'''-код через '''Serial Monitor'''. Для анализа данных, введенных пользователем, воспользуемся пользовательской функцией readSerial().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.print("Enter PIN code: ");
Serial.print("Enter PIN code: ");
       user_input = readSerial();
       user_input = readSerial();
Строка 69: Строка 69:
Если '''PIN'''-код верен, выставляем флаг auth в значение true, а также отсылаем на '''Serial Monitor''' статусное сообщение, информирующее о результате. Если пользователь ввел неправильный '''PIN'''-код, он может попробовать снова. После трех неудачных попыток '''PIN'''-код будет заблокирован, и разблокировать его можно будет только при помощи '''PUK'''-кода.
Если '''PIN'''-код верен, выставляем флаг auth в значение true, а также отсылаем на '''Serial Monitor''' статусное сообщение, информирующее о результате. Если пользователь ввел неправильный '''PIN'''-код, он может попробовать снова. После трех неудачных попыток '''PIN'''-код будет заблокирован, и разблокировать его можно будет только при помощи '''PUK'''-кода.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
if(PINManager.checkPIN(user_input) == 0)
if(PINManager.checkPIN(user_input) == 0)
       {
       {
Строка 85: Строка 85:
Если '''SIM'''-карта окажется в режиме разблокировки '''PUK'''-кодом, запрашиваем '''PUK''' и новый '''PIN'''.  
Если '''SIM'''-карта окажется в режиме разблокировки '''PUK'''-кодом, запрашиваем '''PUK''' и новый '''PIN'''.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
else if(pin_query == -1)
else if(pin_query == -1)
     {
     {
Строка 107: Строка 107:
Если снова ошибка, а '''PIN''' и '''PUK''' заблокированы, отправляем соответствующее статусное сообщение.
Если снова ошибка, а '''PIN''' и '''PUK''' заблокированы, отправляем соответствующее статусное сообщение.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
else if(pin_query == -2)
else if(pin_query == -2)
     {
     {
Строка 117: Строка 117:
Если '''PIN'''-кода нет, выставляем флаг auth в положение true.  
Если '''PIN'''-кода нет, выставляем флаг auth в положение true.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
else
else
     {
     {
Строка 128: Строка 128:
Проверяем регистрацию в сети '''GSM'''. Информируем, подключились мы или нет, а также, находимся ли мы в роуминге.  
Проверяем регистрацию в сети '''GSM'''. Информируем, подключились мы или нет, а также, находимся ли мы в роуминге.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.print("Checking register in GSM network...");
Serial.print("Checking register in GSM network...");
   if(PINManager.checkReg() == 0)
   if(PINManager.checkReg() == 0)
Строка 144: Строка 144:
Создаем пользовательскую функцию, которая будет обрабатывать данные, введенные через '''Serial Monitor'''. Типом этой функции будет string.
Создаем пользовательскую функцию, которая будет обрабатывать данные, введенные через '''Serial Monitor'''. Типом этой функции будет string.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
String readSerial()
String readSerial()
{
{
Строка 151: Строка 151:
Итак, если в буфере последовательного порта (т.е. в буфере, куда приходит информация, введенная через '''Serial Monitor''') есть какая-либо информация, считываем ее в новую строку. Добравшись до символа новой строки, возвращаемся к главной программе.
Итак, если в буфере последовательного порта (т.е. в буфере, куда приходит информация, введенная через '''Serial Monitor''') есть какая-либо информация, считываем ее в новую строку. Добравшись до символа новой строки, возвращаемся к главной программе.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
String text = "";
String text = "";
   while(1)
   while(1)
Строка 171: Строка 171:
Блок loop() будет работать в качестве инструмента для управления '''PIN'''-кодом, позволяя вам включать и отключать '''PIN'''-код, а также менять его.
Блок loop() будет работать в качестве инструмента для управления '''PIN'''-кодом, позволяя вам включать и отключать '''PIN'''-код, а также менять его.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void loop()
void loop()
{
{
Строка 205: Строка 205:
Чтобы начать работу с '''PIN'''-кодом, загрузите скетч, а затем откройте '''Serial Monitor'''.  
Чтобы начать работу с '''PIN'''-кодом, загрузите скетч, а затем откройте '''Serial Monitor'''.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Этот пример помогает вам менять PIN-код SIM-карты, а также удалять его.
Этот пример помогает вам менять PIN-код SIM-карты, а также удалять его.

Версия от 12:32, 20 мая 2023

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


Управление 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()

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