3种通信方式全掌握:ESP32-WiFi/蓝牙/以太网实战指南
你还在为物联网设备联网发愁?Wi-Fi连不上、蓝牙配对失败、以太网配置复杂?本文将用最通俗的语言+实战代码,带你1小时打通ESP32三大通信方式,从硬件接线到代码调试全覆盖,看完就能上手项目开发!
为什么选择ESP32的网络通信功能?
ESP32作为一款性价比极高的物联网微控制器(MCU),内置了Wi-Fi、蓝牙(Bluetooth)和以太网(Ethernet)通信能力,支持从家庭智能设备到工业控制的各类场景。相比传统MCU,它无需额外购买通信模块,单芯片即可实现多协议联网,大大降低硬件成本和开发难度。
官方文档详细说明了这些功能的实现原理:Wi-Fi API、蓝牙、以太网。
一、Wi-Fi通信:连接互联网的首选方案
Wi-Fi(无线保真)是ESP32最常用的通信方式,支持Station(STA,连接路由器)和Access Point(AP,自身作为热点)两种模式,满足设备联网和本地组网需求。
1.1 Station模式:连接现有Wi-Fi网络
Station模式让ESP32像手机一样连接到家里或公司的Wi-Fi路由器,从而访问互联网。核心代码仅需3步:
#include <WiFi.h>
const char* ssid = "你的Wi-Fi名称";
const char* password = "你的Wi-Fi密码";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // 连接Wi-Fi
// 等待连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Wi-Fi连接成功!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP()); // 打印获取到的IP地址
}
void loop() {
// 保持连接
}
完整示例:WiFiClient.ino
连接状态可以通过WiFi.status()函数查询,常见状态码包括:
WL_CONNECTED:连接成功WL_CONNECT_FAILED:密码错误或无法找到网络WL_DISCONNECTED:连接已断开
1.2 Access Point模式:创建自己的Wi-Fi网络
当没有现成路由器时,ESP32可以作为热点(AP)让其他设备连接,形成本地网络。例如在智能家居场景中,多个ESP32设备之间直接通信:
#include <WiFi.h>
const char* ap_ssid = "ESP32-AP"; // 热点名称
const char* ap_password = "12345678"; // 热点密码(至少8位)
void setup() {
Serial.begin(115200);
WiFi.softAP(ap_ssid, ap_password); // 创建热点
Serial.println("AP模式启动成功");
Serial.print("AP IP地址: ");
Serial.println(WiFi.softAPIP()); // 打印AP的IP地址
Serial.print("连接设备数: ");
Serial.println(WiFi.softAPgetStationNum()); // 查看已连接设备数量
}
void loop() {
delay(1000);
}
完整示例:WiFiAccessPoint.ino
AP模式支持配置信道、最大连接数等参数,通过WiFi.softAPConfig()还可以设置静态IP地址。
1.3 信号强度检测与自动重连
实际应用中,Wi-Fi信号可能不稳定。可以通过WiFi.RSSI()获取信号强度(单位dBm,值越大信号越强,通常-30~-90dBm),并结合WiFi.setAutoReconnect(true)实现自动重连:
void setup() {
// ...其他初始化代码
WiFi.setAutoReconnect(true); // 启用自动重连
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
Serial.print("信号强度: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
}
delay(1000);
}
二、蓝牙通信:近距离设备互联的利器
蓝牙(Bluetooth)是一种短距离无线通信技术,适合设备间点对点数据传输,如ESP32与手机、传感器之间的通信。ESP32支持蓝牙经典(BR/EDR)和低功耗蓝牙(BLE),这里重点介绍经典蓝牙的串口透传功能。
2.1 蓝牙串口透传:无线连接串口设备
蓝牙串口透传(SPP协议)可以将ESP32的串口数据通过蓝牙发送,也可以接收蓝牙数据并通过串口输出,相当于一根"无线串口线"。
#include "BluetoothSerial.h"
BluetoothSerial SerialBT; // 创建蓝牙串口对象
String device_name = "ESP32-BT"; // 蓝牙设备名称
void setup() {
Serial.begin(115200);
SerialBT.begin(device_name); // 初始化蓝牙
Serial.println("蓝牙串口启动成功,等待配对...");
Serial.print("设备名称: ");
Serial.println(device_name);
}
void loop() {
// 串口数据转发到蓝牙
if (Serial.available()) {
SerialBT.write(Serial.read());
}
// 蓝牙数据转发到串口
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(20);
}
完整示例:SerialToSerialBT.ino
手机端可以通过蓝牙串口助手(如"蓝牙调试宝")搜索并连接"ESP32-BT"设备,实现无线数据收发。
2.2 蓝牙设备发现与配对
ESP32也可以主动搜索附近的蓝牙设备,例如在资产追踪或设备配置场景中:
#include "BluetoothSerial.h"
#include "esp_bt_main.h"
#include "esp_bt_device.h"
BluetoothSerial SerialBT;
BTScanResults *pResults;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32-Scanner"); // 初始化蓝牙
BTScan scan;
scan.start(5); // 扫描5秒
pResults = scan.getResults(); // 获取扫描结果
Serial.print("发现设备数量: ");
Serial.println(pResults->getCount());
// 打印设备信息
for (int i = 0; i < pResults->getCount(); i++) {
BTAdvertisedDevice device = pResults->getDevice(i);
Serial.print("设备名称: ");
Serial.println(device.getName().c_str());
Serial.print("MAC地址: ");
Serial.println(device.getAddress().toString().c_str());
Serial.println("-------------------");
}
}
void loop() {}
三、以太网通信:工业级稳定连接方案
对于对稳定性要求极高的场景(如工业控制、安防设备),以太网(Ethernet)是更好的选择。ESP32需要外接以太网模块(如LAN8720、W5500),通过RMII或SPI接口通信。
3.1 LAN8720模块接线与配置
以常用的LAN8720模块为例,接线方式如下(ESP32 DevKitC):
| ESP32引脚 | LAN8720引脚 | 功能说明 |
|---|---|---|
| GPIO23 | MDC | 管理数据时钟 |
| GPIO18 | MDIO | 管理数据输入输出 |
| GPIO19 | TX0 | 发送数据0 |
| GPIO22 | TX1 | 发送数据1 |
| GPIO21 | TX-EN | 发送使能 |
| GPIO16 | RX0 | 接收数据0 |
| GPIO17 | RX1 | 接收数据1 |
| 3.3V | VCC | 电源(3.3V) |
| GND | GND | 接地 |
3.2 以太网初始化代码
#include <ETH.h>
// 定义LAN8720引脚(根据实际接线修改)
#define ETH_PHY_TYPE ETH_PHY_LAN8720
#define ETH_PHY_ADDR 0
#define ETH_PHY_MDC 23
#define ETH_PHY_MDIO 18
bool eth_connected = false;
// 以太网事件回调函数
void onEvent(arduino_event_id_t event) {
switch (event) {
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("以太网物理连接成功");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.println("以太网获取IP地址成功");
Serial.print("IP地址: ");
Serial.println(ETH.localIP());
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("以太网连接断开");
eth_connected = false;
break;
}
}
void setup() {
Serial.begin(115200);
Network.onEvent(onEvent); // 注册事件回调
ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO); // 初始化以太网
}
void loop() {
if (eth_connected) {
// 已连接,执行网络操作
}
delay(1000);
}
完整示例:ETH_LAN8720.ino
3.3 静态IP与DNS配置
默认情况下,以太网通过DHCP获取IP地址。如需设置静态IP,可以使用ETH.config()函数:
IPAddress local_IP(192, 168, 1, 100); // 设备IP
IPAddress gateway(192, 168, 1, 1); // 网关
IPAddress subnet(255, 255, 255, 0); // 子网掩码
IPAddress dns(114, 114, 114, 114); // DNS服务器
void setup() {
// ...其他初始化代码
ETH.config(local_IP, gateway, subnet, dns); // 设置静态IP
}
四、三种通信方式对比与选型建议
| 通信方式 | 传输距离 | 速率 | 功耗 | 典型应用场景 |
|---|---|---|---|---|
| Wi-Fi | 10-100米 | 150Mbps | 中高 | 互联网连接、视频流 |
| 蓝牙 | 1-10米 | 2Mbps | 中 | 设备配对、短距离控制 |
| 以太网 | 100米 | 100Mbps | 高 | 工业控制、安防设备 |
选型建议:
- 需访问互联网 → 优先Wi-Fi
- 近距离设备交互 → 选择蓝牙
- 稳定性要求高、固定安装 → 以太网
- 复杂场景可组合使用(如Wi-Fi+蓝牙双模)
五、常见问题与解决方案
Q1:Wi-Fi连接成功但无法访问互联网?
A1:检查网关和DNS配置,可通过WiFi.dnsIP()查看DNS服务器地址,尝试手动设置公共DNS(如114.114.114.114)。
Q2:蓝牙配对后无法通信?
A2:确保双方使用相同的串口波特率(通常115200),检查配对密码是否正确,可调用SerialBT.deleteAllBondedDevices()清除历史配对记录后重试。
Q3:以太网模块不工作?
A3:检查接线是否正确(尤其是MDC/MDIO引脚),确认模块供电稳定,可通过ETH.linkUp()函数检测物理连接状态。
六、进阶学习资源
- 官方网络库源码:libraries/WiFi/、libraries/BluetoothSerial/、libraries/Ethernet/
- 网络事件处理:WiFiClientEvents.ino
- 多协议组合示例:ESP32同时使用Wi-Fi和蓝牙
掌握ESP32的网络通信能力,就能轻松实现智能家居中控、远程数据采集、工业物联网等各类项目。动手实践是学习的最佳方式,现在就拿起你的开发板,开始第一个联网项目吧!
如果觉得本文对你有帮助,欢迎点赞、收藏,关注获取更多ESP32实战教程!下一期我们将介绍MQTT协议与云平台对接,敬请期待。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00
