MicroPyServer - простой и быстрый веб сервер для ESP8266 и ESP32

Хочу рассказать о библиотеке MicroPyServer написанной на Python, которая позволяет взаимодействовать с устройствами ESP8266 и ESP32 посредством простого HTTP сервера.

Что такое MicroPyServer?

MicroPyServer это простой HTTP сервер предназначенный для проектов написанных на Micropython, для ESP8266 и ESP32. Основная концепция работы с библиотекой — это перехватывание запросов к устройству при помощи создания роутов (route) и функций обработчиков (handler).

Основные действия с библиотекой:

Создание сервера:

srv = MicroPyServer()

По умолчанию сервер работает на 80-ом порту.

Добавление роута, который будет обрабатывать запросы по заданному урлу:

def do_something(request):
  pass()
srv.add_route("/url_path", do_something)

По умолчанию обрабатываются GET запросы.

Отправка данных клиенту:

def do_something(request):
 srv.send("OK")

По умолчанию отправляется код ответа 200 и Content-Type: text/plain.

Запуск сервера:

srv.start()

Библиотеку MicroPyServer можно скачать тут https://github.com/troublegum/micropyserver

Список методов библиотеки MicroPyServer

  • Конструктор — srv = MicroPyServer(host="0.0.0.0", port=80)
  • Запустить сервер — srv.start()
  • Добавление роута — srv.add_route(path, handler, method="GET")
  • Отправить ответ — srv.send(response)
  • Отправить 404-ю ошибку — srv.not_found()
  • Отправить 500-ю ошибку — srv.internal_error(error)

Примеры скетчев

Рассмотрим несколько небольших примеров работы с библиотекой MicroPyServer. Для загрузки в платы ESP8266 и ESP32 советую использовать Thonny IDE.

Код подключения к сети Wi-Fi

import network

wlan_id = "your wi-fi"
wlan_pass = "your password"

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

while not wlan.isconnected():
    wlan.connect(wlan_id, wlan_pass)
print("Connected... IP: " + wlan.ifconfig()[0])  

Пример Hello world

Классический пример hello world. Набрав в браузере адрес http://IP_вашего_устройства/ вы получите сообщение "HELLO WORLD!".

from micropyserver import MicroPyServer

import network

wlan_id = "your wi-fi"
wlan_pass = "your password"

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

while not wlan.isconnected():
    wlan.connect(wlan_id, wlan_pass)
print("Connected... IP: " + wlan.ifconfig()[0])  

def hello_world(request):
    ''' request handler '''
    server.send("HELLO WORLD!")

server = MicroPyServer()
''' add route '''
server.add_route("/", hello_world)
''' start server '''
server.start()

Простой пример настройки роутинга и управления выводом GPIO в ESP8266

В данном примере настроим обработку двух урлов которые будут делать: "включение" (/on) и "выключение" (/off) светодиода подключенного к выходу D7 ESP8266.

from machine import Pin
from micropyserver import MicroPyServer

''' Тут должен быть код подключения к WiFi '''

def do_on(request):
    ''' on request handler '''
    pin.value(1)
    server.send("ON")

def do_off(request):
    ''' off request handler '''
    pin.value(0)
    server.send("OFF")

pin = machine.Pin(13, machine.Pin.OUT)
server = MicroPyServer()
''' add request handlers '''
server.add_route("/on", do_on)
server.add_route("/off", do_off)
''' start server '''
server.start()

В итоге набрав у браузере адрес http://IP_вашего_устройства/on вы включите подключенный к выходу D7 светодиод и в браузере выведется сообщение "ON". Соответственно набрав у браузере адрес http://IP_вашего_устройства/off вы выключите светодиод.

Пример вывода информации с датчика DHT подклюенного к ESP8266, в JSON форме

В данном примере показано как получить данные с датчика влажности и температуры DHT22 подключенного к плате ESP8266, в виде JSON ответа сервера.

import json
import dht
from machine import Pin
from micropyserver import MicroPyServer

''' Тут должен быть код подключения к WiFi '''

def show_data(request):
    ''' request handler '''
    d = dht.DHT22(machine.Pin(4))
    d.measure()
    data = {"temperature":  d.temperature(), "humidity": d.humidity()}
    json_str = json.dumps(data)
    server.send(json_str,  content_type="Content-Type: application/json")

server = MicroPyServer()
''' add request handler '''
server.add_route("/data", show_data)
''' start server '''
server.start()

Опыт использования библиотеки на практике

Данная библиотека используется в нескольких моих устройствах, которые работают в режиме 24/7 уже более полугода. На данный момент никаких проблем с сервером я не обнаружил и надеюсь, что в будущем код сервера будет работать также без проблем как и сейчас.