Промо


Всем привет!


Хочу рассказать о библиотеке 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 уже более полугода. На данный момент никаких проблем с сервером я не обнаружил и надеюсь, что в будущем код сервера будет работать также без проблем как и сейчас.

Комментарии (19)


  1. Javian
    01.12.2019 23:07

    Почему бы вместо JSON не выдать HTML. Готовая метеостанция с вебинтерфейсом.


    1. Alyoshka1976
      01.12.2019 23:51

      Или в MQTT-топики публиковать — питоновский MQTT-клиент paho весьма функционален (по крайней мере, в десктопном варианте — хотя в нем и нет в отличие от Java setAutoReconnect).
      А для просмотра в MQTT-клиенте можно настроить интерфейс по своему желанию, начиная с такого спартанского варианта:
      image
      Недостаток — потребуется использовать стороннего брокера или развернуть свой "москито", что удобнее — на VPS.


  1. Paskin
    02.12.2019 00:28

    Вот эта строка

    return str(self._connect.recv(4096), "utf8")

    при определенных условиях сможет подарить вам несколько незабываемых часов отладки, причем даже если запрос будет меньше 4096 байт размером.


    1. Meklon
      02.12.2019 08:16

      А как правильно?


  1. empenoso
    02.12.2019 10:00

    Не в качестве критики, но чем это решение лучше использования готовой прошивки (ESPHome или Tasmota), которую просто потом донастроить для различных датчиков или даже шаговых двигателей?


    1. renat85
      02.12.2019 22:27

      Думаю что размером выполняемого кода.


  1. Pest85
    02.12.2019 10:02

    Есть облачные сервисы которые неплохо работают с IoT
    Нарпимер, thingspeak — бесплатный (с лимитами) API как раз для таких штук.
    Настроили отправку раз в 2-5-10 минут и можно смотреть и текущее значение и историю, даже не находясь в локальной сети.
    При желании можно к тому же облачному API можео прикрутить веб морду которая будет от него забирать данные.
    Использовал с esp8266 года полтора, без каких либо проблем.


    1. dernuss
      02.12.2019 17:09
      +2

      Есть облачные сервисы которые неплохо работают с IoT

      А через n лет эти облака перестают существовать)


      1. Pest85
        03.12.2019 03:28

        Вопрос лишь в соотношении трудозатрат к результату и требованиям.
        Потеря данных о температуре в спальне n лет назад конечно печальна, но не критична.
        А вот из коробки вы получаете и публичный API с ключом, и хранилище, и начальную аналитику, и доступ из любого места где сеть есть.
        Да это все можно сделать вручную, особенно если важен сам процесс. Да, я бы не стал подключать публичные сервисы если ардуино контролирует что-то, как например замок от двери итд.
        Но для не критичных данных это быстный и довольно удобный выход.


    1. AKYLA
      02.12.2019 22:27

      Облака это не всегда хорошее решение, и не везде подходит. Как показывает практика, лучше иметь свою экосистему. Облако завтра может быть закрыто по любой причине (даже у Гугла внезапно закрываются сервисы). Самое надёжное поставить малину как сервис и завести на ней все что угодно, при этом будет и в мир смотреть


  1. zoldaten
    02.12.2019 15:49

    поедет это все на esp8266-esp01? все-таки nodemcu жирновато для датчика…


    1. Rhonstim
      02.12.2019 22:27

      На обоих версиях (512 кб и 1мб) должно поднятся, только в первой не будет возможности отдавать html файлы


    1. troublegum Автор
      02.12.2019 22:28

      Да, будет работать. Все остальное зависит от размера вашего кода.


      1. zoldaten
        03.12.2019 16:29

        Чем вы шьете esp? ide? fstool?


        1. webself
          03.12.2019 16:59

          nodemcu-pyflasher например


  1. and7ey
    02.12.2019 20:40

    Как captive portal эту штуку настроить можно? Чтоб и https на страницу авторизации направлял.


  1. insolor
    02.12.2019 22:39

    Уже существуют проекты github.com/jczic/MicroWebSrv и github.com/jczic/MicroWebSrv2. Правда ESP8266 похоже не поддерживается (могу ошибаться).


    1. troublegum Автор
      02.12.2019 22:45

      Да, есть такие проекты, но работают они только с ESP32. И размер кода библиотеки к сожалению довольно большой.


  1. madf
    03.12.2019 12:52

    Отличный пример того, как весь инет читает твою домашнюю информацию. ) Иначе слабо представляю удобство такого использования. Можно конечно дальше сервер на сервер натянуть, собирать данные с них в одно место, которое будет с ограниченным доступом, но тогда получается сомнительность такой нагрузки/потребления на ESP (и как следствие, более узкая область использования).