首页
/ 3种通信方式全掌握:ESP32-WiFi/蓝牙/以太网实战指南

3种通信方式全掌握:ESP32-WiFi/蓝牙/以太网实战指南

2026-02-04 05:24:40作者:卓炯娓

你还在为物联网设备联网发愁?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);
}

Wi-Fi工作模式

二、蓝牙通信:近距离设备互联的利器

蓝牙(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() {}

完整示例:bt_classic_device_discovery.ino

三、以太网通信:工业级稳定连接方案

对于对稳定性要求极高的场景(如工业控制、安防设备),以太网(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()函数检测物理连接状态。

六、进阶学习资源

掌握ESP32的网络通信能力,就能轻松实现智能家居中控、远程数据采集、工业物联网等各类项目。动手实践是学习的最佳方式,现在就拿起你的开发板,开始第一个联网项目吧!

如果觉得本文对你有帮助,欢迎点赞、收藏,关注获取更多ESP32实战教程!下一期我们将介绍MQTT协议与云平台对接,敬请期待。

登录后查看全文
热门项目推荐
相关项目推荐