===== Эксперимент 57. Простой веб-сервер =====
В прошлом эксперименте мы получили список доступных сетей Wi-Fi. После подключения к одной из них мы станем полноценным участником информационного обмена в ней. Мы сможем быть как клиентом, так и сервером. Как мы уже узнали ранее, клиент — это программа, которая запрашивает данные, а сервер — это программа, которая отдает данные. Сервер ожидает когда клиент к нему подключится и запросит данные.
Например, есть веб-сервер на котором находится сайт pinlab.ru, он ждет когда к нему подключится клиент. И есть браузер на компьютере или в смартфоне. Пользователь посредством браузера обращается к серверу, сервер отвечает клиенту отправкой веб- страницы. Так выглядит схема обмена данными между сервером и клиентом.
В прошлом эксперименте мы получали список доступных Wi-Fi сетей. Необходимо убедиться, что среди них есть нужная сеть — домашняя сеть или сеть, поднятая посредством смартфона. Имя этой сети нужно записать. Также нужно удостовериться, что уровень сигнала достаточный для подключения. Если RSSI (мощность сигнала) менее, чем -70, то необходимо переместиться ближе к точки доступа.
Попробуем написать простейший веб-сервер, который будет отвечать на запросы клиентов. Для этого нам потребуется библиотека ''ESP8266WebServer''. Ее достаточно просто подключить.
==== Программный код эксперимента ====
#include
#include
#define WIFI_NAME "WiFi_Name"
#define WIFI_PASSWORD "WiFi_Password"
ESP8266WebServer server(80);
void showMessage() {
server.send(200, "text/html", "HELLO WORLD!");
}
void setup() {
Serial.begin(9600);
Serial.println();
Serial.print("Connecting to WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", showMessage);
server.begin();
}
void loop() {
server.handleClient();
}
Первым делом в коде программы нужно заменить ''WiFi_Name'' на имя нужной cести, а ''WiFi_Password'' на пароль от нее.
Создаем объект веб-сервера, в качестве параметра указываем порт на котором он будет принимать запросы.
ESP8266WebServer server(80);
Устанавливаем режим клиента. Подключаемся к сети и печатаем точку каждые полсекунды, до тех пор, пока микроконтроллер не подключится к сети. Если соединение не устанавливается, то скорее всего допущена ошибка в имени сети или пароле от нее.
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
В сети есть специальный сервер, который выдает настройки вновь подключаемым устройствам — DHCP сервер. Помимо прочих настроек, он назначает устройствам IP- адреса. После подключения нашего устройства, ему был присвоен IP-адрес. Выведем этот адрес в последовательный порт.
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Например, может быть получен адрес ''192.168.0.25'' или ''192.168.43.195''. Но может быть и другой. Это зависит от настроек сети и уже подключенных к ней устройств. Не очень важно какой именно адрес был назначен нашему микроконтроллеру, главное, что этот адрес нам нужно запомнить, ведь именно по нему мы будем обращаться к устройству.
Настраиваем веб-сервер таким образом, что при обращении к главной странице будет вызываться функция ''show_message''
server.on("/", showMessage);
На веб-сервере, или скажем: на сайте, может быть не одна страница, а много. Адрес страницы, к которой мы хотим обратиться мы передаем в адресе (URL) после домена сайта. Например %%http://pinlab.ru/page1%% или %%http://pinlab.ru/page2%%. Если имя страницы отсутствует, то обращение происходит к главной странице. В коде нашего сервера адрес главной страницы обозначается символом ''/''
Запускаем веб-сервер:
server.begin();
В основном цикле программы проверяем наличие новых клиентов:
server.handleClient();
Все, теперь на нашем устройстве запущен веб-сервер, который ждет присоединения клиента. Давайте присоединимся. Самое главное условие — чтобы сервер и клиент находились в одной сети. Например, если у тебя дома Wi-Fi роутер, к которому подключился микроконтроллер и к этому же роутеру подключен домашний компьютер, то микроконтроллер и компьютер находятся в одной сети. Тогда мы можем обратиться к нашему серверу с компьютера.
Если твой смартфон подключен по Wi-Fi к этому же роутеру, то можно обратиться к серверу с этого смартфона. Но если смартфон не подключен к этому же Wi-Fi роутеру, а выходит в интернет через сотовую вышку — то подключиться с него не получится. Прежде чем попытаться обратиться к серверу убедись, что сервер и клиент находятся в одной сети. После этого в адресной строке браузера нужно набрать IP- адрес, который получил микроконтроллер.
В нашем случае микроконтроллером был получен IP ''192.168.43.195'' при подключении к точке доступа Wi-Fi, которая создана посредством смартфона, поэтому его и вводим в браузер в смартфоне ''192.168.43.195''
{{ :products:esp-iot:076a2fd8-06d0-4e5a-b02a-c3f397cea6c4.jpg?direct&400 |}}
Когда браузер обращается к главной странице нашего веб- сервера, веб сервер вызывает функцию ''show_message'':
void showMessage() {
server.send(200, "text/html", "HELLO WORLD!");
}
В ней всего одна строка, в которой вызывается метод ''send'', отправляющий клиенту ответ. Именно этот текст мы и увидели в браузере. Первый аргумент метода ''send()'' — код HTTP сообщения, второй — тип сообщение, третий — само сообщение.
Таким образом мы написали простейший веб-сервер, который при обращении к нему отправляет строку приветствия.