ESP32使用MicroPython实现网络请求

2025-06发布2次浏览

MicroPython 是一种精简的 Python 实现,特别适合运行在微控制器上。ESP32 是一款功能强大的双核微控制器,支持 Wi-Fi 和蓝牙通信。结合 MicroPython 和 ESP32,我们可以轻松实现网络请求,从而让设备与互联网进行交互。

下面我们将详细介绍如何使用 MicroPython 在 ESP32 上实现网络请求,并讨论一些关键点和扩展内容。


1. 准备工作

在开始之前,请确保你已经完成了以下准备工作:

  • 安装了支持 ESP32 的 MicroPython 固件。
  • 配置好了开发环境(例如使用 Thonny 或 VSCode)。
  • 确保 ESP32 已连接到 Wi-Fi 网络。

连接到 Wi-Fi 网络

在执行网络请求之前,必须先将 ESP32 连接到 Wi-Fi 网络。以下是连接到 Wi-Fi 的代码示例:

import network
import time

# 初始化Wi-Fi模块
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# 替换为你的Wi-Fi名称和密码
ssid = "your_wifi_ssid"
password = "your_wifi_password"

if not wlan.isconnected():
    print("Connecting to WiFi...")
    wlan.connect(ssid, password)
    while not wlan.isconnected():
        time.sleep(1)
print("WiFi connected:", wlan.ifconfig())

2. 使用 urequests 模块发送 HTTP 请求

MicroPython 提供了一个轻量级的 HTTP 请求库 urequests,可以用来发送 GET、POST 等类型的请求。

安装 urequests

urequests 并不是 MicroPython 的内置模块,因此需要手动将其上传到 ESP32。你可以从 micropython-lib 下载 urequests.py 文件,并通过文件管理工具(如 rshell 或 ampy)上传到 ESP32。

发送 GET 请求

以下是一个简单的 GET 请求示例,用于获取某个 API 的数据:

import urequests

# 发送GET请求
response = urequests.get("https://jsonplaceholder.typicode.com/posts/1")
if response.status_code == 200:
    data = response.json()
    print("Response Data:", data)
else:
    print("Failed to fetch data. Status Code:", response.status_code)

response.close()

发送 POST 请求

以下是一个 POST 请求示例,用于向服务器提交数据:

import urequests

# 构造POST请求的数据
data = {"title": "foo", "body": "bar", "userId": 1}

# 发送POST请求
response = urequests.post(
    "https://jsonplaceholder.typicode.com/posts",
    json=data
)

if response.status_code == 201:
    print("Post successful:", response.json())
else:
    print("Post failed. Status Code:", response.status_code)

response.close()

3. 处理异常和错误

在网络请求中,可能会遇到各种异常情况,例如超时、连接失败或无效的响应。为了提高程序的健壮性,建议使用 try-except 块来捕获这些异常。

import urequests

url = "https://jsonplaceholder.typicode.com/posts/1"

try:
    response = urequests.get(url)
    if response.status_code == 200:
        data = response.json()
        print("Response Data:", data)
    else:
        print("Request failed with status code:", response.status_code)
    response.close()
except Exception as e:
    print("An error occurred:", e)

4. 使用异步方式处理网络请求

如果需要同时处理多个网络请求,可以考虑使用 MicroPython 的异步特性。MicroPython 提供了 uasyncio 库,可用于实现异步编程。

异步 GET 请求示例

以下是一个使用 uasyncio 的异步 GET 请求示例:

import uasyncio as asyncio
import urequests

async def fetch_data(url):
    print(f"Fetching {url}...")
    response = urequests.get(url)
    if response.status_code == 200:
        data = response.json()
        print(f"Received data from {url}: {data}")
    else:
        print(f"Failed to fetch data from {url}. Status Code: {response.status_code}")
    response.close()

async def main():
    urls = [
        "https://jsonplaceholder.typicode.com/posts/1",
        "https://jsonplaceholder.typicode.com/posts/2",
        "https://jsonplaceholder.typicode.com/posts/3"
    ]
    tasks = [fetch_data(url) for url in urls]
    await asyncio.gather(*tasks)

# 启动异步任务
asyncio.run(main())

5. 扩展讨论:优化网络请求性能

在实际应用中,可以通过以下方法优化网络请求性能:

  • 缓存响应数据:对于不经常变化的数据,可以缓存响应结果以减少重复请求。
  • 压缩传输数据:使用 Gzip 或其他压缩算法减小传输数据的大小。
  • 重试机制:在网络不稳定的情况下,实现自动重试功能。

流程图:网络请求的主要流程

以下是一个简单的网络请求流程图,展示了从连接 Wi-Fi 到发送请求的完整过程。

sequenceDiagram
    participant ESP32
    participant WiFi
    participant Server

    ESP32->>WiFi: 连接Wi-Fi网络
    WiFi-->>ESP32: 返回IP地址
    ESP32->>Server: 发送HTTP请求
    Server-->>ESP32: 返回响应数据