前言
ESP32开发板自带WIFI模块的,本次案例通过串口配置ESP32的WIFI,然后开启HTTTP服务,基于服务发送API接口控制ESP32的GPIO功能。
提示:以下代码都保存于ESP32设备里面,最后通过调用main.py文件循环监听串口和HTTP服务。
一、实战内容介绍
本次实战是用Thonny工具,在ESP32设备新建py文件,项目具备保存WIFI SSID和密码功能,也可以同串口连接查看和更新密码。
二、项目简介
1. 更新Wifi配置
代码如下(示例):代码为加载和保存wifi 。
import ujson
def save_dict_to_file(data_dict):
with open("config.json", 'w') as f:
ujson.dump(data_dict, f)
def load_dict_from_file(filename):
try:
with open(filename, 'r') as f:
return ujson.load(f)
except:
return {} # 文件不存在时返回空字典
2. 串口更新Wifi
通过串口Uart1 发送如下命令更新ESP存储的WIFI。
R_WIFI: 读取当前WIFI配置
W_WIFI_SSID your_ssid: 更新wifi名
W_WIFI_PWD your_password: 更新wifi密码
示例代码如下:
# ESP32 代码:uart_echo.py
from machine import UART
import time
from load_config import load_dict_from_file, save_dict_to_file
def reload_wifi(received_data):
if "R_WIFI" in received_data:
wifi_setting = load_dict_from_file('config.json')
ret = f"SSID: {wifi_setting['SSID']}, PWD: {wifi_setting['PWD']}"
elif "W_WIFI_SSID" in received_data:
ssid = received_data.split(' ')[1].strip()
wifi_setting = load_dict_from_file('config.json')
wifi_setting['SSID'] = ssid
save_dict_to_file(wifi_setting)
ret = "SSID set successful !"
elif "W_WIFI_PWD" in received_data:
pwd = received_data.split(' ')[1].strip()
wifi_setting = load_dict_from_file('config.json')
wifi_setting['PWD'] = pwd
save_dict_to_file(wifi_setting)
ret = "PWD set successful !"
else:
pass
return ret+ '\n'
def uart1_handler(received):
"""处理串口信息 """
ret = reload_wifi(received)
return ret
3. 处理HTTP接口响应
WIFI连接成功后开启服务,并且接收API响应,代码如下。
import network
import socket
import time
from html_page import get_html_index, get_html_alert
from set_gpio import led_status, set_io_value
import re
import machine
# 处理 HTTP 请求
def handle_request(conn):
request = conn.recv(1024).decode() # 接收客户端请求
print("收到请求:\n", request)
# 解析请求方法(GET/POST)
if "GET / HTTP/1.1" in request:
response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
response += get_html_index()
elif "GET /led/on HTTP/1.1" in request:
led_status(True)
response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
response += get_html_index()
elif "GET /led/off HTTP/1.1" in request:
led_status(False)
response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
response += get_html_index()
elif "GET /gpio/set" in request:
request = request.split('\n')[0]
match = re.search(r'pin=(\d+)&state=(\d+)', request)
if match:
pin = int(match.group(1))
state = int(match.group(2))
set_io_value(pin, state)
response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
response += get_html_alert(f"GPIO PIN{pin} SET {state} !")
elif "GET /restart HTTP/1.1" in request:
machine.soft_reset() # 软复位(等同于reset)
machine.hard_reset() # 硬复位(部分固件支持)
else:
response = "HTTP/1.1 404 Not Found\r\n\r\n"
conn.send(response.encode()) # 发送响应
conn.close()
# 启动 HTTP 服务器
def start_http_server(sock):
conn, addr = sock.accept()
handle_request(conn)
4. main.py
以下是主程序,循环监听串口和HTTP请求。
# ESP32 代码:uart_echo.py
from machine import UART
import time
from connect_wifi import connect_wifi as _connect_wifi
import network
from http_server import start_http_server
from uart_send import uart1_handler
import network
import socket
WIFI_CONNECTED = None
# 配置 Wi-Fi
this_wifi = network.WLAN(network.STA_IF) # 设置工作站模式
this_wifi.active(True)
if __name__ == "__main__":
uart = UART(1, baudrate=115200, tx=17, rx=16)
ret = _connect_wifi(this_wifi)
if ret[0] is 0:
WIFI_CONNECTED = True
print(f"Wifi Connected,IP地址:{ret[1]}")
else:
WIFI_CONNECTED = False
print(ret[1])
if WIFI_CONNECTED:
addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1] # 监听 80 端口
sock = socket.socket() # 避免被占用,先关闭再打开
sock.close()
sock = socket.socket()
sock.bind(addr)
sock.listen(5)
print("HTTP 服务器已启动,访问地址: http://" + network.WLAN(network.STA_IF).ifconfig()[0])
while True:
if uart.any(): # 检查是否有数据
received_data = uart.read().decode('utf-8').strip()
ret = uart1_handler(received_data)
uart.write(ret)
if WIFI_CONNECTED:
start_http_server(sock)
三、运行结果
运行主程序,通过串口发送WIFI的SSID和密码,更新配置,点击板载复位按钮,Thonny终端打印如下信息表明Wifi已经连接,服务已经启动:
打开浏览器,访问如上地址,浏览器显示ESP32返回的Response网页,如下:
通过对浏览器页面的按钮就可以自由控制ESP32内部的GPIO,和控制显示LED状态。
总结
以上就是基于Micropython开发ESP32,实现物联网开发的样例,项目代码见我的仓库:https://gitee.com/andyhus/esp32-wifi-control-panel/blob/master/README.md