Arduino:Примеры/GSMExamplesWebServer
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Содержание
Веб-сервер с помощью 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.
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 }
См.также
- GPRS Constructor
- attachGPRS()
- GSMServer Constructor
- ready()
- beginWrite()
- write()
- endWrite()
- read()
- available()
- stop()
Внешние ссылки