{"id":18827,"date":"2025-04-19T01:12:15","date_gmt":"2025-04-18T17:12:15","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/18827.html"},"modified":"2025-04-19T01:12:15","modified_gmt":"2025-04-18T17:12:15","slug":"%e8%bd%bb%e9%87%8f%e7%ba%a7-web-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%85%a5%e9%97%a8%ef%bc%88%e5%9f%ba%e4%ba%8eesp-idf%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/18827.html","title":{"rendered":"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09"},"content":{"rendered":"<p>\u4e3b\u8981\u53c2\u8003\u8d44\u6599&#xff1a; \u4e50\u946b\u5b98\u65b9ESP-IDF\u6587\u6863 HTTP\u670d\u52a1\u5668: https:\/\/docs.espressif.com\/projects\/esp-idf\/zh_CN\/stable\/esp32\/api-reference\/protocols\/esp_http_server.html# NVS\u5165\u95e8&#xff08;\u57fa\u4e8eESP-IDF&#xff09;: https:\/\/blog.csdn.net\/qq_40773212\/article\/details\/135595361<\/p>\n<\/p>\n<h4>\u76ee\u5f55<\/h4>\n<ul>\n<li>\u4e00\u3001\u7b80\u4ecb<\/li>\n<li>\u4e8c\u3001HTTP Server\u53c2\u8003\u4ee3\u7801<\/li>\n<li>\u4e09\u3001\u7528\u6237\u5728Web\u7f51\u9875\u4e0a\u8f93\u5165Wi-Fi\u8d26\u53f7\u5bc6\u7801<\/li>\n<li>\n<ul>\n<li>3.1 NVS\u68c0\u67e5\u8d26\u53f7\u5bc6\u7801<\/li>\n<li>3.2 Wi-Fi\u8fde\u63a5<\/li>\n<li>3.3 \u8fd0\u884cHTTP Server<\/li>\n<li>3.4 \u8fd0\u884cDNS\u670d\u52a1\u5668<\/li>\n<li>3.5 \u5904\u7406HTTP\u8bf7\u6c42\u7684\u51fd\u6570<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u4e00\u3001\u7b80\u4ecb<\/h2>\n<p>HTTP Server \u7ec4\u4ef6\u63d0\u4f9b\u4e86\u5728 ESP32 \u4e0a\u8fd0\u884c\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u7684\u529f\u80fd\u3002<\/p>\n<h2>\u4e8c\u3001HTTP Server\u53c2\u8003\u4ee3\u7801<\/h2>\n<p><span class=\"token comment\">\/* URI \u5904\u7406\u51fd\u6570&#xff0c;\u5728\u5ba2\u6237\u7aef\u53d1\u8d77 GET \/uri \u8bf7\u6c42\u65f6\u88ab\u8c03\u7528 *\/<\/span><br \/>\nesp_err_t <span class=\"token function\">get_handler<\/span><span class=\"token punctuation\">(<\/span>httpd_req_t <span class=\"token operator\">*<\/span>req<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/* \u53d1\u9001\u56de\u7b80\u5355\u7684\u54cd\u5e94\u6570\u636e\u5305 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> resp<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;URI GET Response&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">httpd_resp_send<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> resp<span class=\"token punctuation\">,<\/span> HTTPD_RESP_USE_STRLEN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ESP_OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* URI \u5904\u7406\u51fd\u6570&#xff0c;\u5728\u5ba2\u6237\u7aef\u53d1\u8d77 POST\/uri \u8bf7\u6c42\u65f6\u88ab\u8c03\u7528 *\/<\/span><br \/>\nesp_err_t <span class=\"token function\">post_handler<\/span><span class=\"token punctuation\">(<\/span>httpd_req_t <span class=\"token operator\">*<\/span>req<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/* \u5b9a\u4e49 HTTP POST \u8bf7\u6c42\u6570\u636e\u7684\u76ee\u6807\u7f13\u5b58\u533a<br \/>\n     * httpd_req_recv() \u53ea\u63a5\u6536 char* \u6570\u636e&#xff0c;\u4f46\u4e5f\u53ef\u4ee5\u662f<br \/>\n     * \u4efb\u610f\u4e8c\u8fdb\u5236\u6570\u636e&#xff08;\u9700\u8981\u7c7b\u578b\u8f6c\u6362&#xff09;<br \/>\n     * \u5bf9\u4e8e\u5b57\u7b26\u4e32\u6570\u636e&#xff0c;null \u7ec8\u6b62\u7b26\u4f1a\u88ab\u7701\u7565&#xff0c;<br \/>\n     * content_len \u4f1a\u7ed9\u51fa\u5b57\u7b26\u4e32\u7684\u957f\u5ea6 *\/<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> content<span class=\"token punctuation\">[<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u5982\u679c\u5185\u5bb9\u957f\u5ea6\u5927\u4e8e\u7f13\u51b2\u533a\u5219\u622a\u65ad *\/<\/span><br \/>\n    size_t recv_size <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">MIN<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token operator\">-&gt;<\/span>content_len<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>content<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> ret <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">httpd_req_recv<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> content<span class=\"token punctuation\">,<\/span> recv_size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>ret <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u8fd4\u56de 0 \u8868\u793a\u8fde\u63a5\u5df2\u5173\u95ed *\/<\/span><br \/>\n        <span class=\"token comment\">\/* \u68c0\u67e5\u662f\u5426\u8d85\u65f6 *\/<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>ret <span class=\"token operator\">&#061;&#061;<\/span> HTTPD_SOCK_ERR_TIMEOUT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/* \u5982\u679c\u662f\u8d85\u65f6&#xff0c;\u53ef\u4ee5\u8c03\u7528 httpd_req_recv() \u91cd\u8bd5<br \/>\n             * \u7b80\u5355\u8d77\u89c1&#xff0c;\u8fd9\u91cc\u6211\u4eec\u76f4\u63a5<br \/>\n             * \u54cd\u5e94 HTTP 408&#xff08;\u8bf7\u6c42\u8d85\u65f6&#xff09;\u9519\u8bef\u7ed9\u5ba2\u6237\u7aef *\/<\/span><br \/>\n            <span class=\"token function\">httpd_resp_send_408<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/* \u5982\u679c\u53d1\u751f\u4e86\u9519\u8bef&#xff0c;\u8fd4\u56de ESP_FAIL \u53ef\u4ee5\u786e\u4fdd<br \/>\n         * \u5e95\u5c42\u5957\u63a5\u5b57\u88ab\u5173\u95ed *\/<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ESP_FAIL<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u53d1\u9001\u7b80\u5355\u7684\u54cd\u5e94\u6570\u636e\u5305 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> resp<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;URI POST Response&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">httpd_resp_send<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> resp<span class=\"token punctuation\">,<\/span> HTTPD_RESP_USE_STRLEN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ESP_OK<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* GET \/uri \u7684 URI \u5904\u7406\u7ed3\u6784 *\/<\/span><br \/>\nhttpd_uri_t uri_get <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>uri      <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\/uri&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>method   <span class=\"token operator\">&#061;<\/span> HTTP_GET<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>handler  <span class=\"token operator\">&#061;<\/span> get_handler<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>user_ctx <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* POST\/uri \u7684 URI \u5904\u7406\u7ed3\u6784 *\/<\/span><br \/>\nhttpd_uri_t uri_post <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>uri      <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\/uri&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>method   <span class=\"token operator\">&#061;<\/span> HTTP_POST<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>handler  <span class=\"token operator\">&#061;<\/span> post_handler<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>user_ctx <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u542f\u52a8 Web \u670d\u52a1\u5668\u7684\u51fd\u6570 *\/<\/span><br \/>\nhttpd_handle_t <span class=\"token function\">start_webserver<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/* \u751f\u6210\u9ed8\u8ba4\u7684\u914d\u7f6e\u53c2\u6570 *\/<\/span><br \/>\n    httpd_config_t config <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HTTPD_DEFAULT_CONFIG<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u7f6e\u7a7a esp_http_server \u7684\u5b9e\u4f8b\u53e5\u67c4 *\/<\/span><br \/>\n    httpd_handle_t server <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u542f\u52a8 httpd server *\/<\/span><br \/>\n    <span class=\"token comment\">\/\/\u521b\u5efa HTTP \u670d\u52a1\u5668\u7684\u5b9e\u4f8b&#xff0c;\u6839\u636e\u5177\u4f53\u7684\u914d\u7f6e\u4e3a\u5176\u5206\u914d\u5185\u5b58\u548c\u8d44\u6e90&#xff0c;\u5e76\u8fd4\u56de\u8be5\u670d\u52a1\u5668\u5b9e\u4f8b\u7684\u53e5\u67c4\u3002\u670d\u52a1\u5668\u4f7f\u7528\u4e86\u4e24\u4e2a\u5957\u63a5\u5b57&#xff0c;\u4e00\u4e2a\u7528\u6765\u76d1\u542c HTTP \u6d41\u91cf&#xff08;TCP \u7c7b\u578b&#xff09;&#xff0c;\u53e6\u4e00\u4e2a\u7528\u6765\u5904\u7406\u63a7\u5236\u4fe1\u53f7&#xff08;UDP \u7c7b\u578b&#xff09;&#xff0c;\u5b83\u4eec\u5728\u670d\u52a1\u5668\u7684\u4efb\u52a1\u5faa\u73af\u4e2d\u8f6e\u6d41\u4f7f\u7528\u3002\u901a\u8fc7\u5411 httpd_start() \u4f20\u9012 httpd_config_t \u7ed3\u6784\u4f53&#xff0c;\u53ef\u4ee5\u5728\u521b\u5efa\u670d\u52a1\u5668\u5b9e\u4f8b\u65f6\u914d\u7f6e\u4efb\u52a1\u7684\u4f18\u5148\u7ea7\u548c\u5806\u6808\u7684\u5927\u5c0f\u3002TCP \u6d41\u91cf\u88ab\u89e3\u6790\u4e3a HTTP \u8bf7\u6c42&#xff0c;\u6839\u636e\u8bf7\u6c42\u7684 URI \u6765\u8c03\u7528\u7528\u6237\u6ce8\u518c\u7684\u5904\u7406\u7a0b\u5e8f&#xff0c;\u5728\u5904\u7406\u7a0b\u5e8f\u4e2d\u9700\u8981\u53d1\u9001\u56de HTTP \u54cd\u5e94\u6570\u636e\u5305\u3002<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">httpd_start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>server<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>config<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> ESP_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/* \u6ce8\u518c URI \u5904\u7406\u7a0b\u5e8f *\/<\/span><br \/>\n        <span class=\"token comment\">\/\/\u901a\u8fc7\u4f20\u5165 httpd_uri_t \u7ed3\u6784\u4f53\u7c7b\u578b\u7684\u5bf9\u8c61\u6765\u6ce8\u518c URI \u5904\u7406\u7a0b\u5e8f\u3002\u8be5\u7ed3\u6784\u4f53\u5305\u542b\u5982\u4e0b\u6210\u5458&#xff1a;uri \u540d\u5b57&#xff0c;method \u7c7b\u578b&#xff08;\u6bd4\u5982HTTPD_GET\/HTTPD_POST\/HTTPD_PUT \u7b49\u7b49&#xff09;&#xff0c; esp_err_t *handler (httpd_req_t *req) \u7c7b\u578b\u7684\u51fd\u6570\u6307\u9488&#xff0c;\u6307\u5411\u7528\u6237\u4e0a\u4e0b\u6587\u6570\u636e\u7684 user_ctx \u6307\u9488\u3002<\/span><br \/>\n        <span class=\"token function\">httpd_register_uri_handler<\/span><span class=\"token punctuation\">(<\/span>server<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>uri_get<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">httpd_register_uri_handler<\/span><span class=\"token punctuation\">(<\/span>server<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>uri_post<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/* \u5982\u679c\u670d\u52a1\u5668\u542f\u52a8\u5931\u8d25&#xff0c;\u8fd4\u56de\u7684\u53e5\u67c4\u662f NULL *\/<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> server<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u505c\u6b62 Web \u670d\u52a1\u5668\u7684\u51fd\u6570 *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">stop_webserver<\/span><span class=\"token punctuation\">(<\/span>httpd_handle_t server<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>server<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/* \u505c\u6b62 httpd server *\/<\/span><br \/>\n        <span class=\"token function\">httpd_stop<\/span><span class=\"token punctuation\">(<\/span>server<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h2>\u4e09\u3001\u7528\u6237\u5728Web\u7f51\u9875\u4e0a\u8f93\u5165Wi-Fi\u8d26\u53f7\u5bc6\u7801<\/h2>\n<h3>3.1 NVS\u68c0\u67e5\u8d26\u53f7\u5bc6\u7801<\/h3>\n<p>  <span class=\"token comment\">\/\/ui\u663e\u793a\u64cd\u4f5c\u754c\u9762<\/span><br \/>\n  <span class=\"token function\">ui_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/\/\u67e5\u770bNVS\u6709\u65e0\u5b58\u50a8\u8d26\u53f7<\/span><br \/>\n  nvs_handle_t my_nvs_handle<span class=\"token punctuation\">;<\/span><br \/>\n  err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nvs_open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;WI-FI&#034;<\/span><span class=\"token punctuation\">,<\/span> NVS_READWRITE<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>my_nvs_handle<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">!&#061;<\/span> ESP_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Handle error\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ Handle error<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ Check if key exists<\/span><br \/>\n    err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nvs_get_str<\/span><span class=\"token punctuation\">(<\/span>my_nvs_handle<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;SSID&#034;<\/span><span class=\"token punctuation\">,<\/span> SSID_value<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>SSID_size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nvs_get_str<\/span><span class=\"token punctuation\">(<\/span>my_nvs_handle<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;PWD&#034;<\/span><span class=\"token punctuation\">,<\/span> PWD_value<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>PWD_size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">&#061;&#061;<\/span> ESP_OK<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/\u6709\u8d26\u53f7\u5bc6\u7801&#xff0c;\u5c31\u76f4\u63a5\u8fde\u63a5\u5e76\u4e14\u663e\u793a\u8fde\u63a5\u754c\u9762<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Value of &#039;SSID&#039; is: %s&#034;<\/span><span class=\"token punctuation\">,<\/span> SSID_value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Value of &#039;PWD&#039; is: %s&#034;<\/span><span class=\"token punctuation\">,<\/span> PWD_value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">lv_disp_load_scr<\/span><span class=\"token punctuation\">(<\/span>ui_WiFiconnect<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">&#061;&#061;<\/span> ESP_ERR_NVS_NOT_FOUND<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ The key does not exist<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Key does not exist in NVS.&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">lv_disp_load_scr<\/span><span class=\"token punctuation\">(<\/span>ui_WiFireset<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">webConfigWifiLoop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ Close the NVS handle when done<\/span><br \/>\n        <span class=\"token function\">nvs_close<\/span><span class=\"token punctuation\">(<\/span>my_nvs_handle<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<h3>3.2 Wi-Fi\u8fde\u63a5<\/h3>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">event_handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> arg<span class=\"token punctuation\">,<\/span> esp_event_base_t event_base<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token keyword\">int32_t<\/span> event_id<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> event_data<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>event_base <span class=\"token operator\">&#061;&#061;<\/span> WIFI_EVENT <span class=\"token operator\">&amp;&amp;<\/span> event_id <span class=\"token operator\">&#061;&#061;<\/span> WIFI_EVENT_STA_START<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">esp_wifi_connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>event_base <span class=\"token operator\">&#061;&#061;<\/span> WIFI_EVENT <span class=\"token operator\">&amp;&amp;<\/span> event_id <span class=\"token operator\">&#061;&#061;<\/span> WIFI_EVENT_STA_DISCONNECTED<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s_retry_num <span class=\"token operator\">&lt;<\/span> EXAMPLE_ESP_MAXIMUM_RETRY<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">esp_wifi_connect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            s_retry_num<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;retry to connect to the AP&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">xEventGroupSetBits<\/span><span class=\"token punctuation\">(<\/span>s_wifi_event_group<span class=\"token punctuation\">,<\/span> WIFI_FAIL_BIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;connect to the AP fail&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>event_base <span class=\"token operator\">&#061;&#061;<\/span> IP_EVENT <span class=\"token operator\">&amp;&amp;<\/span> event_id <span class=\"token operator\">&#061;&#061;<\/span> IP_EVENT_STA_GOT_IP<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        ip_event_got_ip_t<span class=\"token operator\">*<\/span> event <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>ip_event_got_ip_t<span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> event_data<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;got ip:&#034;<\/span> IPSTR<span class=\"token punctuation\">,<\/span> <span class=\"token function\">IP2STR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>event<span class=\"token operator\">-&gt;<\/span>ip_info<span class=\"token punctuation\">.<\/span>ip<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        s_retry_num <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">xEventGroupSetBits<\/span><span class=\"token punctuation\">(<\/span>s_wifi_event_group<span class=\"token punctuation\">,<\/span> WIFI_CONNECTED_BIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">wifi_init_sta<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> SSID<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> PWD<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    s_wifi_event_group <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">xEventGroupCreate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_netif_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_event_loop_create_default<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">esp_netif_create_default_wifi_sta<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    wifi_init_config_t cfg <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">WIFI_INIT_CONFIG_DEFAULT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_wifi_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>cfg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    esp_event_handler_instance_t instance_any_id<span class=\"token punctuation\">;<\/span><br \/>\n    esp_event_handler_instance_t instance_got_ip<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_event_handler_instance_register<\/span><span class=\"token punctuation\">(<\/span>WIFI_EVENT<span class=\"token punctuation\">,<\/span><br \/>\n                                                        ESP_EVENT_ANY_ID<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token operator\">&amp;<\/span>event_handler<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token operator\">&amp;<\/span>instance_any_id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_event_handler_instance_register<\/span><span class=\"token punctuation\">(<\/span>IP_EVENT<span class=\"token punctuation\">,<\/span><br \/>\n                                                        IP_EVENT_STA_GOT_IP<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token operator\">&amp;<\/span>event_handler<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token operator\">&amp;<\/span>instance_got_ip<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    wifi_config_t wifi_config <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span>sta <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ .ssid &#061; SSID,<\/span><br \/>\n            <span class=\"token comment\">\/\/ .password &#061; PWD,<\/span><br \/>\n            <span class=\"token comment\">\/* Setting a password implies station will connect to all security modes including WEP\/WPA.<br \/>\n             * However these modes are deprecated and not advisable to be used. Incase your Access point<br \/>\n             * doesn&#039;t support WPA2, these mode can be enabled by commenting below line *\/<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span>threshold<span class=\"token punctuation\">.<\/span>authmode <span class=\"token operator\">&#061;<\/span> WIFI_AUTH_OPEN<br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>wifi_config<span class=\"token punctuation\">.<\/span>sta<span class=\"token punctuation\">.<\/span>ssid<span class=\"token punctuation\">,<\/span> SSID<span class=\"token punctuation\">,<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>SSID<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u590d\u5236SSID&#xff0c;\u4e0d\u5305\u62ec &#039;\\\\0&#039;<\/span><br \/>\n    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>wifi_config<span class=\"token punctuation\">.<\/span>sta<span class=\"token punctuation\">.<\/span>password<span class=\"token punctuation\">,<\/span> PWD<span class=\"token punctuation\">,<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>PWD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u590d\u5236PWD&#xff0c;\u4e0d\u5305\u62ec &#039;\\\\0&#039;<\/span><\/p>\n<p>    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_wifi_set_mode<\/span><span class=\"token punctuation\">(<\/span>WIFI_MODE_STA<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_wifi_set_config<\/span><span class=\"token punctuation\">(<\/span>WIFI_IF_STA<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>wifi_config<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">ESP_ERROR_CHECK<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">esp_wifi_start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;wifi_init_sta finished.&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum<br \/>\n     * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) *\/<\/span><br \/>\n    EventBits_t bits <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">xEventGroupWaitBits<\/span><span class=\"token punctuation\">(<\/span>s_wifi_event_group<span class=\"token punctuation\">,<\/span><br \/>\n            WIFI_CONNECTED_BIT <span class=\"token operator\">|<\/span> WIFI_FAIL_BIT<span class=\"token punctuation\">,<\/span><br \/>\n            pdFALSE<span class=\"token punctuation\">,<\/span><br \/>\n            pdFALSE<span class=\"token punctuation\">,<\/span><br \/>\n            portMAX_DELAY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually<br \/>\n     * happened. *\/<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>bits <span class=\"token operator\">&amp;<\/span> WIFI_CONNECTED_BIT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;connected to ap SSID:%s password:%s&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 SSID<span class=\"token punctuation\">,<\/span> PWD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>bits <span class=\"token operator\">&amp;<\/span> WIFI_FAIL_BIT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Failed to connect to SSID:%s, password:%s&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 SSID<span class=\"token punctuation\">,<\/span> PWD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;UNEXPECTED EVENT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>3.3 \u8fd0\u884cHTTP Server<\/h3>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">webConfigWifiLoop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">webConfigWifiInit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* Allocate memory for server data *\/<\/span><br \/>\n    server_data <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">calloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">file_server_data<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>server_data<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r\\\\nFailed to allocate memory for server data\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    httpd_config_t config <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">HTTPD_DEFAULT_CONFIG<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>max_open_sockets <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>backlog_conn <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>lru_purge_enable <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>max_uri_handlers <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">15<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>stack_size <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">8192<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ config.server_port &#061; 89;<\/span><br \/>\n    config<span class=\"token punctuation\">.<\/span>uri_match_fn <span class=\"token operator\">&#061;<\/span> httpd_uri_match_wildcard<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Starting Web server on port: %d\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> config<span class=\"token punctuation\">.<\/span>server_port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">httpd_start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>webConfigWifi_httpd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>config<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> ESP_OK<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">static<\/span> httpd_uri_t root <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>uri <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\/&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>method <span class=\"token operator\">&#061;<\/span> HTTP_GET<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>handler <span class=\"token operator\">&#061;<\/span> main_page_handler<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>user_ctx  <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        root<span class=\"token punctuation\">.<\/span>user_ctx <span class=\"token operator\">&#061;<\/span> server_data<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">httpd_register_uri_handler<\/span><span class=\"token punctuation\">(<\/span>webConfigWifi_httpd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>root<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">static<\/span> httpd_uri_t wifi_data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>uri       <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\/wifi_data&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>method    <span class=\"token operator\">&#061;<\/span> HTTP_POST<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>handler   <span class=\"token operator\">&#061;<\/span> wifi_config_handler<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span>user_ctx  <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        wifi_data<span class=\"token punctuation\">.<\/span>user_ctx <span class=\"token operator\">&#061;<\/span> server_data<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">httpd_register_uri_handler<\/span><span class=\"token punctuation\">(<\/span>webConfigWifi_httpd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>wifi_data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token function\">httpd_register_err_handler<\/span><span class=\"token punctuation\">(<\/span>webConfigWifi_httpd<span class=\"token punctuation\">,<\/span> HTTPD_404_NOT_FOUND<span class=\"token punctuation\">,<\/span> http_404_error_handler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">start_dns_server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">vTaskDelay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1000<\/span> <span class=\"token operator\">\/<\/span> portTICK_PERIOD_MS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>3.4 \u8fd0\u884cDNS\u670d\u52a1\u5668<\/h3>\n<p>\u5728\u8fd9\u90e8\u5206&#xff0c;DNS\u670d\u52a1\u5668\u88ab\u8bbe\u7f6e\u4e3a\u76d1\u542cDNS\u67e5\u8be2&#xff0c;\u5e76\u9488\u5bf9\u6240\u6709\u7c7b\u578bA&#xff08;A\u8bb0\u5f55&#xff0c;\u7528\u4e8eIPv4\u5730\u5740\u89e3\u6790&#xff09;\u7684\u67e5\u8be2\u56de\u590d\u8f6fAP&#xff08;Soft Access Point&#xff09;\u7684IP\u5730\u5740\u3002<\/p>\n<p><span class=\"token comment\">\/*<br \/>\n    Sets up a socket and listen for DNS queries,<br \/>\n    replies to all type A queries with the IP of the softAP<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">dns_server_task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>pvParameters<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> rx_buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> addr_str<span class=\"token punctuation\">[<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> addr_family<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> ip_protocol<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>        <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> dest_addr<span class=\"token punctuation\">;<\/span><br \/>\n        dest_addr<span class=\"token punctuation\">.<\/span>sin_addr<span class=\"token punctuation\">.<\/span>s_addr <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">htonl<\/span><span class=\"token punctuation\">(<\/span>INADDR_ANY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        dest_addr<span class=\"token punctuation\">.<\/span>sin_family <span class=\"token operator\">&#061;<\/span> AF_INET<span class=\"token punctuation\">;<\/span><br \/>\n        dest_addr<span class=\"token punctuation\">.<\/span>sin_port <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">htons<\/span><span class=\"token punctuation\">(<\/span>DNS_PORT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        addr_family <span class=\"token operator\">&#061;<\/span> AF_INET<span class=\"token punctuation\">;<\/span><br \/>\n        ip_protocol <span class=\"token operator\">&#061;<\/span> IPPROTO_IP<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">inet_ntoa_r<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">.<\/span>sin_addr<span class=\"token punctuation\">,<\/span> addr_str<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>addr_str<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">int<\/span> sock <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>addr_family<span class=\"token punctuation\">,<\/span> SOCK_DGRAM<span class=\"token punctuation\">,<\/span> ip_protocol<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>sock <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Unable to create socket: errno %d&#034;<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Socket created&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">int<\/span> err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>sock<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Socket unable to bind: errno %d&#034;<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Socket bound, port %d&#034;<\/span><span class=\"token punctuation\">,<\/span> DNS_PORT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Waiting for data&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in6<\/span> source_addr<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ Large enough for both IPv4 or IPv6<\/span><br \/>\n            socklen_t socklen <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>source_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">int<\/span> len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">recvfrom<\/span><span class=\"token punctuation\">(<\/span>sock<span class=\"token punctuation\">,<\/span> rx_buffer<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>rx_buffer<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>source_addr<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>socklen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ Error occurred during receiving<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>len <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;recvfrom failed: errno %d&#034;<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ Data received<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ Get the sender&#039;s ip address as string<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>source_addr<span class=\"token punctuation\">.<\/span>sin6_family <span class=\"token operator\">&#061;&#061;<\/span> PF_INET<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">inet_ntoa_r<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_in<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>source_addr<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>sin_addr<span class=\"token punctuation\">.<\/span>s_addr<span class=\"token punctuation\">,<\/span> addr_str<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>addr_str<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>source_addr<span class=\"token punctuation\">.<\/span>sin6_family <span class=\"token operator\">&#061;&#061;<\/span> PF_INET6<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">inet6_ntoa_r<\/span><span class=\"token punctuation\">(<\/span>source_addr<span class=\"token punctuation\">.<\/span>sin6_addr<span class=\"token punctuation\">,<\/span> addr_str<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>addr_str<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ Null-terminate whatever we received and treat like a string&#8230;<\/span><br \/>\n                rx_buffer<span class=\"token punctuation\">[<\/span>len<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">char<\/span> reply<span class=\"token punctuation\">[<\/span>DNS_MAX_LEN<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">int<\/span> reply_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">parse_dns_request<\/span><span class=\"token punctuation\">(<\/span>rx_buffer<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">,<\/span> reply<span class=\"token punctuation\">,<\/span> DNS_MAX_LEN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token function\">ESP_LOGI<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Received %d bytes from %s | DNS reply with len: %d&#034;<\/span><span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">,<\/span> addr_str<span class=\"token punctuation\">,<\/span> reply_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>reply_len <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Failed to prepare a DNS reply&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">int<\/span> err <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">sendto<\/span><span class=\"token punctuation\">(<\/span>sock<span class=\"token punctuation\">,<\/span> reply<span class=\"token punctuation\">,<\/span> reply_len<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>source_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>source_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Error occurred during sending: errno %d&#034;<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                        <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>sock <span class=\"token operator\">!&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ESP_LOGE<\/span><span class=\"token punctuation\">(<\/span>TAG<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Shutting down socket&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">shutdown<\/span><span class=\"token punctuation\">(<\/span>sock<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">vTaskDelete<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">start_dns_server<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">xTaskCreate<\/span><span class=\"token punctuation\">(<\/span>dns_server_task<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;dns_server&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4096<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>3.5 \u5904\u7406HTTP\u8bf7\u6c42\u7684\u51fd\u6570<\/h3>\n<p>\u51fd\u6570\u7684\u4e3b\u8981\u4efb\u52a1\u662f\u53d1\u9001\u4e00\u4e2a\u9884\u538b\u7f29\u7684HTML\u6587\u4ef6&#xff08;webConfig.html&#xff09;\u7ed9\u5ba2\u6237\u7aef\u3002<\/p>\n<p><span class=\"token comment\">\/\/\u914d\u7f6e \u9875\u9762<\/span><br \/>\n<span class=\"token keyword\">static<\/span> esp_err_t <span class=\"token function\">main_page_handler<\/span><span class=\"token punctuation\">(<\/span>httpd_req_t <span class=\"token operator\">*<\/span>req<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u8bbe\u7f6eHTTP\u54cd\u5e94\u5934&#xff0c;\u5141\u8bb8\u8de8\u57df\u8bf7\u6c42\u3002\u8fd9\u91cc\u7684&#034;*&#034;\u8868\u793a\u5141\u8bb8\u6240\u6709\u57df\u8fdb\u884c\u8de8\u57df\u8bf7\u6c42\u3002<\/span><br \/>\n    <span class=\"token function\">httpd_resp_set_hdr<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Access-Control-Allow-Origin&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;*&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u58f0\u660e\u5916\u90e8\u53d8\u91cfhtml_gz_start\u548chtml_gz_end&#xff0c;\u5b83\u4eec\u6307\u5411\u538b\u7f29\u540e\u7684HTML\u6587\u4ef6\u7684\u5f00\u59cb\u4f4d\u7f6e\u548c\u7ed3\u675f\u4f4d\u7f6e\u3002<\/span><br \/>\n    <span class=\"token keyword\">extern<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">char<\/span> html_gz_start<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">asm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_binary_webConfig_html_gz_start&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">extern<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">char<\/span> html_gz_end<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">asm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;_binary_webConfig_html_gz_end&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/\u8ba1\u7b97\u538b\u7f29\u540e\u7684HTML\u6587\u4ef6\u7684\u957f\u5ea6\u3002<\/span><br \/>\n    size_t html_gz_len <span class=\"token operator\">&#061;<\/span> html_gz_end <span class=\"token operator\">&#8211;<\/span> html_gz_start<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u8bbe\u7f6eHTTP\u54cd\u5e94\u7684\u5185\u5bb9\u7c7b\u578b\u4e3atext\/html\u3002<\/span><br \/>\n    <span class=\"token function\">httpd_resp_set_type<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;text\/html&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/\u8bbe\u7f6eHTTP\u54cd\u5e94\u5934&#xff0c;\u544a\u8bc9\u5ba2\u6237\u7aef\u5185\u5bb9\u662f\u4f7f\u7528GZIP\u538b\u7f29\u7684\u3002<\/span><br \/>\n    <span class=\"token function\">httpd_resp_set_hdr<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Content-Encoding&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;gzip&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/\u8fd9\u884c\u4ee3\u7801\u88ab\u6ce8\u91ca\u6389\u4e86&#xff0c;\u5982\u679c\u53d6\u6d88\u6ce8\u91ca&#xff0c;\u5b83\u5c06\u8bbe\u7f6e\u54cd\u5e94\u5934\u4ee5\u652f\u6301GZIP\u548cDEFLATE\u538b\u7f29\u3002<\/span><br \/>\n    <span class=\"token comment\">\/\/ httpd_resp_set_hdr(req, &#034;Content-Encoding&#034;, &#034;gzip,deflate&#034;);<\/span><\/p>\n<p><span class=\"token comment\">\/\/\u53d1\u9001\u538b\u7f29\u540e\u7684HTML\u6587\u4ef6\u5185\u5bb9\u4f5c\u4e3aHTTP\u54cd\u5e94\u3002<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">httpd_resp_send<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>html_gz_start<span class=\"token punctuation\">,<\/span> html_gz_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1.1k\u6b21\uff0c\u70b9\u8d5e5\u6b21\uff0c\u6536\u85cf6\u6b21\u3002HTTP Server \u7ec4\u4ef6\u63d0\u4f9b\u4e86\u5728 ESP32 \u4e0a\u8fd0\u884c\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u7684\u529f\u80fd\u3002_esp-idf web<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[151,1437,43,78],"topic":[],"class_list":["post-18827","post","type-post","status-publish","format-standard","hentry","category-server","tag-http","tag-1437","tag-43","tag-78"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/18827.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1.1k\u6b21\uff0c\u70b9\u8d5e5\u6b21\uff0c\u6536\u85cf6\u6b21\u3002HTTP Server \u7ec4\u4ef6\u63d0\u4f9b\u4e86\u5728 ESP32 \u4e0a\u8fd0\u884c\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u7684\u529f\u80fd\u3002_esp-idf web\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/18827.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-18T17:12:15+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/18827.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/18827.html\",\"name\":\"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-04-18T17:12:15+00:00\",\"dateModified\":\"2025-04-18T17:12:15+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/18827.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/18827.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/18827.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/18827.html","og_locale":"zh_CN","og_type":"article","og_title":"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb1.1k\u6b21\uff0c\u70b9\u8d5e5\u6b21\uff0c\u6536\u85cf6\u6b21\u3002HTTP Server \u7ec4\u4ef6\u63d0\u4f9b\u4e86\u5728 ESP32 \u4e0a\u8fd0\u884c\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u7684\u529f\u80fd\u3002_esp-idf web","og_url":"https:\/\/www.wsisp.com\/helps\/18827.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-04-18T17:12:15+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"8 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/18827.html","url":"https:\/\/www.wsisp.com\/helps\/18827.html","name":"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-04-18T17:12:15+00:00","dateModified":"2025-04-18T17:12:15+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/18827.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/18827.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/18827.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u8f7b\u91cf\u7ea7 Web \u670d\u52a1\u5668\u5165\u95e8\uff08\u57fa\u4e8eESP-IDF\uff09"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/18827","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=18827"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/18827\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=18827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=18827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=18827"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=18827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}