Это старая версия документа!


Эксперимент 57. Простой веб-сервер

В прошлом эксперименте мы получили список доступных сетей Wi-Fi. После подключения к одной из них мы станем полноценным участником информационного обмена в ней. Мы сможем быть как клиентом, так и сервером. Как мы уже узнали ранее, клиент — это программа, которая запрашивает данные, а сервер — это программа, которая отдает данные. Сервер ожидает когда клиент к нему подключится и запросит данные.

Например, есть веб-сервер на котором находится сайт pinlab.ru, он ждет когда к нему подключится клиент. И есть браузер на компьютере или в смартфоне. Пользователь посредством браузера обращается к серверу, сервер отвечает клиенту отправкой веб- страницы. Так выглядит схема обмена данными между сервером и клиентом.

В прошлом эксперименте мы получали список доступных Wi-Fi сетей. Необходимо убедиться, что среди них есть нужная сеть — домашняя сеть или сеть, поднятая посредством смартфона. Имя этой сети нужно записать. Также нужно удостовериться, что уровень сигнала достаточный для подключения. Если RSSI (мощность сигнала) менее, чем -70, то необходимо переместиться ближе к точки доступа.

Попробуем написать простейший веб-сервер, который будет отвечать на запросы клиентов. Для этого нам потребуется библиотека ESP8266WebServer. Ее достаточно просто подключить.

Программный код эксперимента

Exp57.ino
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3.  
  4. #define WIFI_NAME "Freedom"
  5. #define WIFI_PASSWORD "koval2121"
  6.  
  7. ESP8266WebServer server(80);
  8.  
  9. void showMessage() {
  10. server.send(200, "text/html", "HELLO WORLD!");
  11. }
  12.  
  13. void setup() {
  14. Serial.begin(9600);
  15. Serial.println();
  16.  
  17. Serial.print("Connecting to WiFi");
  18. WiFi.mode(WIFI_STA);
  19. WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
  20. while (WiFi.status() != WL_CONNECTED) {
  21. Serial.print(".");
  22. delay(500);
  23. }
  24. Serial.println();
  25. Serial.println("WiFi connected");
  26. Serial.print("IP address: ");
  27. Serial.println(WiFi.localIP());
  28.  
  29. server.on("/", showMessage);
  30. server.begin();
  31. }
  32. void loop() {
  33. server.handleClient();
  34. }

Первым делом в коде программы нужно заменить WiFi_Name на имя нужной cести, а WiFi_Password на пароль от нее.

Создаем объект сетевого интерфейса и активируем его

  1. wlan = network.WLAN(network.STA_IF)
  2. wlan.active(True)

Подключаемся к сети и секунду ждем соединения

  1. wlan.connect(wlan_id, wlan_pass)
  2. time.sleep(1)

Проверяем состояние подключения. Если соединение еще не установлено, то проверяем снова, до тех пор, пока соединение не будет установлено. Если соединение не устанавливается, то скорее всего допущена ошибка в имени сети или пароле от нее.

  1. while wlan.isconnected() == False:
  2. pass

В сети есть специальный сервер, который выдает настройки вновь подключаемым устройствам — DHCP сервер. Помимо прочих настроек, он назначает устройствам IP- адреса. После подключения нашего устройства, ему был присвоен IP-адрес. Выведем этот адрес в терминал

  1. print('Device IP:', wlan.ifconfig()[0])

Например, может быть получен адрес 192.168.0.25 или 192.168.43.195. Но может быть и другой. Это зависит от настроек сети и уже подключенных к ней устройств. Не очень важно какой именно адрес был назначен нашему микроконтроллеру, главное, что этот адрес нам нужно запомнить, ведь именно по нему мы будем обращаться к устройству.

Создадим веб- сервер

  1. server = MicroPyServer()

Настроим его таким образом, что при обращении к главной странице будет вызываться функция show_message

  1. server.add_route("/", show_message)

На веб- сервере, или скажем: на сайте, может быть не одна страница, а много. Адрес страницы, к которой мы хотим обратиться мы передаем в адресе (URL) после домена сайта. Например http://pinlab.ru/page1 или http://pinlab.ru/page2. Если имя страницы отсутствует, то обращение происходит к главной странице. В коде нашего сервера адрес главной страницы обозначается символом /

Запускаем веб- сервер

  1. server.start()

Все, теперь на нашем устройстве запущен веб-сервер, который ждет присоединения клиента. Давайте присоединимся. Самое главное условие — чтобы сервер и клиент находились в одной сети. Например, если у тебя дома Wi-Fi роутер, к которому подключился микроконтроллер и к этому же роутеру подключен домашний компьютер, то микроконтроллер и компьютер находятся в одной сети. Тогда мы можем обратиться к нашему серверу с компьютера.

Если твой смартфон подключен по Wi-Fi к этому же роутеру, то можно обратиться к серверу с этого смартфона. Но если смартфон не подключен к этому же Wi-Fi роутеру, а выходит в интернет через сотовую вышку — то подключиться с него не получится. Прежде чем попытаться обратиться к серверу убедись, что сервер и клиент находятся в одной сети. После этого в адресной строке браузера нужно набрать IP- адрес, который получил микроконтроллер.

В нашем случае микроконтроллером был получен IP 192.168.43.195 при подключении к точке доступа Wi-Fi, которая создана посредством смартфона, поэтому его и вводим в браузер в смартфоне 192.168.43.195

Когда браузер обращается к главной странице нашего веб- сервера, веб сервер вызывает функцию show_message:

  1. def show_message(request, params):
  2. ''' request handler '''
  3. server.send("HELLO WORLD!")

В ней всего одна строка, в которой вызывается метод send, отправляющий клиенту ответ. Именно этот текст мы и увидели в браузере.

Таким образом мы написали простейший веб-сервер, который при обращении к нему отправляет строку приветствия.