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
相关产品推荐
相关产品推荐

