【ESP32+MicroPython】网络编程基础

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与互联网的实时交互,并将其应用到各种物联网项目中。

相关推荐
Novproxy_Z5 小时前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
垆边人似月.5 小时前
RDMA 文件传输踩坑(五):READY 发送成功后,为什么出现 Work Request Flushed Error?
服务器·网络·tcp/ip
前端精髓5 小时前
结构化输出with_structured_output(抽卡)
python·langchain
HideF5 小时前
nmcli
linux·服务器·网络
qetfw6 小时前
UOS DHCP Relay:跨网段分配与 IP、DNS、网关验证
linux·服务器·网络·tcp/ip·uos
尹人入圣6 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
Nuanyt6 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌7 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987377 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
中屹指纹浏览器svip7 小时前
只用指纹浏览器,不搭配IP可以吗?
网络