Arduino:Примеры/GSMExamplesWebServer

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

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

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

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

Цепь

GSMShield ArduinoUno.png

Изображение GSM Shield, установленного поверх Arduino Uno

Код

Во-первых, подключаем библиотеку GSM.

1 #include <GSM.h>

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

1 #define PINNUMBER ""

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

1 #define GPRS_APN       "GPRS_APN" 
2 #define GPRS_LOGIN     "login"
3 #define GPRS_PASSWORD  "password"

Создаем экземпляры классов, которые мы собираемся использовать. Нам понадобятся GSM, GPRS и GSMServer. При инстанцинировании класса GMSServer вам надо будет сообщить, какой порт вы будете прослушивать на предмет входящих соединений. Портом для HTTP-запросов по умолчанию является порт 80.

1 GPRS gprs;
2 GSM gsmAccess;
3 GSMServer server(80);

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

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

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

1 boolean notConnected = true;

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

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

 1 while(notConnected)
 2   {
 3     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
 4         (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
 5       notConnected = false;
 6     else
 7     {
 8       Serial.println("Not connected");
 9       delay(1000);
10     }
11   }

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

1 server.begin();
2 
3   IPAddress LocalIP = gprs.getIPAddress();
4   Serial.println("Server IP address=");
5   Serial.println(LocalIP);
6 }

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

1 void loop() {
2   GSMClient client = server.available();
3 
4   if (client)
5   {

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

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

1 while (client.connected())
2     {
3       if (client.available())
4       {
5         Serial.println("Receiving request!");
6         bool sendResponse = false;
7         while(char c=client.read()) {
8           if (c == '\n') sendResponse = true;
9         }

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

1 if (sendResponse)
2        {
3           client.println("HTTP/1.1 200 OK");
4           client.println("Content-Type: text/html");
5           client.println();
6           client.println("<html>");

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

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

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

1 client.println("</html>");
2           delay(1000);
3           client.stop();
4         }
5       }
6     }
7   }
8 }

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

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

  1 /*
  2 Веб-сервер с помощью GSM Shield
  3 
  4 Простой веб-сервер, который показывает значения от датчиков, 
  5 подключенных к аналоговым контактам Arduino. 
  6 Использует GSM Shield.
  7 
  8 Цепь:
  9 * GSM Shield, подключенный к Arduino
 10 * Устройства ввода, подключенные к аналоговым контактам Arduino – c A0 по A5 (опционально) 
 11 
 12 Создан 8 марта 2012 Томом Иго (Tom Igoe).
 13 */
 14 
 15 // Библиотеки:
 16 #include <GSM.h>
 17 
 18 // PIN-код:
 19 #define PINNUMBER ""
 20 
 21 // Данные об APN:
 22 #define GPRS_APN       "GPRS_APN" // тут впишите ваш GPRS APN
 23 #define GPRS_LOGIN     "login"    // тут впишите ваш логин
 24 #define GPRS_PASSWORD  "password" // тут впишите ваш пароль
 25 
 26 
 27 // Создаем экземпляры классов:
 28 GPRS gprs;
 29 GSM gsmAccess;     // включая параметр «true» для активации отладки
 30 GSMServer server(80); // порт 80 (дефолтный для HTTP)
 31 
 32 // Задержка:
 33 const unsigned long __TIMEOUT__ = 10*1000;
 34 
 35 void setup()
 36 {
 37   // Инициализируем последовательную передачу данных:
 38   Serial.begin(9600);
 39 
 40   // Состояние соединения:
 41   boolean notConnected = true;
 42 
 43   // Запускаем GSM Shield.
 44   // Если у вашей SIM-карты есть PIN-код, делаем его параметром функции begin():
 45   while(notConnected)
 46   {
 47     if((gsmAccess.begin(PINNUMBER)==GSM_READY) &
 48         (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
 49       notConnected = false;
 50     else
 51     {
 52       Serial.println("Not connected");  //  "Подключиться не удалось"
 53       delay(1000);
 54     }
 55   }
 56 
 57   Serial.println("Connected to GPRS network");  //  "Подключение к сети GPRS прошло успешно"
 58 
 59   // Запускаем сервер:
 60   server.begin();
 61 
 62   // Берем IP:
 63   IPAddress LocalIP = gprs.getIPAddress();
 64   Serial.println("Server IP address=");  //  "IP-адрес сервера="
 65   Serial.println(LocalIP);
 66 }
 67 
 68 void loop() {
 69 
 70 
 71   // Слушаем входящие соединения:
 72   GSM3MobileClientService client = server.available();
 73 
 74 
 75 
 76   if (client)
 77   {  
 78     while (client.connected())
 79     {
 80       if (client.available())
 81       {
 82         Serial.println("Receiving request!");  //  "Запрос получен!"
 83         bool sendResponse = false;
 84         while(char c=client.read()) {
 85           if (c == '\n') sendResponse = true;
 86         }
 87 
 88      // Если добрались до конца строки (т.е. получили символ новой строки)... : 
 89        if (sendResponse)
 90        {
 91           // ...то отсылаем заголовок стандартного HTTP-ответа:
 92           client.println("HTTP/1.1 200 OK");
 93           client.println("Content-Type: text/html");
 94           client.println();
 95           client.println("<html>");
 96           // Считываем данные от каждого из аналоговых контактов: 
 97           for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
 98             client.print("analog input ");
 99             client.print(analogChannel);
100             client.print(" is ");
101             client.print(analogRead(analogChannel));
102             client.println("<br />");       
103           }
104           client.println("</html>");
105           // Необходимая задержка:
106           delay(1000);
107           client.stop();
108         }
109       }
110     }
111   }
112 }

См.также

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

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