Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GSMExamplesWebServer

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Веб-сервер с помощью 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()

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

  1. Arduino - GSM Web Server