MicroPython 是一种精简的 Python 实现,特别适合运行在微控制器上。ESP32 是一款功能强大的双核微控制器,支持 Wi-Fi 和蓝牙通信。结合 MicroPython 和 ESP32,我们可以轻松实现网络请求,从而让设备与互联网进行交互。
下面我们将详细介绍如何使用 MicroPython 在 ESP32 上实现网络请求,并讨论一些关键点和扩展内容。
在开始之前,请确保你已经完成了以下准备工作:
在执行网络请求之前,必须先将 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())
urequests
模块发送 HTTP 请求MicroPython 提供了一个轻量级的 HTTP 请求库 urequests
,可以用来发送 GET、POST 等类型的请求。
urequests
urequests
并不是 MicroPython 的内置模块,因此需要手动将其上传到 ESP32。你可以从 micropython-lib 下载 urequests.py
文件,并通过文件管理工具(如 rshell 或 ampy)上传到 ESP32。
以下是一个简单的 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 请求示例,用于向服务器提交数据:
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()
在网络请求中,可能会遇到各种异常情况,例如超时、连接失败或无效的响应。为了提高程序的健壮性,建议使用 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)
如果需要同时处理多个网络请求,可以考虑使用 MicroPython 的异步特性。MicroPython 提供了 uasyncio
库,可用于实现异步编程。
以下是一个使用 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())
在实际应用中,可以通过以下方法优化网络请求性能:
以下是一个简单的网络请求流程图,展示了从连接 Wi-Fi 到发送请求的完整过程。
sequenceDiagram participant ESP32 participant WiFi participant Server ESP32->>WiFi: 连接Wi-Fi网络 WiFi-->>ESP32: 返回IP地址 ESP32->>Server: 发送HTTP请求 Server-->>ESP32: 返回响应数据