Arduino:Примеры/GSMExamplesWebServer

Материал из Онлайн справочника
Версия от 23:54, 13 декабря 2016; 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">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Веб-сервер с помощью GSM Shield[1]

Этот скетч превращает Arduino (плюс подсоединенные к ней GSM Shield и SIM-карту) в веб-сервер. Когда Arduino получает запрос от подключившегося клиента, то отправляет обратно значения от устройств, подключенных к аналоговым контактам с 0-ого по 5-ый.

Не все операторы связи позволяют, чтобы их SIM-карта делала запросы за пределы их сети. Это значит, что вы, воспользовавшись GSM Shield, можете создать веб-сервер, но не сможете с его помощью подключиться к интернету общего пользования (в случае, например, если у этого оператора есть какой-то свой девайс, выполняющий похожие функции). Поэтому лучше уточните у своего оператора насчет политики, которую он ведет в отношении входящей передачи данных.

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

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • SIM-карта с возможностью передачи данных;
  • (опционально) Шесть потенциометров или других устройств ввода, присоединенных к аналоговым контактам с 0-ого по 5-ый;

Цепь

Изображение 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 и GSMServer. При инстанцинировании класса GMSServer вам надо будет сообщить, какой порт вы будете прослушивать на предмет входящих соединений. Портом для HTTP-запросов по умолчанию является порт 80.

GPRS gprs;
GSM gsmAccess;
GSMServer server(80);

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

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.begin() вернет значение 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);
    }
  }

Запускаем сервер при помощи функции server.begin(). Далее, используя функцию gprs.getIPAddress(), делаем запрос к IP-адресу сервера и закрываем секцию setup().

server.begin();

  IPAddress LocalIP = gprs.getIPAddress();
  Serial.println("Server IP address=");
  Serial.println(LocalIP);
}

В секции loop() создаем экземпляр класса GSMClient и проверяем, есть ли какие-нибудь активные соединения.

void loop() {
  GSMClient client = server.available();

  if (client)
  {

Итак, допустим, клиент подключен, а от аналоговых датчиков идут какие-то данные – в таком случае начинаем считывать входящий запрос. Считываем доступные входящие байты, пока не получим символ новой строки.

В этом примере мы с запросом ничего не делаем. Подразумевается, что это HTTP-запрос, в ответ на который мы будем генерировать веб-страницу.

while (client.connected())
    {
      if (client.available())
      {
        Serial.println("Receiving request!");
        bool sendResponse = false;
        while(char c=client.read()) {
          if (c == '\n') sendResponse = true;
        }

Когда запрос прочитан, начинаем отправлять заголовок стандартного HTTP-ответа, используя для этого функции client.print() и client.printIn().

if (sendResponse)
       {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html>");

Считываем данные от аналоговых датчиков и отправляем их клиенту.

for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(analogRead(analogChannel));
            client.println("<br />");       
          }

Отсылаем закрывающий тег и, перед тем, как закрывать loop(), останавливаем клиентское соединение.

client.println("</html>");
          delay(1000);
          client.stop();
        }
      }
    }
  }
}

Загрузив код, откройте Serial Monitor. Когда на Serial Monitor будет выведен IP-адрес, введите его в веб-браузере. В результате вы увидите веб-страницу с информацией об аналоговых данных от каждого из шести датчиков Arduino.

Если вы не можете подключиться к IP-адресу, убедитесь, что ваш оператор связи разрешает входящий трафик.

/*
Веб-сервер с помощью GSM Shield

Простой веб-сервер, который показывает значения от датчиков, 
подключенных к аналоговым контактам Arduino. 
Использует GSM Shield.

Цепь:
* GSM Shield, подключенный к Arduino
* Устройства ввода, подключенные к аналоговым контактам Arduino – c A0 по A5 (опционально) 

Создан 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" // тут впишите ваш пароль


// Создаем экземпляры классов:
GPRS gprs;
GSM gsmAccess;     // включая параметр «true» для активации отладки
GSMServer server(80); // порт 80 (дефолтный для HTTP)

// Задержка:
const unsigned long __TIMEOUT__ = 10*1000;

void setup()
{
  // Инициализируем последовательную передачу данных:
  Serial.begin(9600);

  // Состояние соединения:
  boolean notConnected = true;

  // Запускаем GSM Shield.
  // Если у вашей SIM-карты есть PIN-код, делаем его параметром функции 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("Connected to GPRS network");  //  "Подключение к сети GPRS прошло успешно"

  // Запускаем сервер:
  server.begin();

  // Берем IP:
  IPAddress LocalIP = gprs.getIPAddress();
  Serial.println("Server IP address=");  //  "IP-адрес сервера="
  Serial.println(LocalIP);
}

void loop() {


  // Слушаем входящие соединения:
  GSM3MobileClientService client = server.available();



  if (client)
  {  
    while (client.connected())
    {
      if (client.available())
      {
        Serial.println("Receiving request!");  //  "Запрос получен!"
        bool sendResponse = false;
        while(char c=client.read()) {
          if (c == '\n') sendResponse = true;
        }

     // Если добрались до конца строки (т.е. получили символ новой строки)... : 
       if (sendResponse)
       {
          // ...то отсылаем заголовок стандартного HTTP-ответа:
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html>");
          // Считываем данные от каждого из аналоговых контактов: 
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(analogRead(analogChannel));
            client.println("<br />");       
          }
          client.println("</html>");
          // Необходимая задержка:
          delay(1000);
          client.stop();
        }
      }
    }
  }
}

См.также

  1. GPRS Constructor
  2. attachGPRS()
  3. GSMServer Constructor
  4. ready()
  5. beginWrite()
  6. write()
  7. endWrite()
  8. read()
  9. available()
  10. stop()

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