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

ESP32是否支持WiFi Direct?如何实现与Android设备的WiFi Direct数据传输?

ESP32 与 Android 通过类WiFi Direct方式传输数据的实现方案

ESP-IDF官方目前没有提供对WiFi Direct(P2P)的完整原生支持,但可以通过两种可靠方式实现ESP32与Android设备的直连数据传输:

方案一:SoftAP + TCP/UDP(推荐,稳定易实现)

通过将ESP32配置为SoftAP模式,让Android直接连接该热点,再通过TCP或UDP协议完成数据交互,效果接近WiFi Direct的直连体验。

ESP32 端实现代码示例

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"

#define AP_SSID "ESP32_Direct_Link"
#define AP_PASSWORD "87654321"
#define TCP_PORT 8080

static const char *TAG = "AP_TCP_SERVER";

// 初始化SoftAP
void init_softap() {
    esp_netif_create_default_wifi_ap();
    wifi_init_config_t wifi_init_cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_cfg));

    wifi_config_t ap_config = {
        .ap = {
            .ssid = AP_SSID,
            .ssid_len = strlen(AP_SSID),
            .password = AP_PASSWORD,
            .max_connection = 1,
            .authmode = WIFI_AUTH_WPA_WPA2_PSK
        }
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &ap_config));
    ESP_ERROR_CHECK(esp_wifi_start());
    ESP_LOGI(TAG, "SoftAP启动完成:SSID=%s,密码=%s", AP_SSID, AP_PASSWORD);
}

// TCP服务器任务
void tcp_server_task(void *arg) {
    int server_sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_addr = {
        .sin_family = AF_INET,
        .sin_addr.s_addr = htonl(INADDR_ANY),
        .sin_port = htons(TCP_PORT)
    };

    bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
    listen(server_sock, 1);
    ESP_LOGI(TAG, "TCP服务器监听端口:%d", TCP_PORT);

    struct sockaddr_in client_addr;
    socklen_t client_len = sizeof(client_addr);
    int client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_len);
    ESP_LOGI(TAG, "客户端已连接:%s", inet_ntoa(client_addr.sin_addr));

    char recv_buf[1024];
    while (1) {
        int recv_len = recv(client_sock, recv_buf, sizeof(recv_buf), 0);
        if (recv_len > 0) {
            recv_buf[recv_len] = '\0';
            ESP_LOGI(TAG, "收到数据:%s", recv_buf);
            // 向Android发送响应数据
            send(client_sock, "ESP32已接收数据", strlen("ESP32已接收数据"), 0);
        } else {
            break;
        }
    }

    close(client_sock);
    close(server_sock);
    vTaskDelete(NULL);
}

void app_main() {
    esp_netif_init();
    esp_event_loop_create_default();
    init_softap();
    xTaskCreate(tcp_server_task, "tcp_server", 4096, NULL, 5, NULL);
}

Android 端实现示例(核心逻辑)

// 连接ESP32的SoftAP
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
WifiConfiguration apConfig = new WifiConfiguration();
apConfig.SSID = "\"ESP32_Direct_Link\"";
apConfig.preSharedKey = "\"87654321\"";
int networkId = wifiManager.addNetwork(apConfig);
wifiManager.enableNetwork(networkId, true);

// 建立TCP连接并传输数据
new Thread(() -> {
    try {
        // ESP32 SoftAP默认网关为192.168.4.1
        Socket tcpSocket = new Socket("192.168.4.1", 8080);
        
        // 发送数据到ESP32
        OutputStream outputStream = tcpSocket.getOutputStream();
        String sendData = "Android发送的测试数据";
        outputStream.write(sendData.getBytes());
        outputStream.flush();
        
        // 接收ESP32的响应
        InputStream inputStream = tcpSocket.getInputStream();
        byte[] recvBuffer = new byte[1024];
        int recvLen = inputStream.read(recvBuffer);
        String response = new String(recvBuffer, 0, recvLen);
        Log.d("Android_TCP", "收到ESP32响应:" + response);
        
        tcpSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

方案二:非官方WiFi Direct(P2P)实现

部分社区开发者基于ESP-IDF的底层esp_wifi接口实现了WiFi Direct功能,但这部分没有官方文档支持,API可能随ESP-IDF版本变更而失效,仅适合实验场景。核心思路是调用未公开的esp_wifi_p2p_init()、esp_wifi_p2p_start()等函数,你可以在ESP32社区论坛找到相关非官方代码片段,但需要自行适配和测试兼容性。

总结

如果无需严格遵循WiFi Direct标准,**方案一(SoftAP+TCP/UDP)**是最稳定、易维护的选择;若必须使用标准WiFi Direct,可尝试社区非官方实现,但需做好版本兼容工作。

内容的提问来源于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:53:32