收藏

Microdot 搭建 Web 服务

分类: 基础知识篇 >> ESP32基础知识 发布于 2024-05-16 436次阅读0点赞0收藏

在 ESP32 上搭建一个 Web 服务,并通过这个服务实现点灯的效果。

实验原理

1. Socket 套接字

说到 Socket,就不得不提两个计算机专业词汇最糟糕的翻译:鲁棒性(Robustness) 和 套接字(Socket),翻译之后与没有翻译的效果一样,依然看不懂什么意思。
当涉及到网络通信时,Socket 是一个常见的概念。它是在计算机网络中实现通信的一种抽象概念或编程接口。通过 Socket,不同计算机之间可以建立连接并进行数据交换。
Socket 可以看作是一种通信端点,它使用 IP 地址和端口号来标识不同的设备和应用程序。每个 Socket 都与一个特定的协议相关联,例如 TCP 或 UDP,用于在网络上进行数据传输。
Socket 是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议(通常是 TCP 或 UDP),本地主机的IP地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。

从上图可以看到,建立 Socket 通信需要一个服务器端和一个客户端。对于客户端,则需要知道电脑端的 IP 和端口即可建立连接。(端口可以自定义,范围在 0~65535,注意不占用常用的80等端口即可。)
下面是 Socket 的一些关键概念:
-IP地址:在计算机网络中,每个设备都有一个唯一的 IP 地址,用于标识设备的位置。IP 地址由一系列数字组成,例如 IPv4 地址是由四个十进制数(0-255)组成,中间用点分隔,如 192.168.0.1。

  • 端口号:端口号用于标识一个特定的应用程序或服务,使数据可以传输到正确的目的地。端口号是一个数字,范围从 0 到 65535。0 到 1023 的端口号是为一些特定的服务保留的,例如HTTP的端口号是80,HTTPS的端口号是443。
  • Socket 类型:在 Socket 编程中,有两种常见的套接字类型:Stream Socket(流套接字)和 Datagram Socket(数据报套接字)。
    • Stream Socket(流套接字) 使用 TCP 协议,提供可靠的、面向连接的通信,确保数据的可靠性和按顺序的传输。
    • Datagram Socket(数据报套接字) 使用 UDP 协议,提供无连接的通信,适用于实时性要求高的应用,如音视频传输。
  • 客户端和服务器:在 Socket 通信中,通常有两个主要角色:客户端 和 服务器。
  1. 客户端 是发起连接请求的一方,通常是一个应用程序或设备。
  2. 服务器是提供服务的一方,它监听指定的端口号,并等待客户端的连接请求。
    通过 Socket,客户端和服务器可以建立连接,并通过发送和接收数据进行通信。客户端可以向服务器发送请求,并接收服务器的响应。服务器可以接收客户端的请求,并向客户端发送响应。
    在实际的 Socket 编程中,使用不同编程语言提供的 Socket API,如 C/C++ 的 socket 库、Python 的 socket 模块等,来创建、连接、发送和接收数据。这些 API 提供了一组函数和方法,开发者可以使用这些函数和方法来实现网络通信的各个方面。
    总而言之,Socket 是一种用于实现网络通信的抽象概念,通过使用 IP 地址和端口号,不同计算机之间的应用程序可以建立连接,并通过发送和接收数据进行通信。
    所以,socket 的出现只是可以更方便的使用 TCP/IP 协议栈而已,简单理解就是其对 TCP/IP 进行了抽象,形成了几个最基本的函数接口。比如 create,listen,accept,connect,read 和 write 等等。以下是通讯流程:
    以上的内容,简单来说就是如果用户面向应用来说,那么 ESP32 只需要知道通讯协议是 TCP 或 UDP、服务器的 IP 和端口号这 3 个信息,即可向服务器发起连接和发送信息。

    2. 前端

    通过使用 HTML、CSS 和 JavaScript,前端开发者可以创建吸引人、交互式的 Web 页面和应用程序。HTML 负责构建页面结构,CSS 负责设计页面样式,JavaScript 负责处理用户行为和动态交互。这三种技术共同构建了现代 Web 开发的基础。

    硬件电路设计

    由于 ESP32 内置 WiFi 功能,所以直接在开发板上使用即可,无需额外连接。

    软件程序设计

    MicroPython 目前有两个 Web 框架:microWebSrv 和 Microdot。
    Microdot 是一个受 Flask 启发的简约 Python Web 框架,被设计为轻量级的 Web 服务器,适用于资源受限的嵌入式设备,例如 ESP32,ESP8266。它只需要很少的 RAM 和存储空间,并且具有较低的 CPU 消耗.
    下面是一个简单的介绍如何使用 Microdot:
    首先,我们需要在 Microdot 的 GitHub 仓库下载对应的文件 microdot.pyopen in new window,或者,在我们的 资料包 中的 3.开发工具 也能找到 Microdot 的源代码,并把该代码复制到 Micropython 设备中的 libs 目录下

    接着需要创建 Microdot 应用,导入 Microdot 模块,并创建一个 Microdot 应用对象
    ```python
    from libs.microdot import Microdot

app = Microdot()

在 Microdot 中,使用路由来指定 URL 与视图函数之间的关系。视图函数是处理请求并生成响应的函数。可以使用 @app.route 装饰器来定义路由,例如:
```python
@app.route('/')
def home():
    return 'Hello, MicroDot!'

在上述示例中,@app.route(‘/‘)定义了一个根路由,它对应于网站的根 URL。home()函数是视图函数,当访问根 URL 时,该函数将被执行。在此示例中,它简单地返回一个字符串作为响应。
最后就是运行这个应用,只需要在 Python 文件的末尾,添加一个简单的代码块:

if __name__ == '__main__':
    app.run()

这样我们就会启动 Microdot 开发服务器,并且监听默认的 5000 端口。你可以在手机端或者浏览器中访问 http://ESP32的局域网IP:5000 来查看应用程序的响应

我们可以通过以下方式实现手机 LED 亮灭的效果:

from machine import Pin

from common.wifi import wifi_connect
from libs.microdot import Microdot


led_pin = Pin(2, Pin.OUT)


# 定义 WIFI 的账号密码
ssid = 'wifi'
password = '123456qq.'

# 连接 WiFi
wifi_connect(ssid, password)

app = Microdot()

htmldoc = '''<!DOCTYPE html>
<html>
    <head>
        <title>ESP32 MicroPython Microdot Web 服务</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <div>
            <h1>ESP32 MicroPython Microdot Web 服务</h1>
            <p>你好,Microdot!</p>
            <p><a href="/shutdown">关闭服务</a></p>
            <p><a href="/led">开关灯</a></p>
        </div>
    </body>
</html>
'''


@app.route('/')
def hello(request):
    return htmldoc, 200, {'Content-Type': 'text/html'}


@app.route('/shutdown')
def shutdown(request):
    request.app.shutdown()
    return 'The server is shutting down...'

@app.route('/led')
def led(request):
    led_pin.value(not led_pin.value())
    return htmldoc, 200, {'Content-Type': 'text/html'}


app.run(host='0.0.0.0', port=5000, debug=True)
VIP
购买
建议
意见
联系
客服
在线咨询

您可以与在线客服进行沟通获得帮助

工作日:8:00~22:00节假日:9:00~20:00

微信号: mpyos01

Q Q号: 1401211620

免费
福利
0.025694s