{"id":2707,"date":"2024-10-24T20:10:31","date_gmt":"2024-10-24T12:10:31","guid":{"rendered":"https:\/\/saludpcb.com\/zh\/?p=2707"},"modified":"2026-01-03T09:35:45","modified_gmt":"2026-01-03T01:35:45","slug":"learn-c-with-esp32-wifi-scan","status":"publish","type":"post","link":"https:\/\/saludpcb.com\/zh\/learn-c-with-esp32-wifi-scan\/","title":{"rendered":"\u8f15\u9b06\u5b78\u7fd2 C++ \u8207 ESP32\uff1aWIFI Scan"},"content":{"rendered":"\n<hr class=\"wp-block-separator alignwide has-text-color has-palette-color-1-color has-alpha-channel-opacity has-palette-color-1-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7c21\u4ecb\">\u7c21\u4ecb<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u5728\u9019\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u5011\u5c07\u4f7f\u7528 C++ \u8207 ESP-IDF \u4f86\u5be6\u73fe ESP32 \u7684 WIFI Scan \u529f\u80fd\u3002\u900f\u904e\u9762\u5411\u7269\u4ef6\u7684\u7a0b\u5f0f\u8a2d\u8a08\u65b9\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u8b93\u7a0b\u5f0f\u78bc\u66f4\u52a0\u6a21\u7d44\u5316\u3001\u53ef\u91cd\u7528\u4e14\u7d50\u69cb\u6e05\u6670\u3002\u6700\u5f8c\uff0c\u4f60\u5c07\u5b78\u6703\u5982\u4f55\u5c07 C++ \u985e\u5225\u8207 ESP32 \u958b\u767c\u7d50\u5408\uff0c\u4e26\u4e14\u80fd\u4f7f\u7528 ESP32 \u6a21\u7d44\u4f86\u6383\u63cf\u9644\u8fd1\u7684 WiFi \u7db2\u8def\u3002<\/pre>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>\u5167\u5bb9<\/h2><nav><ul><li class=\"\"><a href=\"#\u7c21\u4ecb\">\u7c21\u4ecb<\/a><\/li><li class=\"\"><a href=\"#\u901a\u9053\u6578\u91cf\">\u958b\u767c\u74b0\u5883\u8a2d\u7f6e<\/a><\/li><li class=\"\"><a href=\"#\u89e3\u6790\u5ea6\">\u5275\u5efa\u4e00\u500b\u65b0\u9805\u76ee<\/a><\/li><li class=\"\"><a href=\"#\u8f38\u5165\u7bc4\u570d\">\u6a94\u6848\u7d50\u69cb<\/a><\/li><li class=\"\"><a href=\"#\u66f4\u63db\u5176\u5b83-esp-idf-\u7248\u672c-1\">\u7de8\u5beb C++ \u7684 WIFI Scan \u7684\u985e\u5225<\/a><\/li><li class=\"\"><a href=\"#\u66f4\u63db\u5176\u5b83-esp-idf-\u7248\u672c\">\u7a0b\u5f0f\u78bc\u8aaa\u660e<\/a><\/li><li class=\"\"><a href=\"#\u7d50\u8ad6-1\">\u7de8\u8b6f\u8207\u71d2\u9304<\/a><\/li><li class=\"\"><a href=\"#\u7d50\u8ad6-1-1\">\u7a0b\u5f0f\u904b\u884c\u6548\u679c<\/a><\/li><li class=\"\"><a href=\"#\u7d50\u8ad6-1-1-1\">\u7d50\u8ad6<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u901a\u9053\u6578\u91cf\">\u958b\u767c\u74b0\u5883\u8a2d\u7f6e<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">1. \u5b89\u88dd <a href=\"https:\/\/code.visualstudio.com\" target=\"_blank\" rel=\"noopener\">Visual Studio Code<\/a>\uff0c\u53ef\u5f9e\u5b98\u65b9\u7db2\u7ad9\u4e0b\u8f09\u4e26\u4e14\u5b89\u88dd\u3002\n2. \u5b89\u88dd <a href=\"https:\/\/saludpcb.com\/zh\/esp32-tutorial-esp-idf-with-vscode\/\">ESP-IDF \u63d2\u4ef6<\/a>\u3002<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u89e3\u6790\u5ea6\">\u5275\u5efa\u4e00\u500b\u65b0\u9805\u76ee<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">1. \u5728 VS Code \u4e2d\uff0c\u6309\u4e0b Ctrl (Cmd) + Shift + P\uff0c\u7136\u5f8c\u8f38\u5165 ESP-IDF: New Project\u3002<br><br>2. \u9078\u64c7\u4e00\u500b\u6a23\u677f\u5c08\u6848\uff08\u5982 blink example\uff09\uff0c\u8a2d\u5b9a\u5c08\u6848\u540d\u7a31\uff08\u4f8b\u5982 WIFI_Scan\uff09\uff0c\u4e26\u9078\u64c7\u5b58\u5132\u8def\u5f91\u3002<br><br>3. \u6b64\u6642\uff0c\u7cfb\u7d71\u6703\u81ea\u52d5\u70ba\u60a8\u751f\u6210\u4e00\u500b\u65b0\u7684 ESP-IDF \u9805\u76ee\uff0c\u5176\u4e2d\u5305\u542b\u57fa\u672c\u7684 CMake \u6587\u4ef6\u548c\u4e00\u500b\u7bc4\u4f8b\u7a0b\u5f0f\u78bc\u3002<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u8f38\u5165\u7bc4\u570d\">\u6a94\u6848\u7d50\u69cb<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">my_project\/<br>\u251c\u2500\u2500 CMakeLists.txt<br>\u251c\u2500\u2500 main\/<br>\u2502   \u251c\u2500\u2500 CMakeLists.txt<br>\u2502   \u2514\u2500\u2500 main.cpp<br>\u2514\u2500\u2500 ...<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u66f4\u63db\u5176\u5b83-esp-idf-\u7248\u672c-1\">\u7de8\u5beb C++ \u7684 WIFI Scan \u7684\u985e\u5225<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u6211\u5011\u5c07\u5275\u5efa\u4e00\u500b\u540d\u70ba WiFiScanner \u7684 C++ \u985e\u5225\uff0c\u7528\u65bc\u8655\u7406 WiFi \u7684\u521d\u59cb\u5316\u548c\u6383\u63cf\u64cd\u4f5c\u3002\u6b64\u985e\u5225\u6703\u4f7f\u7528 ESP32 \u7684 WiFi \u9a45\u52d5\u4f86\u555f\u52d5\u6383\u63cf\u4e26\u53d6\u5f97\u53ef\u7528\u7684 WiFi \u7db2\u8def\u6e05\u55ae\uff0c\u4e26\u900f\u904e ESP-IDF \u7684\u65e5\u8a8c\u7cfb\u7d71\uff08ESP_LOG\uff09\u5c07\u6383\u63cf\u7d50\u679c\u5217\u5370\u81f3\u7d42\u7aef\u6a5f\u3002<\/pre>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-link-color wp-elements-25434c2fcfd3a0767444d49d9556e79b\"><code lang=\"cpp\" class=\"language-cpp\">#include \"freertos\/FreeRTOS.h\"\n#include \"freertos\/task.h\"\n#include \"esp_wifi.h\"\n#include \"esp_event.h\"\n#include \"nvs_flash.h\"\n#include \"esp_log.h\"\n\nstatic const char* TAG = \"WiFiScanner\";  \/\/ Define log tag\n\nclass WiFiScanner {\npublic:\n    \/\/ Constructor: Initializes WiFi\n    WiFiScanner() {\n        init_wifi();\n    }\n\n    \/\/ Starts WiFi scanning\n    void scan() {\n        wifi_scan_config_t scan_config = {\n            .ssid = nullptr,   \/\/ No specific SSID filter\n            .bssid = nullptr,  \/\/ No specific BSSID filter\n            .channel = 0,      \/\/ Scan all channels\n            .show_hidden = true \/\/ Show hidden networks\n        };\n\n        \/\/ Start WiFi scan\n        esp_err_t err = esp_wifi_scan_start(&amp;scan_config, true);\n        if (err != ESP_OK) {\n            ESP_LOGE(TAG, \"Failed to start WiFi scan: %s\", esp_err_to_name(err));\n            return;\n        }\n\n        \/\/ Get the number of networks found\n        uint16_t num_networks = 0;\n        esp_wifi_scan_get_ap_num(&amp;num_networks);\n\n        \/\/ Store scan results in an array\n        wifi_ap_record_t ap_records[num_networks];\n        esp_wifi_scan_get_ap_records(&amp;num_networks, ap_records);\n\n        \/\/ Log the scan results\n        ESP_LOGI(TAG, \"Found %d WiFi networks:\", num_networks);\n        for (int i = 0; i &lt; num_networks; ++i) {\n            ESP_LOGI(TAG, \"SSID: %s, Signal strength (RSSI): %d, Auth mode: %d\", \n                     ap_records[i].ssid, ap_records[i].rssi, ap_records[i].authmode);\n        }\n    }\n\nprivate:\n    \/\/ Initializes WiFi\n    void init_wifi() {\n        wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\n        esp_err_t ret = esp_wifi_init(&amp;cfg);\n        if (ret != ESP_OK) {\n            ESP_LOGE(TAG, \"Failed to initialize WiFi: %s\", esp_err_to_name(ret));\n            return;\n        }\n\n        \/\/ Set WiFi to station (STA) mode\n        esp_wifi_set_mode(WIFI_MODE_STA);\n\n        \/\/ Start WiFi\n        esp_wifi_start();\n    }\n};\n\n\/\/ Main function, entry point of the program\nextern \"C\" void app_main() {\n    \/\/ Initialize NVS (Non-Volatile Storage)\n    esp_err_t ret = nvs_flash_init();\n    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {\n        ESP_ERROR_CHECK(nvs_flash_erase());\n        ret = nvs_flash_init();\n    }\n    ESP_ERROR_CHECK(ret);\n\n    \/\/ Initialize event loop\n    tcpip_adapter_init();\n    ESP_ERROR_CHECK(esp_event_loop_create_default());\n\n    \/\/ Create a WiFiScanner object and start scanning\n    WiFiScanner scanner;\n    scanner.scan();\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2368\" height=\"1682\" src=\"https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2024\/10\/Learn-C-with-ESP32-WIFI-Scan-1.jpg\" alt=\"Learn C++ with ESP32 WIFI Scan\" class=\"wp-image-2717\" title=\"\" srcset=\"https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2024\/10\/Learn-C-with-ESP32-WIFI-Scan-1.jpg 2368w, https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2024\/10\/Learn-C-with-ESP32-WIFI-Scan-1-768x546.jpg 768w, https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2024\/10\/Learn-C-with-ESP32-WIFI-Scan-1-1536x1091.jpg 1536w, https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2024\/10\/Learn-C-with-ESP32-WIFI-Scan-1-2048x1455.jpg 2048w\" sizes=\"auto, (max-width: 2368px) 100vw, 2368px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u66f4\u63db\u5176\u5b83-esp-idf-\u7248\u672c\">\u7a0b\u5f0f\u78bc\u8aaa\u660e<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">1. WiFiScanner \u985e\u5225\uff1a<br>\u7528\u9014\uff1a\u5c01\u88dd WiFi \u529f\u80fd\uff0c\u5c07 WiFi \u6383\u63cf\u4efb\u52d9\u6a21\u7d44\u5316\u3002<br>\u5efa\u69cb\u51fd\u6578\uff1aWiFiScanner() \u547c\u53eb\u79c1\u6709\u65b9\u6cd5 init_wifi() \u4f86\u521d\u59cb\u5316 WiFi \u6a21\u7d44\u3002<br>scan() \u65b9\u6cd5\uff1a\u8a72\u516c\u6709\u65b9\u6cd5\u57f7\u884c WiFi \u6383\u63cf\uff0c\u914d\u7f6e\u6383\u63cf\u53c3\u6578\u3001\u555f\u52d5\u6383\u63cf\u3001\u53d6\u5f97\u7d50\u679c\u4e26\u900f\u904e\u65e5\u8a8c\u7cfb\u7d71\u5217\u5370 WiFi \u7db2\u8def\u8cc7\u8a0a\u3002<br>init_wifi() \u65b9\u6cd5\uff1a\u79c1\u6709\u65b9\u6cd5\uff0c\u7528\u65bc\u521d\u59cb\u5316 WiFi \u4e26\u8a2d\u7f6e\u70ba WIFI_MODE_STA \u6a21\u5f0f\u3002<br><br>2. app_main()\uff1a<br>NVS \u521d\u59cb\u5316\uff1a\u521d\u59cb\u5316 NVS\uff08\u975e\u6613\u5931\u6027\u5132\u5b58\uff09\uff0c\u78ba\u4fdd WiFi \u6b63\u5e38\u904b\u4f5c\u3002\u5982\u679c NVS \u640d\u6bc0\u6216\u672a\u683c\u5f0f\u5316\uff0c\u5247\u6703\u5148\u62b9\u9664\u518d\u91cd\u65b0\u521d\u59cb\u5316\u3002<br>\u4e8b\u4ef6\u8ff4\u5708\uff1aesp_event_loop_create_default() \u7528\u65bc\u521d\u59cb\u5316 ESP-IDF \u7684\u4e8b\u4ef6\u8ff4\u5708\uff0c\u8655\u7406\u7cfb\u7d71\u548c WiFi \u76f8\u95dc\u4e8b\u4ef6\u3002<br>WiFiScanner \u7269\u4ef6\uff1aapp_main() \u4e2d\u5275\u5efa WiFiScanner \u985e\u5225\u7684\u5be6\u4f8b\uff0c\u4e26\u547c\u53eb\u5176 scan() \u65b9\u6cd5\u555f\u52d5 WiFi \u6383\u63cf\u3002<br><br>3. ESP-IDF \u7684\u65e5\u8a8c\u7cfb\u7d71\uff08ESP_LOG\uff09\uff1a<br>ESP_LOGI(TAG, ...)\uff1a\u5217\u5370\u8cc7\u8a0a\u7d1a\u5225\u7684\u65e5\u8a8c\uff0c\u4f8b\u5982\u767c\u73fe\u7684 WiFi \u7db2\u8def\u6578\u91cf\u53ca\u5176\u8a73\u7d30\u8cc7\u8a0a\u3002<br>ESP_LOGE(TAG, ...)\uff1a\u5217\u5370\u932f\u8aa4\u7d1a\u5225\u7684\u65e5\u8a8c\uff0c\u4f8b\u5982 WiFi \u6383\u63cf\u5931\u6557\u6642\u7684\u932f\u8aa4\u8cc7\u8a0a\u3002<br>\u6b64\u65e5\u8a8c\u7cfb\u7d71\u662f\u70ba\u5d4c\u5165\u5f0f\u7cfb\u7d71\u8a2d\u8a08\u7684\uff0c\u80fd\u5920\u63d0\u4f9b\u9748\u6d3b\u7684\u65e5\u8a8c\u7d1a\u5225\u8abf\u6574\uff0c\u6709\u52a9\u65bc\u9664\u932f\u548c\u7cfb\u7d71\u8ffd\u8e64\u3002<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7d50\u8ad6-1\">\u7de8\u8b6f\u8207\u71d2\u9304<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u5728 VSCode \u8996\u7a97\u6700\u4e0b\u65b9\u4e2d\u627e\u5230 \"ESP32-IDF : Build, Flash and Monitor\" ICON \u57f7\u884c\u548c\u71d2\u9304\u3002<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7d50\u8ad6-1-1\">\u7a0b\u5f0f\u904b\u884c\u6548\u679c<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u904b\u884c\u7a0b\u5f0f\u5f8c\uff0c\u60a8\u5c07\u5728\u7d42\u7aef\u6a5f\u4e2d\u770b\u5230\u4ee5\u4e0b\u8f38\u51fa\uff1a<\/pre>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-link-color wp-elements-847d4ee8cf1cded2a7071631d935438d\"><code lang=\"bash\" class=\"language-bash\">I (1234) WiFiScanner: Found 3 WiFi networks:\nI (1235) WiFiScanner: SSID: MyHomeWiFi, Signal strength (RSSI): -45, Auth mode: 3\nI (1236) WiFiScanner: SSID: CoffeeShopWiFi, Signal strength (RSSI): -70, Auth mode: 0\nI (1237) WiFiScanner: SSID: NeighborsWiFi, Signal strength (RSSI): -80, Auth mode: 3<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7d50\u8ad6-1-1-1\">\u7d50\u8ad6<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u6211\u5011\u5b78\u7fd2\u4e86\u5982\u4f55\u4f7f\u7528 C++ \u548c ESP-IDF \u7de8\u5beb ESP32 \u7684 WiFi \u6383\u63cf\u529f\u80fd\u3002\u900f\u904e\u5c07 WiFi \u529f\u80fd\u5c01\u88dd\u5230 WiFiScanner \u985e\u5225\u4e2d\uff0c\u4f7f\u5f97\u7a0b\u5f0f\u78bc\u66f4\u52a0\u6a21\u7d44\u5316\u3001\u6613\u65bc\u7dad\u8b77\u3002\u6211\u5011\u5229\u7528 ESP-IDF \u7684\u65e5\u8a8c\u7cfb\u7d71\uff0c\u5c07\u6383\u63cf\u7d50\u679c\u6e05\u6670\u5730\u6253\u5370\u5230\u7d42\u7aef\uff0c\u9019\u5c0d\u5d4c\u5165\u5f0f\u958b\u767c\u975e\u5e38\u6709\u5e6b\u52a9\u3002<br><br>\u7d50\u5408 C++ \u548c ESP-IDF \u7684\u65b9\u5f0f\uff0c\u8b93\u6211\u5011\u80fd\u5920\u7de8\u5beb\u51fa\u66f4\u4e7e\u6de8\u4e14\u6613\u65bc\u7dad\u8b77\u7684\u7a0b\u5f0f\u78bc\uff0c\u540c\u6642\u5145\u5206\u767c\u63ee ESP32 \u5f37\u5927\u7684\u5fae\u63a7\u5236\u5668\u529f\u80fd\u3002\u73fe\u5728\uff0c\u4f60\u53ef\u4ee5\u5617\u8a66\u9032\u4e00\u6b65\u64f4\u5c55\u8a72\u5c08\u6848\uff0c\u6dfb\u52a0\u66f4\u591a\u529f\u80fd\uff0c\u4e26\u7e7c\u7e8c\u63a2\u7d22 ESP32 \u958b\u767c\u4e2d\u7684\u7db2\u8def\u7a0b\u5f0f\u8a2d\u8a08\u6280\u5de7\u3002<\/pre>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:0px\"><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center has-medium-font-size is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator alignwide has-text-color has-palette-color-1-color has-alpha-channel-opacity has-palette-color-1-background-color has-background is-style-wide\"\/>\n","protected":false},"excerpt":{"rendered":"<p>\u7c21\u4ecb \u5728\u9019\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u5011\u5c07\u4f7f\u7528 C++ \u8207 ESP-IDF \u4f86\u5be6\u73fe ESP32 \u7684 WIFI Scan \u529f\u80fd\u3002 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2723,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,53,83],"tags":[61,27,63,20,60,10,64,11,62],"class_list":["post-2707","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-module","category-esp32","category-featured","tag-bluetooth","tag-c","tag-firmware","tag-hardware","tag-iot","tag-mcu","tag-module","tag-tutorial","tag-wifi"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts\/2707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/comments?post=2707"}],"version-history":[{"count":12,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts\/2707\/revisions"}],"predecessor-version":[{"id":4163,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts\/2707\/revisions\/4163"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/media\/2723"}],"wp:attachment":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/media?parent=2707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/categories?post=2707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/tags?post=2707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}