
Всем привет!
Хочу рассказать о библиотеке MicroPyServer написанной на Python, которая позволяет взаимодействовать с устройствами ESP8266 и ESP32 посредством простого HTTP сервера.
Что такое MicroPyServer?
MicroPyServer это простой HTTP сервер предназначенный для проектов написанных на Micropython.
Основная концепция работы с библиотекой — это перехватывание запросов к устройству при помощи создания роутов (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, status=200, content_type="Content-Type: text/plain", extra_headers=[])
Отправить 404-ю ошибку — srv.not_found()
Отправить 500-ю ошибку — srv.internal_error(error)
Примеры
Рассмотрим несколько небольших примеров работы с библиотекой MicroPyServer.
Hello world
Классический пример hello world.
from micropyserver import MicroPyServer import esp import network ''' Код подключения к WiFi ''' wlan_id = "Your WiFi" wlan_pass = "Your WiFi password" wlan = network.WLAN(network.STA_IF) wlan.active(True) if wlan.isconnected() == False: wlan.connect(wlan_id, wlan_pass) while wlan.isconnected() == False: time.sleep(1) print('Device IP:', wlan.ifconfig()[0]) def show_message(request): ''' request handler ''' server.send("HELLO WORLD!") server = MicroPyServer() ''' add request handler ''' server.add_route("/", show_message) ''' start server ''' server.start()
Набрав у браузере адрес http://IP_вашего_устройства/ вы получите сообщение "HELLO WORLD!"
Простой пример настройки роутинга и управления выводом GPIO
В данном примере настроим обработку двух урлов которые будут делать: "включение" (/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 в JSON
В данном примере показано как получить данные с датчика влажности и температуры DHT22 в виде 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()
Набрав у браузере адрес http://IP_вашего_устройства/data получим JSON строку с данными
Опыт использования
Данная библиотека используется в нескольких моих устройствах, которые работают в режиме 24/7 уже более полугода. На данный момент никаких проблем с сервером я не обнаружил и надеюсь, что в будущем код сервера будет работать также без проблем как и сейчас.
