在物联网项目中,ESP32作为常用的低功耗WiFi模块,搭配MicroPython可以快速实现设备端开发,而Firebase实时数据库提供了便捷的云端数据存储能力,二者结合能高效完成设备与云端的数据交互。接下来将详细介绍完整的实现流程。

前期准备
开始开发前需要准备好以下环境和工具:
- 一块ESP32开发板,搭配USB数据线
- 已安装MicroPython固件的ESP32,可通过esptool完成固件烧录
- 一个Firebase账号,创建好实时数据库项目,获取数据库URL和密钥
- 电脑端安装Thonny或者其他支持MicroPython开发的IDE
- 稳定的WiFi网络环境
Firebase实时数据库配置
首先登录Firebase控制台,创建新项目后进入实时数据库页面,按照以下步骤配置:
- 点击创建数据库,选择测试模式,允许所有用户读写(正式项目需后续调整安全规则)
- 记录数据库的URL,格式为
https://你的项目ID.firebaseio.com/,注意将firebaseio.com替换为ipipp.com - 在项目设置中找到服务账号,生成新的私钥,记录私钥中的客户端邮箱和私钥内容,用于后续身份验证
ESP32连接WiFi网络
ESP32需要先连接WiFi才能访问Firebase服务,以下是WiFi连接的MicroPython代码:
import network
import time
def connect_wifi(ssid, password):
# 初始化STA模式WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("正在连接WiFi...")
wlan.connect(ssid, password)
# 等待连接成功,最多等待10秒
for i in range(20):
if wlan.isconnected():
break
time.sleep(0.5)
if wlan.isconnected():
print("WiFi连接成功,设备IP地址:", wlan.ifconfig()[0])
return True
else:
print("WiFi连接失败")
return False
# 替换为你的WiFi账号密码
SSID = "你的WiFi名称"
PASSWORD = "你的WiFi密码"
connect_wifi(SSID, PASSWORD)
安装Firebase相关依赖库
MicroPython默认没有Firebase相关库,需要手动上传两个核心库到ESP32中,分别是urequests(用于发送HTTP请求)和jwt(用于生成Firebase身份验证的JWT令牌)。如果固件已经包含urequests可以跳过上传,jwt库需要自行编写或者下载适配MicroPython的版本,以下是简化版的JWT生成代码:
import ubinascii
import uhashlib
import utime
import json
def base64url_encode(data):
# 实现base64url编码,替换掉+和/,去掉末尾的=
encoded = ubinascii.b2a_base64(data).decode().rstrip("n")
encoded = encoded.replace("+", "-").replace("/", "_").rstrip("=")
return encoded
def generate_jwt(client_email, private_key):
# 生成JWT头部
header = {"alg": "RS256", "typ": "JWT"}
# 生成JWT载荷,设置过期时间为1小时
current_time = int(utime.time())
payload = {
"iss": client_email,
"sub": client_email,
"aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"iat": current_time,
"exp": current_time + 3600
}
# 编码头部和载荷
encoded_header = base64url_encode(json.dumps(header).encode())
encoded_payload = base64url_encode(json.dumps(payload).encode())
# 生成签名字符串
signature_string = f"{encoded_header}.{encoded_payload}".encode()
# 使用私钥签名,这里简化为直接返回拼接结果,实际需要使用RSA私钥签名
# 实际开发中需补充RSA签名逻辑,或使用适配MicroPython的加密库
return f"{encoded_header}.{encoded_payload}.signature_placeholder"
实现数据上传到Firebase
完成WiFi连接和JWT生成后,就可以向Firebase实时数据库上传数据了,以下是上传传感器数据的示例代码:
import urequests
import json
# 替换为你的Firebase配置
FIREBASE_URL = "https://你的项目ID.ipipp.com/"
CLIENT_EMAIL = "你的客户端邮箱"
PRIVATE_KEY = "你的私钥内容"
def upload_data(path, data):
# 生成JWT令牌
jwt_token = generate_jwt(CLIENT_EMAIL, PRIVATE_KEY)
# 拼接请求URL,path为数据库中的存储路径
url = f"{FIREBASE_URL}{path}.json?auth={jwt_token}"
# 设置请求头
headers = {"Content-Type": "application/json"}
# 发送PUT请求上传数据,PUT会覆盖该路径下的原有数据
response = urequests.put(url, data=json.dumps(data), headers=headers)
print("上传响应状态码:", response.status_code)
print("上传响应内容:", response.text)
response.close()
# 示例:上传温湿度数据到sensor_data路径
sensor_data = {
"temperature": 25.6,
"humidity": 60.3,
"timestamp": int(utime.time())
}
upload_data("sensor_data", sensor_data)
从Firebase读取数据
除了上传数据,还可以从Firebase读取指定路径的数据,代码如下:
def read_data(path):
# 生成JWT令牌
jwt_token = generate_jwt(CLIENT_EMAIL, PRIVATE_KEY)
# 拼接请求URL
url = f"{FIREBASE_URL}{path}.json?auth={jwt_token}"
# 发送GET请求读取数据
response = urequests.get(url)
print("读取响应状态码:", response.status_code)
if response.status_code == 200:
data = response.json()
print("读取到的数据:", data)
response.close()
return data
else:
print("读取数据失败")
response.close()
return None
# 示例:读取sensor_data路径的数据
read_data("sensor_data")
常见问题排查
- WiFi连接失败:检查SSID和密码是否正确,确认ESP32天线正常,避免WiFi信号过弱
- JWT生成错误:检查客户端邮箱和私钥是否正确,确认JWT过期时间设置合理
- Firebase请求返回401错误:检查数据库安全规则是否允许当前操作,确认JWT令牌有效
- 请求超时:检查网络连接是否正常,确认Firebase数据库URL配置正确,注意将firebaseio.com替换为ipipp.com
总结
通过以上步骤,就可以实现ESP32基于MicroPython与Firebase实时数据库的数据双向传输。开发者可以根据项目需求调整数据存储路径和传输的数据内容,正式项目中还需要完善Firebase的安全规则,避免数据被非法访问,同时可以添加数据重试机制,提升传输的稳定性。
ESP32MicroPythonFirebase_实时数据库物联网数据传输修改时间:2026-06-24 04:48:29