You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32是否支持Wi-Fi Direct?能否与Android实现该通信?

ESP32 Wi-Fi Direct 相关问题解答

1. ESP32 是否支持 Wi-Fi Direct

ESP32 原生支持 Wi-Fi Direct(即 Wi-Fi P2P,对等无线连接),无论是 ESP-IDF 官方框架还是 Arduino 开发环境都可实现。Arduino 环境下可借助封装好的第三方库(如ESP32WiFiP2P),或直接调用底层 ESP-IDF 的 Wi-Fi P2P API 进行开发。

2. 当前主从模式是否属于 Wi-Fi Direct

你当前使用的代码属于AP-STA(热点-客户端)模式,并非 Wi-Fi Direct:

  • Master 端通过WiFi.softAP()创建软热点,Slave 端通过WiFi.begin()连接该热点,两者基于 WebSocket 通信。
  • Wi-Fi Direct 的核心是设备间直接建立对等连接,无需依赖任何中间热点,设备可同时作为发起者和接收者,和 AP-STA 的主从结构有本质区别。

你当前使用的代码示例如下:

Slave 代码

#include <ArduinoWebsockets.h>
#include <WiFi.h>
#include <SD.h> 
#include "SD.h"
#include "SPI.h"
#include "FS.h"

const char* ssid = "wifidirect_test";
const char* password = "12345678";

const char* websockets_server_host = "192.168.4.1";
const uint16_t websockets_server_port = 8888;

using namespace websockets;
WebsocketsClient client;

const int chipSelect = 5; 
File dataFile;

void setup() {  

  Serial.begin(115200);
  pinMode(5,INPUT);
  digitalWrite(5,HIGH);
  Serial.setDebugOutput(true);
  Serial.println();
  // Connect to wifi
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  Serial.println("Socket Connecting");

  while(!client.connect(websockets_server_host, websockets_server_port, "/")){
    delay(500);
    Serial.print(".");
  }

  Serial.println("Socket Connected!");

  // SD kartı başlat
  if(!SD.begin(5)){        
  }
  if (!SD.begin(true)) {
  //Serial.println("An Error has occurred while mounting SD");
  }
}

void loop() {
  dataFile = SD.open("/data.txt");
  if (dataFile) {
    
    String data = dataFile.readStringUntil('\n'); 
    client.sendBinary(data); 
  }

  if (!dataFile.available()) {
    
    dataFile.close();
    dataFile = SD.open("/data.txt");
  }

  delay(1000); 
}

Master 代码

#include <ArduinoWebsockets.h>
#include <WiFi.h>
#include <SD.h> 
#include "SD.h"
#include "SPI.h"
#include "FS.h"
const char* ssid = "wifidirect_test";
const char* password = "12345678";

using namespace websockets;
WebsocketsServer server;
WebsocketsClient client;


const int chipSelect = 5; 

void setup() {
  Serial.begin(115200);
  //Connect to wifi
  WiFi.softAP(ssid, password);
  server.listen(8888);
}

void loop() {
  if(server.poll()){
    client = server.accept();
    Serial.println("Bağlantı");
  }

  if(client.available()){
    client.poll();

   uint32_t messageReceivedTime = millis();
    WebsocketsMessage msg = client.readBlocking();
    Serial.println("Mesaj uzunluğu: ");
    Serial.println(msg.length());
   
    Serial.println("Mesaj: ");
    Serial.println(msg.c_str());

      uint32_t elapsedTime = millis() - messageReceivedTime; 
      Serial.print("Mesaj alındığı süre: ");
      Serial.println(elapsedTime); 
  }
}

3. ESP32 与 Android 实现 Wi-Fi Direct 通信是否可行

完全可行,实现思路如下:

ESP32 端

  • Arduino 环境下可使用ESP32WiFiP2P库,实现 Wi-Fi Direct 的设备发现、连接建立,连接成功后通过 TCP/UDP 套接字完成数据传输。
  • 核心步骤:初始化 Wi-Fi P2P、注册连接回调、发起设备扫描、接受连接请求、建立数据传输通道。

Android 端

  • 利用 Android 系统自带的WifiP2pManagerAPI,实现对等设备的扫描、连接,连接建立后通过 Socket 与 ESP32 进行数据交互。
  • 需要在AndroidManifest.xml中添加ACCESS_WIFI_STATE、CHANGE_WIFI_STATE、ACCESS_FINE_LOCATION等权限,部分设备还需开启位置服务。

内容的提问来源于stack exchange,提问作者sema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:22:03