Arduino:Примеры/GSMExamplesTestGPRS: различия между версиями
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">») |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 25: | Строка 25: | ||
Для начала импортируем библиотеку '''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> | ||
Строка 31: | Строка 31: | ||
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В этом случае его нужно определить в качестве константы, для чего мы воспользуемся директивой #define. Если у вашей '''SIM'''-карты '''PIN'''-кода нет, значит оставляем это место пустым. | Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В этом случае его нужно определить в качестве константы, для чего мы воспользуемся директивой #define. Если у вашей '''SIM'''-карты '''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"> | ||
#define PINNUMBER "" | #define PINNUMBER "" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 37: | Строка 37: | ||
Создаем экземпляры классов '''GSM, GPRS и GSMClient'''. | Создаем экземпляры классов '''GSM, GPRS и GSMClient'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
GSMClient client; | GSMClient client; | ||
GPRS gprsAccess; | GPRS gprsAccess; | ||
Строка 45: | Строка 45: | ||
Создаем пару статусных сообщений, которые в случае необходимости будем отправлять на '''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 oktext = "OK"; | String oktext = "OK"; | ||
String errortext = "ERROR"; | String errortext = "ERROR"; | ||
Строка 52: | Строка 52: | ||
Создаем несколько переменных, которые будут содержать информацию о сервере, пути и прокси, к которому вы собираетесь подключиться. | Создаем несколько переменных, которые будут содержать информацию о сервере, пути и прокси, к которому вы собираетесь подключиться. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
char url[] = "arduino.cc"; | char url[] = "arduino.cc"; | ||
char path[] = "/"; | char path[] = "/"; | ||
Строка 60: | Строка 60: | ||
Создаем переменную, в которой будет храниться ответ от сервера, а также еще одну переменную, информирующую о том, будете ли вы использовать прокси или нет. | Создаем переменную, в которой будет храниться ответ от сервера, а также еще одну переменную, информирующую о том, будете ли вы использовать прокси или нет. | ||
<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 response = ""; | String response = ""; | ||
boolean use_proxy = false; | boolean use_proxy = false; | ||
Строка 67: | Строка 67: | ||
В секции setup() инициализируем последовательную передачу данных. | В секции setup() инициализируем последовательную передачу данных. | ||
<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); | ||
Строка 75: | Строка 75: | ||
Теперь создадим пользовательскую функцию, которая будет обрабатывать входящие данные, идущие через последовательный порт. Аргументом у этой функции будет массив типа char. | Теперь создадим пользовательскую функцию, которая будет обрабатывать входящие данные, идущие через последовательный порт. Аргументом у этой функции будет массив типа char. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int readSerial(char result[]) | int readSerial(char result[]) | ||
{ | { | ||
Строка 82: | Строка 82: | ||
Создаем переменную, которая будет работать счетчиком. Если через последовательный порт будет прибывать информация, мы будем считывать ее в char-массив. Если среди входящих данных попадется символ новой строки, удаляем этот массив и возвращаемся к главному циклу программы. | Создаем переменную, которая будет работать счетчиком. Если через последовательный порт будет прибывать информация, мы будем считывать ее в char-массив. Если среди входящих данных попадется символ новой строки, удаляем этот массив и возвращаемся к главному циклу программы. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int i = 0; | int i = 0; | ||
while(1) | while(1) | ||
Строка 106: | Строка 106: | ||
В секции loop() устанавливаем «флаг» для прокси в положение false. | В секции loop() устанавливаем «флаг» для прокси в положение false. | ||
<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() | ||
{ | { | ||
Строка 114: | Строка 114: | ||
Запускаем соединение с сетью '''GSM''', '''«скармливая»''' функции gsmAccess.begin() аргумент в виде '''PIN'''-кода '''SIM'''-карты. | Запускаем соединение с сетью '''GSM''', '''«скармливая»''' функции gsmAccess.begin() аргумент в виде '''PIN'''-кода '''SIM'''-карты. | ||
<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("Connecting GSM network..."); | Serial.print("Connecting GSM network..."); | ||
if(gsmAccess.begin(PINNUMBER)!=GSM_READY) | if(gsmAccess.begin(PINNUMBER)!=GSM_READY) | ||
Строка 126: | Строка 126: | ||
Создаем массив типа char, в котором будем держать '''APN'''. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт. | Создаем массив типа char, в котором будем держать '''APN'''. Далее используем созданную нами функцию 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"> | ||
char apn[50]; | char apn[50]; | ||
Serial.print("Enter your APN: "); | Serial.print("Enter your APN: "); | ||
Строка 135: | Строка 135: | ||
Создаем массив типа char, в котором будем держать логин к '''APN'''. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт. | Создаем массив типа char, в котором будем держать логин к '''APN'''. Далее используем созданную нами функцию 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"> | ||
char login[50]; | char login[50]; | ||
Serial.print("Now, enter your login: "); | Serial.print("Now, enter your login: "); | ||
Строка 144: | Строка 144: | ||
Создаем массив типа char, в котором будем держать пароль к '''APN'''. Затем используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт. | Создаем массив типа char, в котором будем держать пароль к '''APN'''. Затем используем созданную нами функцию 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"> | ||
char password[20]; | char password[20]; | ||
Serial.print("Finally, enter your password: "); | Serial.print("Finally, enter your password: "); | ||
Строка 153: | Строка 153: | ||
Когда модем подключит себя к '''GPRS''', функция gsmAccess() вернет значение '''GSM_READY'''. | Когда модем подключит себя к '''GPRS''', функция gsmAccess() вернет значение '''GSM_READY'''. | ||
<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.println("Attaching to GPRS with your APN..."); | Serial.println("Attaching to GPRS with your APN..."); | ||
if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY) | if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY) | ||
Строка 166: | Строка 166: | ||
Создаем массив типа char, где будет храниться любая необходимая нам информация о прокси. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт. | Создаем массив типа char, где будет храниться любая необходимая нам информация о прокси. Далее используем созданную нами функцию 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"> | ||
char proxy[100]; | char proxy[100]; | ||
Serial.print("If your carrier uses a proxy, enter it, if not press enter: "); | Serial.print("If your carrier uses a proxy, enter it, if not press enter: "); | ||
Строка 175: | Строка 175: | ||
Если прокси определился, запрашиваем номер порта и выставляем '''«флаг»''' прокси на true. | Если прокси определился, запрашиваем номер порта и выставляем '''«флаг»''' прокси на 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"> | ||
int pport; | int pport; | ||
if(proxy[0] != '\0'){ | if(proxy[0] != '\0'){ | ||
Строка 191: | Строка 191: | ||
Создаем переменную, которая будет указывать, подключились вы к серверу или нет. Подключаемся к серверу при помощи функции client.connect(). То, каким образом вы создаете соединение, будет зависеть от того, используете вы прокси или нет. | Создаем переменную, которая будет указывать, подключились вы к серверу или нет. Подключаемся к серверу при помощи функции client.connect(). То, каким образом вы создаете соединение, будет зависеть от того, используете вы прокси или нет. | ||
<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("Connecting and sending GET request to arduino.cc..."); | Serial.print("Connecting and sending GET request to arduino.cc..."); | ||
int res_connect; | int res_connect; | ||
Строка 203: | Строка 203: | ||
Если подключились, делаем запрос '''HTTP GET''' при помощи функции client.print(). | Если подключились, делаем запрос '''HTTP GET''' при помощи функции client.print(). | ||
<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 (res_connect) | if (res_connect) | ||
{ | { | ||
Строка 221: | Строка 221: | ||
Если подключиться не получилось, сообщаем об ошибке. | Если подключиться не получилось, сообщаем об ошибке. | ||
<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 | ||
{ | { | ||
Строка 230: | Строка 230: | ||
При помощи функции client.available() проверяем, пришли от сервера какие-нибудь байты или нет. Если да, считываем их в строку response, а затем «заливаем» в char-массив. Проверяем массив подстрокой '''«200 OK»''', которая указывает на корректный ответ от '''arduino.cc'''. | При помощи функции client.available() проверяем, пришли от сервера какие-нибудь байты или нет. Если да, считываем их в строку response, а затем «заливаем» в char-массив. Проверяем массив подстрокой '''«200 OK»''', которая указывает на корректный ответ от '''arduino.cc'''. | ||
<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("Receiving response..."); | Serial.print("Receiving response..."); | ||
Строка 254: | Строка 254: | ||
Если сервер отключился, останавливаем работу клиента и закрываем блок loop(). | Если сервер отключился, останавливаем работу клиента и закрываем блок loop(). | ||
<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 (!client.connected()) | if (!client.connected()) | ||
{ | { | ||
Строка 269: | Строка 269: | ||
Итак, чтобы увидеть статус соединения, загрузите код и откройте '''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"> | ||
/* | /* | ||
Строка 473: | Строка 473: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Портал/Arduino}} | |||
[[Категория:Пример]] | [[Категория:Пример]] | ||
[[Категория:Примеры]] | [[Категория:Примеры]] | ||
[[Категория:Пример программирования Arduino]] | [[Категория:Пример программирования Arduino]] | ||
[[Категория:Примеры программирования Arduino]] | [[Категория:Примеры программирования Arduino]] |
Текущая версия от 12:35, 8 июля 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Тест GPRS при помощи GPS Shield[1]
Этот скетч тестирует GPRS-связь на модуле GSM Shield. Он пытается подключиться к странице arduino.cc.
Чтобы использовать GPRS на GPS Shield, вам нужно знать APN (Access Point Name, т.е. имя точки доступа), логин и пароль. Информацию об этом (включая самые последние обновления) можно узнать у своего оператора связи. На этой странице можно найти настройки для различных операторов, но учтите, что она может быть устаревшей.
Необходимое оборудование
- Плата Arduino;
- Модуль Arduino + Telefonica GSM/GPRS Shield;
- SIM-карта с возможностью передачи данных;
Цепь
Модуль Arduino GSM Shield, установленный поверх Arduino Uno
Код
Для начала импортируем библиотеку GSM.
#include <GSM.h>
Функционал SIM-карты может быть заблокирован PIN-кодом. В этом случае его нужно определить в качестве константы, для чего мы воспользуемся директивой #define. Если у вашей SIM-карты PIN-кода нет, значит оставляем это место пустым.
#define PINNUMBER ""
Создаем экземпляры классов GSM, GPRS и GSMClient.
GSMClient client;
GPRS gprsAccess;
GSM gsmAccess;
Создаем пару статусных сообщений, которые в случае необходимости будем отправлять на Serial Monitor.
String oktext = "OK";
String errortext = "ERROR";
Создаем несколько переменных, которые будут содержать информацию о сервере, пути и прокси, к которому вы собираетесь подключиться.
char url[] = "arduino.cc";
char path[] = "/";
char urlproxy[] = "http://arduino.cc";
Создаем переменную, в которой будет храниться ответ от сервера, а также еще одну переменную, информирующую о том, будете ли вы использовать прокси или нет.
String response = "";
boolean use_proxy = false;
В секции setup() инициализируем последовательную передачу данных.
void setup(){
Serial.begin(9600);
}
Теперь создадим пользовательскую функцию, которая будет обрабатывать входящие данные, идущие через последовательный порт. Аргументом у этой функции будет массив типа char.
int readSerial(char result[])
{
Создаем переменную, которая будет работать счетчиком. Если через последовательный порт будет прибывать информация, мы будем считывать ее в char-массив. Если среди входящих данных попадется символ новой строки, удаляем этот массив и возвращаемся к главному циклу программы.
int i = 0;
while(1)
{
while (Serial.available() > 0)
{
char inChar = Serial.read();
if (inChar == '\n')
{
result[i] = '\0';
return 0;
}
if(inChar!='\r')
{
result[i] = inChar;
i++;
}
}
}
}
В секции loop() устанавливаем «флаг» для прокси в положение false.
void loop()
{
use_proxy = false;
Запускаем соединение с сетью GSM, «скармливая» функции gsmAccess.begin() аргумент в виде PIN-кода SIM-карты.
Serial.print("Connecting GSM network...");
if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
{
Serial.println(errortext);
while(true);
}
Serial.println(oktext);
Создаем массив типа char, в котором будем держать APN. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.
char apn[50];
Serial.print("Enter your APN: ");
readSerial(apn);
Serial.println(apn);
Создаем массив типа char, в котором будем держать логин к APN. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.
char login[50];
Serial.print("Now, enter your login: ");
readSerial(login);
Serial.println(login);
Создаем массив типа char, в котором будем держать пароль к APN. Затем используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.
char password[20];
Serial.print("Finally, enter your password: ");
readSerial(password);
Подключаемся к GPRS при помощи функции gprs.attachGPRS(). В качестве аргументов ей требуются как раз введенные вами ранее APN, логин и пароль. Когда модем подключит себя к GPRS, функция gsmAccess() вернет значение GSM_READY.
Serial.println("Attaching to GPRS with your APN...");
if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
{
Serial.println(errortext);
}
else{
Serial.println(oktext);
Создаем массив типа char, где будет храниться любая необходимая нам информация о прокси. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.
char proxy[100];
Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");
readSerial(proxy);
Serial.println(proxy);
Если прокси определился, запрашиваем номер порта и выставляем «флаг» прокси на true.
int pport;
if(proxy[0] != '\0'){
// read proxy port introduced by user
char proxyport[10];
Serial.print("Enter the proxy port: ");
readSerial(proxyport);
// cast proxy port introduced to integer
pport = (int) proxyport;
use_proxy = true;
Serial.println(proxyport);
}
Создаем переменную, которая будет указывать, подключились вы к серверу или нет. Подключаемся к серверу при помощи функции client.connect(). То, каким образом вы создаете соединение, будет зависеть от того, используете вы прокси или нет.
Serial.print("Connecting and sending GET request to arduino.cc...");
int res_connect;
if(use_proxy)
res_connect = client.connect(proxy, pport);
else
res_connect = client.connect(url, 80);
Если подключились, делаем запрос HTTP GET при помощи функции client.print().
if (res_connect)
{
client.print("GET ");
if(use_proxy)
client.print(urlproxy);
else
client.print(path);
client.println(" HTTP/1.0");
client.println();
Serial.println(oktext);
}
Если подключиться не получилось, сообщаем об ошибке.
else
{
Serial.println(errortext);
}
При помощи функции client.available() проверяем, пришли от сервера какие-нибудь байты или нет. Если да, считываем их в строку response, а затем «заливаем» в char-массив. Проверяем массив подстрокой «200 OK», которая указывает на корректный ответ от arduino.cc.
Serial.print("Receiving response...");
boolean test = true;
while(test)
{
if (client.available())
{
char c = client.read();
response += c;
char responsechar[response.length()+1];
response.toCharArray(responsechar, response.length()+1);
if(strstr(responsechar, "200 OK") != NULL){
Serial.println(oktext);
Serial.println("TEST COMPLETE!");
test = false;
}
}
Если сервер отключился, останавливаем работу клиента и закрываем блок loop().
if (!client.connected())
{
Serial.println();
Serial.println("disconnecting.");
client.stop();
test = false;
}
}
}
}
Итак, чтобы увидеть статус соединения, загрузите код и откройте Serial Monitor.
/*
Этот тест запрашивает данные об APN, а затем при помощи GPRS
пытается подключиться к arduino.cc.
Цепь:
* GSM Shield, подключенный к Arduino
Создан 18 июня 2012 Дэвидом дель Пералем (David del Peral).
*/
// Библиотеки:
#include <GSM.h>
// PIN-код:
#define PINNUMBER ""
// Создаем экземпляры классов:
GSM gsmAccess; // доступ к GSM (включая параметр «true» для активации отладки)
GPRS gprsAccess; // доступ к GPRS
GSMClient client; // клиентский сервис для соединения по TCP
// Сообщения для ответа через Serial Monitor:
String oktext = "OK";
String errortext = "ERROR"; // "Ошибка"
// URL и путь (например, arduino.cc)
char url[] = "arduino.cc";
char urlproxy[] = "http://arduino.cc";
char path[] = "/";
// Переменная для хранения принятого ответа:
String response = "";
// Используем прокси:
boolean use_proxy = false;
void setup()
{
// Инициализируем последовательную передачу данных:
Serial.begin(9600);
}
void loop()
{
use_proxy = false;
// Запускаем GSM Shield.
// Если у вашей SIM-карты есть PIN-код, указываем его параметром в функции begin():
Serial.print("Connecting GSM network..."); // "Подключение к сети GSM..."
if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
{
Serial.println(errortext);
while(true);
}
Serial.println(oktext);
// Считываем APN, введенный пользователем:
char apn[50];
Serial.print("Enter your APN: "); // "Введите ваш APN: "
readSerial(apn);
Serial.println(apn);
// Считываем логин к APN, введенный пользователем:
char login[50];
Serial.print("Now, enter your login: "); // "Теперь введите логин: "
readSerial(login);
Serial.println(login);
// Считываем пароль к APN, введенный пользователем:
char password[20];
Serial.print("Finally, enter your password: "); // "Наконец, введите пароль: "
readSerial(password);
// Подключаемся к GPRS:
Serial.println("Attaching to GPRS with your APN..."); // "Подключаемся к GPRS с помощью ваших данных об APN..."
if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
{
Serial.println(errortext);
}
else{
Serial.println(oktext);
// Считываем данные о прокси, введенные пользователем:
char proxy[100];
Serial.print("If your carrier uses a proxy, enter it, if not press enter: "); // "Если ваш оператор использует прокси, введите его, если нет – нажмите Enter"
readSerial(proxy);
Serial.println(proxy);
// Если пользователь указал прокси, запрашиваем у него прокси-порт:
int pport;
if(proxy[0] != '\0'){
// Считываем прокси-порт, введенный пользователем:
char proxyport[10];
Serial.print("Enter the proxy port: "); // "Введите прокси-порт: "
readSerial(proxyport);
// «Заливаем» этот прокси-порт в переменную pport:
pport = (int) proxyport;
use_proxy = true;
Serial.println(proxyport);
}
// Подключаемся к arduino.cc и выполняем HTTP-запрос:
Serial.print("Connecting and sending GET request to arduino.cc..."); // "Подключение и отправка GET-запроса на arduino.cc..."
int res_connect;
// Если используется прокси, подключаемся с его помощью:
if(use_proxy)
res_connect = client.connect(proxy, pport);
else
res_connect = client.connect(url, 80);
if (res_connect)
{
// Далем запрос типа HTTP 1.0 GET («клиент отправляет запрос»)
client.print("GET ");
// Если используется прокси, то путь – URL-ссылка arduino.cc:
if(use_proxy)
client.print(urlproxy);
else
client.print(path);
client.println(" HTTP/1.0");
client.println();
Serial.println(oktext);
}
else
{
// Если подключиться к серверу не получилось:
Serial.println(errortext);
}
Serial.print("Receiving response..."); // "Отправка ответа..."
boolean test = true;
while(test)
{
// Если от сервера есть входящие байты, считываем их и проверяем:
if (client.available())
{
char c = client.read();
response += c;
// «Выливаем» полученный ответ из строки в char-массив:
char responsechar[response.length()+1];
response.toCharArray(responsechar, response.length()+1);
// Если ответ включает подстроку «200 ОК»:
if(strstr(responsechar, "200 OK") != NULL){
Serial.println(oktext);
Serial.println("TEST COMPLETE!"); // "Тест завершен!"
test = false;
}
}
// Если сервер отключился, останавливаем работу клиента:
if (!client.connected())
{
Serial.println();
Serial.println("disconnecting."); // "Отключение."
client.stop();
test = false;
}
}
}
}
/*
Пользовательская функция для считывания входящих данных
*/
int readSerial(char result[])
{
int i = 0;
while(1)
{
while (Serial.available() > 0)
{
char inChar = Serial.read();
if (inChar == '\n')
{
result[i] = '\0';
return 0;
}
if(inChar!='\r')
{
result[i] = inChar;
i++;
}
}
}
}
См.также
- GPRS Constructor
- GSMClient Constructor
- attachGPRS()
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino