X Международная студенческая научная конференция
«Студенческий научный форум» - 2018
 
     

ТЕОРЕТИЧЕСКИЕ ОСНОВЫ СОЗДАНИЯ WEB-СЕРВЕРА НА ARDUINO
Карпутина А.Ю.
Текст научной работы размещён без изображений и формул.
Полная версия научной работы доступна в формате PDF


Для того чтобы управлять системой через Web-интерфейс, необходимо создать web-сервер и страницу управления на нем.

Для создания Web-сервера требуются следующие компоненты:

  • Плата Arduino;

  • Ethernet Shield;

  • Сетевой кабель с прямым обжимом для соединения Ethernet Shield и роутера;

  • USB кабель для питания и программирования платы Arduino.

Перед началом работы необходимо подключить Ethernet Shield к плате Arduino, запустить и протестировать работу сети.

Один конец обжатого прямо сетевого кабеля подключается к шилду, второй к роутеру. Затем нужно определить IP адрес сети и модифицировать тестовый скетч для использования с другим IP адресом, но находящимся в той же сети, что и компьютер. После загрузки скетча на Arduino, в адресную строку браузера вводится IP адрес, использованный в скетче, и браузер соединяется с Web-сервером на Arduino. На экран выводятся данные о пинах на плате Arduino. Эти данные обновляются каждые 5 секунд.

Подробнее о каждом шаге.

Шаг 1. Определение IP адреса. Используемый компьютером диапазон адресов должен быть определен. Это нужно для того, чтобы назначить Arduino адрес в пределах этого диапазона. Этот адрес будет использоваться для создания соединения с Web сервером на Arduino.

На Windows 7 это можно сделать следующим образом:

  1. нажать на иконку доступа к интернету в нижнем правом углу панели управления;

  2. Выбрать «Центр управления сетями и общим доступом»;

  3. Далее «Подключение по локальной сети» и «Свойства» в диалоговом окне;

  4. В окне «Сведения о подключении к сети» IP адрес находится в разделе «IPv4».

Шаг 2. Соединение с сервером Arduino. Допустим, IP адрес компьютера 10.0.0.6. Это значит, что необходимо выбрать IP адрес, значение которого будет 10.0.0.х, где х это номер, отличный от номера в адресе компьютера. Например, 10.0.0.12.

В Arduino IDE нужно открыть тестовый скетч. Сделать это можно выбрав File – Examples – Ethernet – WebServer.

Теперь нужно изменить IP адрес в скетче на адрес, который был определен для Web-сервера (листинг 1):

Листинг 1. Изменение IP адреса

IPAddress ip(10,0,0,12);

Также нужно изменить MAC адрес в скетче на адрес, указанный на Ethernet Shield. В коде это выглядит так (листинг 2):

Листинг 2. Изменение MAC адреса

byte mac[] = {

0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Шаг 3. Теперь нужно загрузить скетч на Arduino. На компьютерах под управлением Windows может потребоваться нажать кнопку reset на Ethernet Shield после загрузки скетча.

Шаг 4. Теперь можно открыть браузер и ввести IP адрес сервера в адресную строку (возможно, потребуется ввод в формате http://10.0.0.12 вместо 10.0.0.12). Браузер должен успешно соединиться с сервером и вывести на экран значения аналоговых пинов.

В листинге 3 ниже приведен пример кода, позволяющего Arduino с Ethernet Shield обслуживать веб-страницу, доступную для просмотра в веб-браузере.

Листинг 3. Запуск сервера на Ethernet Shield

#include

#include

// MAC адрес Ethernet Shield

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress ip(10, 0, 0, 12); // IP адрес будущего сервера

EthernetServer server(80); // создание сервера на порте 80

void setup()

{

Ethernet.begin(mac, ip); // Инициализация Ethernet девайса

server.begin(); // запуск сервера (прослушивание клиента)

}

void loop()

{

EthernetClient client = server.available(); // попытка получения клиента

if (client) { // клиент получен?

boolean currentLineIsBlank = true; //переменная типа Boolean для проверки пустоты строки

while (client.connected()) {

if (client.available()) { // если клиент доступен

char c = client.read(); // чтение 1 байта (символа) от клиента

// последняя строка запроса клиента пустая и заканчивается на n

// ответ клиенту отправляется только после получения последней строки

if (c == 'n' && currentLineIsBlank) {

// отправка стандартного заголовка ответа http

client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println("Connection: close");

client.println();

// отправка web-страницы

client.println("");

client.println(""); client.println("");

client.println("Arduino Web Page");

client.println("");

client.println("");

client.println("Hello from Arduino!");

client.println("

A web page from the Arduino server

");

 

client.println("");

client.println("");

break;

}

// каждая строка текста, полученная от клиента, оканчивается на rn

if (c == 'n') {

// последний символ строки полученного

// начало новой строки со следующего прочитанного символа

currentLineIsBlank = true;

}

else if (c != 'r') {

// от клиента получен текстовый символ

currentLineIsBlank = false;

}

} // конец if (client.available())

} // конец while (client.connected())

delay(1); // задержка для того чтобы браузер успел принять данные

client.stop(); // закрытие соединения

} // конец if (client)

}

Если в слоте для SD карты Ethernet Shield находится неинициализированная SD карта, то это может вызвать проблему с кодом в скетче, который имеет доступ к Ethernet чипу. Код может начать работать неправильно. Например, запускаться один или два раза, а затем прекращать работу. Это происходит потому, что Ethernet Shield и SD карта использутся Arduino через один и тот же SPI. Если SD карта не используется, следует либо извлечь ее из слота, либо отключить программно. Делается это при помощи следующего кода (листинг 4):

Листинг 4. Отключение SD карты

void setup() {

// отключение карты SD путем подачи питания на 4 пин

// карта SD не используется в этой программе, но если она осталась в разъеме,

// это может вызвать проблему доступа к Ethernet чипу до тех пор, пока она не будет отключена

pinMode(4, OUTPUT);

digitalWrite(4, HIGH);

// прочий код инициализации

}

В результате страница будет выглядеть так (Рис. 10):

Рис. 10. Внешний вид web-страницы

Когда производится доступ к IP адресу сервера Arduino, браузер (клиент) отправляет на сервер запросы, похожие на тот, что указан ниже (листинг 5):

Листинг 5. Вид запроса клиент-сервер

GET / HTTP/1.1rn

Host: 10.0.0.20rn

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0rn

Accept: text/html,application/xhtml+xml,application

/xml;q=0.9,*/*;q=0.8rn

Accept-Language: en-ZA,en-GB;q=0.8,en-US;q=0.5,en;q=0.3rn

Accept-Encoding: gzip, deflatern

Connection: keep-alivern

rn

Информация в запросе может отличаться, в зависимости от браузера и операционной системы, с которой был отправлен запрос. Символы rn в конце каждой строки это управляющие символы. r – это символ возврата каретки и n – это символ перевода строки. Последняя строка запроса — это просто rn без какого-либо текста. Это пустая строка, которую и проверяет скетч Arduino перед тем как отправить ответ браузеру клиента.

После того, как запрос страницы получен от клиента, сервер сначала посылает стандартный HTTP ответ, а затем саму Web-страницу. Ответ, отправляемый Arduino, выглядит следующим образом (листинг 6):

Листинг 6. Вид ответа сервер-клиент

HTTP/1.1 200 OKrn

Content-Type: text/htmlrn

Connection: closern

rn

В ответе так же используются управляющие символы rn. Функция println() в скетче автоматически добавляет символы rn в конец каждой строки. Пустая функция println() в конце HTTP ответа добавляет символы rn без дополнительного текста перед ними.

Список литературы

  1. Иго, Т. Arduino, датчики и сети для связи устройств. – 2-е изд. – СПб: БХВ-Петербург, 2015. – 544 c.

  2. O'Sullivan, D. Physical Computing: Sensing and controlling the physical world with computers / D. O'Sullivan, T. Igoe. – Thomson, 2004. – 496 p.