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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<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 промежуточная версия этого же участника)
Строка 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:
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В таком случае определяем этот '''PIN'''-код как константу при помощи директивы #define. Если '''PIN'''-кода нет, оставляем вместо него пустое место.
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В таком случае определяем этот '''PIN'''-код как константу при помощи директивы #define. Если '''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">
#define PINNUMBER ""
#define PINNUMBER ""
</syntaxhighlight>
</syntaxhighlight>
Строка 35: Строка 35:
Определяем еще несколько констант, содержащих информацию о '''GPRS'''-сети, к которой вы собираетесь подключиться. Вам понадобится '''APN''' ('''Access Point Name''', т.е. имя точки доступа), логин и пароль. Чтобы узнать всю эту информацию (включая самые последние обновления), свяжитесь со своим оператором. На [http://forums.pinstack.com/f24/tcp_apn_wap_gateway_port_carrier_settings-360 этой странице] можно найти настройки от различных операторов, но учтите, что она может быть устаревшей.
Определяем еще несколько констант, содержащих информацию о '''GPRS'''-сети, к которой вы собираетесь подключиться. Вам понадобится '''APN''' ('''Access Point Name''', т.е. имя точки доступа), логин и пароль. Чтобы узнать всю эту информацию (включая самые последние обновления), свяжитесь со своим оператором. На [http://forums.pinstack.com/f24/tcp_apn_wap_gateway_port_carrier_settings-360 этой странице] можно найти настройки от различных операторов, но учтите, что она может быть устаревшей.


<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">
#define GPRS_APN      "GPRS_APN"  
#define GPRS_APN      "GPRS_APN"  
#define GPRS_LOGIN    "login"
#define GPRS_LOGIN    "login"
Строка 43: Строка 43:
Создаем экземпляры классов '''GSM''', '''GPRS''' и '''GSMClient'''.
Создаем экземпляры классов '''GSM''', '''GPRS''' и '''GSMClient'''.


<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">
GSMClient client;
GSMClient client;
GPRS gprs;
GPRS gprs;
Строка 51: Строка 51:
Создаем несколько переменных, в которых будем держать информацию о сервере, пути и порте, к которому вы собираетесь подключиться.  
Создаем несколько переменных, в которых будем держать информацию о сервере, пути и порте, к которому вы собираетесь подключиться.  


<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">
char server[] = "arduino.cc";
char server[] = "arduino.cc";
char path[] = "/";
char path[] = "/";
Строка 59: Строка 59:
В секции setup() инициализируем последовательную передачу данных. Запустив соединение, отсылаем сообщение, оповещающее о начале работы скетча.
В секции setup() инициализируем последовательную передачу данных. Запустив соединение, отсылаем сообщение, оповещающее о начале работы скетча.


<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);  
Строка 67: Строка 67:
Создаем локальную переменную для отслеживания статуса соединения. Она потребуется для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети.
Создаем локальную переменную для отслеживания статуса соединения. Она потребуется для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети.


<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">
boolean notConnected = true;
boolean notConnected = true;
</syntaxhighlight>
</syntaxhighlight>
Строка 75: Строка 75:
Когда модем подключится и соединит себя с '''GPRS'''-сетью, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false. Если подключиться не удастся, сообщаем об этом на '''Serial Monitor.'''  
Когда модем подключится и соединит себя с '''GPRS'''-сетью, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false. Если подключиться не удастся, сообщаем об этом на '''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">
while(notConnected)
while(notConnected)
   {
   {
Строка 91: Строка 91:
Пытаемся подключиться к серверу при помощи функции client.connect(). Ей требуется два аргумента – сервер и порт. Подключившись к серверу, при помощи функции client.print() делаем '''HTTP'''-запрос. Стандартный веб-запрос выглядит примерно так: '''«GET pathname HTTP/1.0»'''. При этом функция client.print() отправит сообщение – как это обычно делает браузер.
Пытаемся подключиться к серверу при помощи функции client.connect(). Ей требуется два аргумента – сервер и порт. Подключившись к серверу, при помощи функции client.print() делаем '''HTTP'''-запрос. Стандартный веб-запрос выглядит примерно так: '''«GET pathname HTTP/1.0»'''. При этом функция client.print() отправит сообщение – как это обычно делает браузер.


<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 (client.connect(server, port))
if (client.connect(server, port))
   {
   {
Строка 104: Строка 104:
Если подключиться к серверу не удалось, сообщаем об этом на '''Serial Monitor''' и закрываем блок setup().
Если подключиться к серверу не удалось, сообщаем об этом на '''Serial Monitor''' и закрываем блок setup().


<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
   {
   {
Строка 114: Строка 114:
В секции loop() проверяем, вернулись ли от сервера какие-нибудь байты. Если да, считываем их и выводим на '''Serial Monitor'''.
В секции loop() проверяем, вернулись ли от сервера какие-нибудь байты. Если да, считываем их и выводим на '''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">
if (client.available())
if (client.available())
   {
   {
Строка 124: Строка 124:
Если сервер отключился, что он обычно делает после выполнения '''HTTP'''-запроса, локально останавливаем клиент и закрываем секцию loop().
Если сервер отключился, что он обычно делает после выполнения '''HTTP'''-запроса, локально останавливаем клиент и закрываем секцию loop().


<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 (!client.available() && !client.connected())
if (!client.available() && !client.connected())
   {
   {
Строка 139: Строка 139:
Загрузив код, откройте '''Serial Monitor'''. Далее на экране должен появиться '''HTML'''-код страницы http://arduino.cc. Это должно занять около минуты, поэтому не волнуйтесь, если не получите немедленную обратную связь.  
Загрузив код, откройте '''Serial Monitor'''. Далее на экране должен появиться '''HTML'''-код страницы http://arduino.cc. Это должно занять около минуты, поэтому не волнуйтесь, если не получите немедленную обратную связь.  


<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">
/*
/*
Веб-клиент с помощью GSM Shield
Веб-клиент с помощью GSM Shield
Строка 259: Строка 259:


<references />
<references />
{{Навигационная таблица/Портал/Arduino}}
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования Arduino]]
[[Категория:Пример программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:Примеры программирования Arduino]]

Текущая версия от 12:35, 8 июля 2023

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


Веб-клиент с помощью GSM Shield[1]

Этот скетч при помощи GSM Shield подключает плату Arduino к домашней странице Arduino, а затем выводит контент страницы через Serial Monitor.

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

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • SIM-карта с возможностью передачи данных;

Цепь

Изображение Arduino GSM Shield поверх Arduino Uno

Код

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

#include <GSM.h>

Функционал SIM-карты может быть заблокирован PIN-кодом. В таком случае определяем этот PIN-код как константу при помощи директивы #define. Если PIN-кода нет, оставляем вместо него пустое место.

#define PINNUMBER ""

Определяем еще несколько констант, содержащих информацию о GPRS-сети, к которой вы собираетесь подключиться. Вам понадобится APN (Access Point Name, т.е. имя точки доступа), логин и пароль. Чтобы узнать всю эту информацию (включая самые последние обновления), свяжитесь со своим оператором. На этой странице можно найти настройки от различных операторов, но учтите, что она может быть устаревшей.

#define GPRS_APN       "GPRS_APN" 
#define GPRS_LOGIN     "login"
#define GPRS_PASSWORD  "password"

Создаем экземпляры классов GSM, GPRS и GSMClient.

GSMClient client;
GPRS gprs;
GSM gsmAccess;

Создаем несколько переменных, в которых будем держать информацию о сервере, пути и порте, к которому вы собираетесь подключиться.

char server[] = "arduino.cc";
char path[] = "/";
int port = 80;

В секции setup() инициализируем последовательную передачу данных. Запустив соединение, отсылаем сообщение, оповещающее о начале работы скетча.

void setup(){
  Serial.begin(9600); 
  Serial.println("Starting Arduino web client.");

Создаем локальную переменную для отслеживания статуса соединения. Она потребуется для того, чтобы скетч не начинал работать, пока SIM-карта не подключится к сети.

boolean notConnected = true;

Подключаемся к сети при помощи функции gsmAccess.begin(), где PIN-код SIM-карты будет в качестве аргумента. Также подключаемся к GPRS при помощи функции gprs.attachGPRS(). Ей потребуется информация об APN, логине и пароле, которые мы объявили ранее. Разместив все это в цикле loop(), вы сможете постоянно проверять статус соединения, ожидая, пока функции для обеих сетей получат значение true.

Когда модем подключится и соединит себя с GPRS-сетью, функция gsmAccess() вернет значение GSM_READY. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false. Если подключиться не удастся, сообщаем об этом на Serial Monitor.

while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

Пытаемся подключиться к серверу при помощи функции client.connect(). Ей требуется два аргумента – сервер и порт. Подключившись к серверу, при помощи функции client.print() делаем HTTP-запрос. Стандартный веб-запрос выглядит примерно так: «GET pathname HTTP/1.0». При этом функция client.print() отправит сообщение – как это обычно делает браузер.

if (client.connect(server, port))
  {
    Serial.println("connected");
    client.print("GET ");
    client.print(path);
    client.println(" HTTP/1.0");
    client.println();
  }

Если подключиться к серверу не удалось, сообщаем об этом на Serial Monitor и закрываем блок setup().

else
  {
    Serial.println("connection failed");
  }
}

В секции loop() проверяем, вернулись ли от сервера какие-нибудь байты. Если да, считываем их и выводим на Serial Monitor.

if (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }

Если сервер отключился, что он обычно делает после выполнения HTTP-запроса, локально останавливаем клиент и закрываем секцию loop().

if (!client.available() && !client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    for(;;)
      ;
  }
}

Загрузив код, откройте Serial Monitor. Далее на экране должен появиться HTML-код страницы http://arduino.cc. Это должно занять около минуты, поэтому не волнуйтесь, если не получите немедленную обратную связь.

/*
Веб-клиент с помощью GSM Shield

Этот скетч подключается к вебсайту при помощи GSM Shield.

Цепь:
* GSM Shield, подключенный к Arduino 

Создан 8 марта 2012 Томом Иго (Tom Igoe)
*/

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

// PIN-код:
#define PINNUMBER ""

// Данные для APN:
#define GPRS_APN       "GPRS_APN" // вставьте сюда ваш GPRS APN
#define GPRS_LOGIN     "login"    // вставьте сюда ваш логин
#define GPRS_PASSWORD  "password" // вставьте сюда ваш пароль

// Создаем экземпляры классов: 
GSMClient client;
GPRS gprs;
GSM gsmAccess; // включая параметр «true» для активации отладки 

// Этот пример загружает URL «http://arduino.cc»

// URL, путь и порт (например, arduino.cc)
char server[] = "arduino.cc";
char path[] = "/";
int port = 80; // 80 для HTTP

void setup()
{
  // инициализируем последовательную передачу данных:
  Serial.begin(9600);
  Serial.println("Starting Arduino web client.");  //  "Запускаем веб-клиент Arduino"
  // Состояние соединения:
  boolean notConnected = true;

  // Запускаем GSM Shield.
  // Если у вашей SIM-карты есть PIN-код, указываем его параметром функции gsmAccess.begin():
  while(notConnected)
  {
    if((gsmAccess.begin(PINNUMBER)==GSM_READY) &
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
      notConnected = false;
    else
    {
      Serial.println("Not connected");  //  "Подключиться не удалось"
      delay(1000);
    }
  }

  Serial.println("connecting...");  //  "Подключение..."

  // Если подключились, сообщаем об этом через Serial Monitor:
  if (client.connect(server, port))
  {
    Serial.println("connected");  //  "Подключено"
    // Делаем HTTP-запрос:
    client.print("GET ");
    client.print(path);
    client.println(" HTTP/1.0");
    client.println();
  } 
  else
  {
    // Если подключиться к серверу не удалось:
    Serial.println("connection failed");  //  "Подключиться не удалось"
  }
}

void loop()
{
  // Если от сервера доступны какие-нибудь байты,
  // считываем их и выводим на Serial Monitor: 
  if (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }

  // Если сервер отключился, останавливаем работу клиента:
  if (!client.available() && !client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");  //  "Отключение."
    client.stop();

    // Просто ничего не делаем:
    for(;;)
      ;
  }
}

См.также

  1. GPRS Constructor
  2. attachGPRS()
  3. GSMClient Constructor
  4. ready()
  5. connect()
  6. beginWrite()
  7. write()
  8. endWrite()
  9. connected()
  10. read()
  11. available()
  12. peek()
  13. flush()
  14. stop()

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