Arduino:Примеры/GSMExamplesWebServer: различия между версиями
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">») |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 26: | Строка 26: | ||
Во-первых, подключаем библиотеку '''GSM'''. | Во-первых, подключаем библиотеку '''GSM'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <GSM.h> | #include <GSM.h> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 32: | Строка 32: | ||
Работа '''SIM'''-карты может быть заблокирована '''PIN'''-кодом. По этой причине нам нужно определить этот '''PIN'''-код в качестве константы – делаем это при помощи директивы #define. Если '''PIN'''-кода нет, то вместо него можно оставить пустое место. | Работа '''SIM'''-карты может быть заблокирована '''PIN'''-кодом. По этой причине нам нужно определить этот '''PIN'''-код в качестве константы – делаем это при помощи директивы #define. Если '''PIN'''-кода нет, то вместо него можно оставить пустое место. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#define PINNUMBER "" | #define PINNUMBER "" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 38: | Строка 38: | ||
Далее определяем еще несколько констант, содержащих информацию о '''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 | <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" | ||
Строка 46: | Строка 46: | ||
Создаем экземпляры классов, которые мы собираемся использовать. Нам понадобятся '''GSM, GPRS и GSMServer'''. При инстанцинировании класса '''GMSServer''' вам надо будет сообщить, какой порт вы будете прослушивать на предмет входящих соединений. Портом для '''HTTP'''-запросов по умолчанию является '''порт 80'''. | Создаем экземпляры классов, которые мы собираемся использовать. Нам понадобятся '''GSM, GPRS и GSMServer'''. При инстанцинировании класса '''GMSServer''' вам надо будет сообщить, какой порт вы будете прослушивать на предмет входящих соединений. Портом для '''HTTP'''-запросов по умолчанию является '''порт 80'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
GPRS gprs; | GPRS gprs; | ||
GSM gsmAccess; | GSM gsmAccess; | ||
Строка 54: | Строка 54: | ||
В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, отсылаем на '''Serial Monitor''' сообщение, информирующее о начале работы скетча. | В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, отсылаем на '''Serial Monitor''' сообщение, информирующее о начале работы скетча. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void setup(){ | void setup(){ | ||
Serial.begin(9600); | Serial.begin(9600); | ||
Строка 62: | Строка 62: | ||
Создаем локальную переменную для отслеживания статуса соединения. Она будет нужна, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети. | Создаем локальную переменную для отслеживания статуса соединения. Она будет нужна, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
boolean notConnected = true; | boolean notConnected = true; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 70: | Строка 70: | ||
Когда модем подключится и подсоединит себя к '''GPRS'''-сети, функция gsmAccess.begin() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом о том, какое значение придать переменной notConnected – true или false. При успешном подключении на '''Serial Monitor''' появится соответствующее уведомление. | Когда модем подключится и подсоединит себя к '''GPRS'''-сети, функция gsmAccess.begin() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом о том, какое значение придать переменной notConnected – true или false. При успешном подключении на '''Serial Monitor''' появится соответствующее уведомление. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
while(notConnected) | while(notConnected) | ||
{ | { | ||
Строка 86: | Строка 86: | ||
Запускаем сервер при помощи функции server.begin(). Далее, используя функцию gprs.getIPAddress(), делаем запрос к '''IP'''-адресу сервера и закрываем секцию setup(). | Запускаем сервер при помощи функции server.begin(). Далее, используя функцию gprs.getIPAddress(), делаем запрос к '''IP'''-адресу сервера и закрываем секцию setup(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
server.begin(); | server.begin(); | ||
Строка 97: | Строка 97: | ||
В секции loop() создаем экземпляр класса '''GSMClient''' и проверяем, есть ли какие-нибудь активные соединения. | В секции loop() создаем экземпляр класса '''GSMClient''' и проверяем, есть ли какие-нибудь активные соединения. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void loop() { | void loop() { | ||
GSMClient client = server.available(); | GSMClient client = server.available(); | ||
Строка 109: | Строка 109: | ||
В этом примере мы с запросом ничего не делаем. Подразумевается, что это '''HTTP'''-запрос, в ответ на который мы будем генерировать веб-страницу. | В этом примере мы с запросом ничего не делаем. Подразумевается, что это '''HTTP'''-запрос, в ответ на который мы будем генерировать веб-страницу. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
while (client.connected()) | while (client.connected()) | ||
{ | { | ||
Строка 123: | Строка 123: | ||
Когда запрос прочитан, начинаем отправлять заголовок стандартного '''HTTP'''-ответа, используя для этого функции client.print() и client.printIn(). | Когда запрос прочитан, начинаем отправлять заголовок стандартного '''HTTP'''-ответа, используя для этого функции client.print() и client.printIn(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
if (sendResponse) | if (sendResponse) | ||
{ | { | ||
Строка 134: | Строка 134: | ||
Считываем данные от аналоговых датчиков и отправляем их клиенту. | Считываем данные от аналоговых датчиков и отправляем их клиенту. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
for (int analogChannel = 0; analogChannel < 6; analogChannel++) { | for (int analogChannel = 0; analogChannel < 6; analogChannel++) { | ||
client.print("analog input "); | client.print("analog input "); | ||
Строка 146: | Строка 146: | ||
Отсылаем закрывающий тег и, перед тем, как закрывать loop(), останавливаем клиентское соединение. | Отсылаем закрывающий тег и, перед тем, как закрывать loop(), останавливаем клиентское соединение. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
client.println("</html>"); | client.println("</html>"); | ||
delay(1000); | delay(1000); | ||
Строка 161: | Строка 161: | ||
Если вы не можете подключиться к '''IP'''-адресу, убедитесь, что ваш оператор связи разрешает входящий трафик. | Если вы не можете подключиться к '''IP'''-адресу, убедитесь, что ваш оператор связи разрешает входящий трафик. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Веб-сервер с помощью GSM Shield | Веб-сервер с помощью GSM Shield | ||
Строка 292: | Строка 292: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Портал/Arduino}} | |||
[[Категория:Пример]] | [[Категория:Пример]] | ||
[[Категория:Примеры]] | [[Категория:Примеры]] | ||
[[Категория:Пример программирования Arduino]] | [[Категория:Пример программирования Arduino]] | ||
[[Категория:Примеры программирования Arduino]] | [[Категория:Примеры программирования Arduino]] |
Текущая версия от 12:35, 8 июля 2023
Содержание | Знакомство с 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.
#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();
}
}
}
}
}
См.также
- GPRS Constructor
- attachGPRS()
- GSMServer Constructor
- ready()
- beginWrite()
- write()
- endWrite()
- read()
- available()
- stop()
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino