ESP32作为一款集成了Wi-Fi和蓝牙模块的微控制器,可以方便地与互联网连接,进行HTTP请求和数据传输。本教程将从Wi-Fi连接开始,逐步讲解ESP32如何在MicroPython环境下发送HTTP请求,并展示一些应用实例。我们将涵盖以下内容:
- Wi-Fi连接的基本配置
- 发送HTTP GET和POST请求
- 解析响应数据
通过本教程,你将能够让ESP32接入Wi-Fi网络,并通过HTTP请求与Web服务器或API交互,完成数据的获取与发送。
连接Wi-Fi
Wi-Fi连接的原理
ESP32的Wi-Fi模块支持Station(客户端)和Access Point(热点)模式。通常情况下,将其设置为Station模式,通过设置Wi-Fi名称(SSID)和密码连接到已知网络。
代码实现
首先,我们定义一个简单的Wi-Fi连接函数,将ESP32连接到指定网络。
python
import network
import time
def connect_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF) # STA模式
wlan.active(True) # 激活网络
wlan.connect(ssid, password) # 连接指定的SSID和密码
print("连接中...")
while not wlan.isconnected(): # 等待连接成功
print(".", end="")
time.sleep(1)
print("\n已连接!")
print("网络配置:", wlan.ifconfig()) # 打印网络配置信息
# 输入你的Wi-Fi信息
SSID = "你的WiFi名称"
PASSWORD = "你的WiFi密码"
connect_wifi(SSID, PASSWORD)
- network.WLAN :创建一个WLAN对象,将模式设置为
network.STA_IF
(Station模式)。 - wlan.active(True):激活Wi-Fi模块。
- wlan.connect(ssid, password):连接指定的Wi-Fi网络。
- wlan.isconnected():检测是否成功连接。
检测连接状态
在某些项目中,你可能需要检查Wi-Fi是否断开连接,并重新连接。可以在代码中加入检测连接状态的功能。
发送HTTP请求
ESP32可以通过urequests
库实现HTTP请求。通常情况下,我们可以使用GET请求从服务器获取数据,用POST请求向服务器发送数据。
安装urequests
库
在MicroPython中,urequests
库通常已内置于ESP32固件中。如果没有,可以通过upip
进行安装。
python
# 运行以下代码安装urequests库
import upip
upip.install('micropython-urequests')
HTTP GET请求
以下代码示例展示如何通过GET请求从API中获取数据,例如从JSONPlaceholder获取一个测试JSON数据。
python
import urequests
def send_get_request(url):
response = urequests.get(url) # 发送GET请求
print("状态码:", response.status_code) # 打印状态码
print("响应数据:", response.text) # 打印响应数据
response.close() # 关闭请求
url = "http://jsonplaceholder.typicode.com/todos/1"
send_get_request(url)
- urequests.get(url):发送GET请求,返回一个响应对象。
- response.status_code:获取响应的状态码。
- response.text:获取响应的数据内容。
- response.close():关闭响应,释放内存。
HTTP POST请求
POST请求通常用于向服务器发送数据。在MicroPython中,我们可以通过指定请求头和数据来实现POST请求。
以下示例演示如何通过POST请求发送JSON数据到服务器。
python
import urequests
import json
def send_post_request(url, data):
headers = {'Content-Type': 'application/json'} # 设置JSON格式的请求头
response = urequests.post(url, headers=headers, data=json.dumps(data)) # 发送POST请求
print("状态码:", response.status_code)
print("响应数据:", response.text)
response.close()
url = "http://jsonplaceholder.typicode.com/posts"
data = {
"title": "ESP32 Test",
"body": "This is a test message from ESP32.",
"userId": 1
}
send_post_request(url, data)
- headers:设置请求头,用于告诉服务器传递的数据为JSON格式。
- json.dumps(data):将字典格式的数据转换为JSON格式的字符串。
- urequests.post(url, headers, data):发送POST请求,并包含请求头和数据。
处理响应数据
在实际应用中,获取到的数据通常是JSON格式。可以通过json.loads()
方法将数据解析为字典格式。
python
import urequests
import json
def get_json_data(url):
response = urequests.get(url)
data = json.loads(response.text) # 将响应数据解析为字典格式
response.close()
return data
url = "http://jsonplaceholder.typicode.com/todos/1"
json_data = get_json_data(url)
print("ID:", json_data["id"])
print("Title:", json_data["title"])
ESP32作为HTTP服务器
ESP32可以创建一个Socket服务器,通过监听指定端口接收客户端请求,并返回响应数据。这种方法常用于物联网项目中的局域网数据传输。
以下代码展示如何在ESP32上创建一个简单的HTTP服务器。
python
import socket
def start_server():
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] # 监听80端口
s = socket.socket()
s.bind(addr)
s.listen(1)
print("服务器启动,正在监听端口 80...")
while True:
cl, addr = s.accept()
print("客户端连接自", addr)
request = cl.recv(1024) # 接收请求数据
print("请求内容:", request)
# 返回HTTP响应
response = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n<h1>Hello from ESP32</h1>"
cl.send(response) # 发送响应数据
cl.close()
start_server()
- socket.getaddrinfo('0.0.0.0', 80):获取网络地址信息,监听80端口。
- s.listen(1):设置最大连接数为1。
- cl.recv(1024):接收客户端请求数据,数据量上限为1024字节。
- cl.send(response):发送HTTP响应,响应内容为HTML格式的简单页面。
总结
本教程介绍了ESP32在MicroPython环境下的Wi-Fi连接及HTTP请求的实现,涵盖了从基础的GET和POST请求到数据上传的进阶应用。通过掌握这些技术,你可以实现ESP32与互联网的实时交互,并将其应用到各种物联网项目中。