Arduino:Примеры/GSMExamplesPinManagement: различия между версиями
Myagkij (обсуждение | вклад) м (Замена текста — «<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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Этот пример помогает вам менять PIN-код SIM-карты, а также удалять его. | Этот пример помогает вам менять PIN-код SIM-карты, а также удалять его. |
Версия от 12:32, 20 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Управление 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;
}
}
}
См.также
- GSMPIN
- begin()
- isPIN()
- checkPIN()
- checkPUK()
- changePIN()
- switchPIN()
- checkReg()
- getPINUsed()
- setPINUsed()