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

相关推荐
爱蜜莉雅丶Emilia1 分钟前
计算机网络 TCP/IP体系 数据链路层
网络·tcp/ip·计算机网络
墨城烟柳Q10 分钟前
自动化爬虫-selenium模块万字详解
爬虫·python·selenium·自动化
raoxiaoya13 分钟前
python安装selenium,geckodriver,chromedriver
开发语言·python·selenium
weixin_4426434225 分钟前
FileLink如何帮助医疗行业实现安全且高效的跨网文件交换
网络·安全·web安全·filelink跨网文件交换
huaqiwangan26 分钟前
什么是安全威胁情报?
网络·安全
Dxy12393102161 小时前
python使用requests发送请求ssl错误
开发语言·python·ssl
Tassel_YUE1 小时前
网络自动化03:简单解释send_config_set方法并举例
网络·自动化·cocoa
gxchai1 小时前
利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印
python
ao_lang1 小时前
剑指offer第五天
python·算法·cpp
hope_wisdom1 小时前
C++网络编程之IO多路复用(一)
网络·c++·select·io多路复用