Arduino-ESP32网络通信大全:WiFi、蓝牙、以太网实战指南

Arduino-ESP32网络通信大全:WiFi、蓝牙、以太网实战指南

【免费下载链接】arduino-esp32 Arduino core for the ESP32 【免费下载链接】arduino-esp32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32

概述

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" \

【免费下载链接】arduino-esp32 Arduino core for the ESP32 【免费下载链接】arduino-esp32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值