Arduino-ESP32网络通信大全:WiFi、蓝牙、以太网实战指南
概述
Arduino-ESP32作为物联网开发的核心平台,提供了丰富的网络通信能力。本文将深入解析ESP32的三大网络通信技术:WiFi、蓝牙(Bluetooth)和以太网(Ethernet),通过实战代码示例和详细的技术解析,帮助开发者快速掌握ESP32的网络编程技巧。
1. WiFi通信技术
1.1 WiFi基础配置
ESP32支持STA(Station)和AP(Access Point)两种工作模式,可以灵活应对不同的网络场景。
#include <WiFi.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
void setup() {
Serial.begin(115200);
// STA模式连接WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 主循环代码
}
1.2 AP模式设置
#include <WiFi.h>
void setup() {
Serial.begin(115200);
// 创建AP热点
WiFi.softAP("ESP32-AP", "password123");
Serial.print("AP IP address: ");
Serial.println(WiFi.softAPIP());
}
void loop() {
delay(1000);
}
1.3 WiFi扫描与网络发现
#include <WiFi.h>
void setup() {
Serial.begin(115200);
// 设置WiFi为STA模式
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Scanning WiFi networks...");
// 扫描网络
int n = WiFi.scanNetworks();
if (n == 0) {
Serial.println("No networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(" dBm) ");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "Open" : "Encrypted");
delay(10);
}
}
}
void loop() {
delay(5000);
// 每5秒重新扫描
WiFi.scanNetworks(true);
}
2. 蓝牙通信技术
2.1 蓝牙串口通信
ESP32支持经典蓝牙(Bluetooth Classic)和低功耗蓝牙(Bluetooth Low Energy)。
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32_BT_Device"); // 蓝牙设备名称
Serial.println("Bluetooth device is ready to pair");
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(20);
}
2.2 蓝牙设备发现与连接
#include "BluetoothSerial.h"
#include "BTScan.h"
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32_Scanner");
Serial.println("Starting Bluetooth device discovery...");
// 发现蓝牙设备
BTScanResults *pResults = SerialBT.discover(5000);
if (pResults != nullptr) {
int count = pResults->getCount();
Serial.print("Found ");
Serial.print(count);
Serial.println(" devices");
for (int i = 0; i < count; i++) {
BTAdvertisedDevice device = pResults->getDevice(i);
Serial.print("Device ");
Serial.print(i);
Serial.print(": ");
Serial.print(device.getName().c_str());
Serial.print(" - ");
Serial.println(device.getAddress().toString().c_str());
}
}
}
void loop() {
delay(10000);
}
3. 以太网通信技术
3.1 以太网基础配置
ESP32支持多种以太网PHY芯片,包括LAN8720、TLK110、W5500等。
#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
#define ETH_PHY_POWER -1
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
ETH.setHostname("esp32-ethernet");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.print("ETH MAC: ");
Serial.print(ETH.macAddress());
Serial.print(", IPv4: ");
Serial.print(ETH.localIP());
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
break;
default:
break;
}
}
void setup() {
Serial.begin(115200);
WiFi.onEvent(WiFiEvent);
ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
}
void loop() {
delay(1000);
}
3.2 W5500 SPI以太网配置
#include <ETH.h>
#include <SPI.h>
// W5500 SPI配置
#define ETH_PHY_TYPE ETH_PHY_W5500
#define ETH_PHY_ADDR 1
#define ETH_PHY_CS 5
#define ETH_PHY_IRQ 4
#define ETH_PHY_RST 2
#define ETH_PHY_SPI_HOST SPI2_HOST
#define ETH_PHY_SPI_SCK 18
#define ETH_PHY_SPI_MISO 19
#define ETH_PHY_SPI_MOSI 23
void setup() {
Serial.begin(115200);
ETH.begin(
ETH_PHY_TYPE,
ETH_PHY_ADDR,
ETH_PHY_CS,
ETH_PHY_IRQ,
ETH_PHY_RST,
ETH_PHY_SPI_HOST,
ETH_PHY_SPI_SCK,
ETH_PHY_SPI_MISO,
ETH_PHY_SPI_MOSI
);
}
void loop() {
if (ETH.linkUp()) {
Serial.print("Ethernet connected - IP: ");
Serial.println(ETH.localIP());
} else {
Serial.println("Ethernet disconnected");
}
delay(5000);
}
4. 网络协议应用
4.1 HTTP客户端示例
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
HTTPClient http;
http.begin("http://httpbin.org/get");
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
} else {
Serial.println("Error on HTTP request");
}
http.end();
}
void loop() {
delay(10000);
}
4.2 Web服务器示例
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
WebServer server(80);
void handleRoot() {
server.send(200, "text/html", "<h1>ESP32 Web Server</h1><p>Hello from ESP32!</p>");
}
void handleLED() {
String message = "LED is now ";
if (server.hasArg("state")) {
if (server.arg("state") == "on") {
digitalWrite(LED_BUILTIN, HIGH);
message += "ON";
} else if (server.arg("state") == "off") {
digitalWrite(LED_BUILTIN, LOW);
message += "OFF";
}
}
server.send(200, "text/plain", message);
}
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.print("Server started at: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/led", handleLED);
server.begin();
}
void loop() {
server.handleClient();
}
4.3 MQTT客户端示例
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
client.subscribe("esp32/output");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 发布消息
client.publish("esp32/temperature", "25.6");
delay(5000);
}
5. 网络性能优化
5.1 功耗管理
#include <WiFi.h>
void setup() {
Serial.begin(115200);
// 设置WiFi功耗模式
WiFi.setSleep(true); // 启用睡眠模式
WiFi.setTxPower(WIFI_POWER_19_5dBm); // 设置发射功率
// 连接WiFi
WiFi.begin("SSID", "PASSWORD");
}
void loop() {
// 在不需要网络时断开连接
if (millis() % 60000 < 10000) {
// 每60秒中只有10秒保持连接
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin("SSID", "PASSWORD");
}
} else {
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
delay(100);
WiFi.mode(WIFI_STA);
}
delay(1000);
}
5.2 网络事件处理
#include <WiFi.h>
void WiFiEvent(WiFiEvent_t event) {
switch(event) {
case ARDUINO_EVENT_WIFI_READY:
Serial.println("WiFi interface ready");
break;
case ARDUINO_EVENT_WIFI_SCAN_DONE:
Serial.println("Completed scan for access points");
break;
case ARDUINO_EVENT_WIFI_STA_START:
Serial.println("WiFi client started");
break;
case ARDUINO_EVENT_WIFI_STA_STOP:
Serial.println("WiFi clients stopped");
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.println("Connected to access point");
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Serial.println("Disconnected from WiFi access point");
break;
case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE:
Serial.println("Authentication mode of access point has changed");
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("Obtained IP address: ");
Serial.println(WiFi.localIP());
break;
case ARDUINO_EVENT_WIFI_STA_LOST_IP:
Serial.println("Lost IP address and IP address is reset to 0");
break;
default: break;
}
}
void setup() {
Serial.begin(115200);
// 删除旧的配置
WiFi.disconnect(true);
// 注册事件处理程序
WiFi.onEvent(WiFiEvent);
// 移除保存的WiFi凭证
WiFi.persistent(false);
// 设置模式并开始连接
WiFi.mode(WIFI_STA);
WiFi.begin("SSID", "PASSWORD");
}
void loop() {
delay(1000);
}
6. 安全配置
6.1 WiFi安全连接
#include <WiFi.h>
#include <WiFiClientSecure.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// 根证书(示例)
const char* rootCACertificate = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n" \
"ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UECgwGQW1hem9uMRkwFwYDVQQDDBBBbWF6\n" \
"b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n" \
"MAkGA1UEBhMCVVMxDzANBgNVBAoMBkFtYXpvbjEZMBcGA1UEAwwQQW1hem9uIFJv\n" \
"b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n" \
"ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n" \
"9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n" \
"IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n" \
"VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n" \
"93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n" \
"jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n" \
"AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3cEBCwUAA\n" \
"4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU\n" \
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



