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


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

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

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

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

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

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

Exp57.py
  1. from micropyserver import MicroPyServer
  2. import time
  3. import network
  4. import gc
  5. _init()
  6. gc.collect()
  7.  
  8. wlan_id = "Wi-Fi_Name"
  9. wlan_pass = "Wi-Fi_Password"
  10.  
  11. wlan = network.WLAN(network.STA_IF)
  12. wlan.active(True)
  13. wlan.connect(wlan_id, wlan_pass)
  14. time.sleep(1)
  15.  
  16. while wlan.isconnected() == False:
  17. pass
  18.  
  19. print('Device IP:', wlan.ifconfig()[0])
  20.  
  21. def show_message(request, params):
  22. ''' request handler '''
  23. server.send("HELLO WORLD!")
  24.  
  25. server = MicroPyServer()
  26. ''' add request handler '''
  27. server.add_route("/", show_message)
  28. ''' start server '''
  29. server.start()

Первым делом в коде программы нужно заменить Wi-Fi_Name на имя нужной ести, а Wi-Fi_Password на пароль от нее.

gc.collect() — вызывается для сборки «мусора». Переменные, объекты и данные, которые были использованы в программах не сразу удаляются из памяти микроконтроллера после завершения использования и даже после завершения программы. Python удаляет эти данные постепенно. Чтобы очистить память немедленно мы и вызываем gc.collect(). Без этого при многократных запусках программ может возникнуть нехватка памяти.

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

  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, отправляющий клиенту ответ. Именно этот текст мы и увидели в браузере.

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