ESP32-IDF http请求崩溃问题分析与解决

news/2024/9/19 4:57:25/ 标签: http, 网络协议, esp32, esp32-idf, c, 乐鑫, 开发板
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">class="tags" href="/HTTP.html" title=http>http://www.w3.org/2000/svg" style="display: none;">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • class="tags" href="/ESP32.html" title=esp32>esp32s3 class="tags" href="/HTTP.html" title=http>http请求崩溃
  • 问题代码讨论
  • 修正后不崩溃的代码
  • class="tags" href="/ESP32.html" title=esp32>esp32相关文章

ESP32S3板子, 一运行class="tags" href="/HTTP.html" title=http>http请求百度网站的例子, 就会panic死机, 记录下出现及解决过程.

class="tags" href="/ESP32.html" title=esp32>esp32s3_class="tags" href="/HTTP.html" title=http>http_4">class="tags" href="/ESP32.html" title=esp32>esp32s3 class="tags" href="/HTTP.html" title=http>http请求崩溃

一执行class="tags" href="/HTTP.html" title=http>http请求的perform就会崩溃,
打印如图
c="class="tags" href="/HTTP.html" title=http>https://i-blog.csdnimg.cn/direct/ba40d1f12e4c441e8e61b90058c1de5f.jpeg#pic_center" alt="在这里插入图片描述" />
ESP32-IDF 的class="tags" href="/HTTP.html" title=http>http请求代码是根据官方demo来改的,
第一步先连接wifi,
连接上后执行class="tags" href="/HTTP.html" title=http>http get请求百度网站.
理论上写法是没问题的,但是运行到板子上发现很容易崩溃.

问题代码讨论

会在可能有问题的地方注释,有4个问题点,具体看代码 ,
最主要问题是运行内存有限, 容易发生栈或堆溢出或越界导致崩溃.

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><pthread.h>class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><string.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdlib.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"freertos/FreeRTOS.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"freertos/task.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_err.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_log.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_system.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"nvs_flash.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_event.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_netif.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_wifi.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_tls.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_crt_bundle.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_class="tags" href="/HTTP.html" title=http>http_client.h"class="token keyword">static class="token keyword">const class="token keyword">char class="token operator">*TAG class="token operator">= class="token string">"HTTP_REQUEST"class="token punctuation">;class="token comment">// 这里的buffer要适当, 如果改太大了, 比如10240就可能导致死机, 要根据实际运行结果做调整
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">MAX_HTTP_OUTPUT_BUFFER class="token expression">class="token number">2048
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">HTTP_URL class="token string">"class="tags" href="/HTTP.html" title=http>http://www.baidu.com"class="token comment">// HTTP 请求的处理函数
class="token class-name">esp_err_t class="token function">class="tags" href="/HTTP.html" title=http>http_event_handlerclass="token punctuation">(class="token class-name">esp_class="tags" href="/HTTP.html" title=http>http_client_event_t class="token operator">*evtclass="token punctuation">)
class="token punctuation">{class="token comment">// 缓存class="tags" href="/HTTP.html" title=http>http响应的bufferclass="token keyword">static class="token keyword">char class="token operator">*output_bufferclass="token punctuation">;class="token comment">// 已经读取的字节数class="token keyword">static class="token keyword">int output_lenclass="token punctuation">;class="token keyword">switchclass="token punctuation">(evtclass="token operator">->event_idclass="token punctuation">) class="token punctuation">{class="token keyword">case HTTP_EVENT_ERRORclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ERROR"class="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_CONNECTEDclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_CONNECTED"class="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_HEADER_SENTclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_HEADER_SENT"class="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_HEADERclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_HEADER, key=%s, value=%s"class="token punctuation">, evtclass="token operator">->header_keyclass="token punctuation">, evtclass="token operator">->header_valueclass="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_DATAclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_DATA, len=%d"class="token punctuation">, evtclass="token operator">->data_lenclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(class="token operator">!class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_is_chunked_responseclass="token punctuation">(evtclass="token operator">->clientclass="token punctuation">)class="token punctuation">) class="token punctuation">{class="token keyword">if class="token punctuation">(evtclass="token operator">->user_dataclass="token punctuation">) class="token punctuation">{class="token comment">// 问题1: 这里没有做防溢出限制, 当class="tags" href="/HTTP.html" title=http>http返回的数据长度趤过预留的buffer大小MAX_HTTP_OUTPUT_BUFFER时就会溢出崩溃class="token function">memcpyclass="token punctuation">(evtclass="token operator">->user_data class="token operator">+ output_lenclass="token punctuation">, evtclass="token operator">->dataclass="token punctuation">, evtclass="token operator">->data_lenclass="token punctuation">)class="token punctuation">;class="token punctuation">} class="token keyword">else class="token punctuation">{class="token keyword">if class="token punctuation">(output_buffer class="token operator">== class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token comment">// 问题2: 这里直接用malloc申请class="tags" href="/HTTP.html" title=http>http返回的数据长度的堆空间, 实测在class="tags" href="/ESP32.html" title=esp32>esp32s3板子上跑会崩溃output_buffer class="token operator">= class="token punctuation">(class="token keyword">char class="token operator">*class="token punctuation">) class="token function">mallocclass="token punctuation">(class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_get_content_lengthclass="token punctuation">(evtclass="token operator">->clientclass="token punctuation">)class="token punctuation">)class="token punctuation">;output_len class="token operator">= class="token number">0class="token punctuation">;class="token keyword">if class="token punctuation">(output_buffer class="token operator">== class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token function">ESP_LOGEclass="token punctuation">(TAGclass="token punctuation">, class="token string">"Failed to allocate memory for output buffer"class="token punctuation">)class="token punctuation">;class="token keyword">return ESP_FAILclass="token punctuation">;class="token punctuation">}class="token punctuation">}class="token function">memcpyclass="token punctuation">(output_buffer class="token operator">+ output_lenclass="token punctuation">, evtclass="token operator">->dataclass="token punctuation">, evtclass="token operator">->data_lenclass="token punctuation">)class="token punctuation">;class="token punctuation">}output_len class="token operator">+= evtclass="token operator">->data_lenclass="token punctuation">;class="token punctuation">}class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_FINISHclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_FINISH"class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(output_buffer class="token operator">!= class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token comment">// Response is accumulated in output_buffer. Uncomment the below line to print the accumulated responseclass="token comment">// ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len);class="token function">freeclass="token punctuation">(output_bufferclass="token punctuation">)class="token punctuation">;output_buffer class="token operator">= class="token constant">NULLclass="token punctuation">;class="token punctuation">}output_len class="token operator">= class="token number">0class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_DISCONNECTEDclass="token operator">:class="token function">ESP_LOGIclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_DISCONNECTED"class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(output_buffer class="token operator">!= class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token function">freeclass="token punctuation">(output_bufferclass="token punctuation">)class="token punctuation">;output_buffer class="token operator">= class="token constant">NULLclass="token punctuation">;class="token punctuation">}output_len class="token operator">= class="token number">0class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token punctuation">}class="token keyword">return ESP_OKclass="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">requestclass="token punctuation">(class="token keyword">const class="token keyword">char class="token operator">*urlclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"request  -----------1\n"class="token punctuation">)class="token punctuation">;class="token comment">// 响应结果放在这里class="token keyword">char local_response_bufferclass="token punctuation">[MAX_HTTP_OUTPUT_BUFFERclass="token punctuation">] class="token operator">= class="token punctuation">{class="token number">0class="token punctuation">}class="token punctuation">;class="token comment">// 创建一个 HTTP 客户端配置class="token class-name">esp_class="tags" href="/HTTP.html" title=http>http_client_config_t config class="token operator">= class="token punctuation">{class="token punctuation">.method class="token operator">= HTTP_METHOD_GETclass="token punctuation">,class="token punctuation">.url class="token operator">= urlclass="token punctuation">,class="token punctuation">.event_handler class="token operator">= class="tags" href="/HTTP.html" title=http>http_event_handlerclass="token punctuation">,class="token punctuation">.user_data class="token operator">= local_response_bufferclass="token punctuation">,class="token punctuation">.disable_auto_redirect class="token operator">= trueclass="token punctuation">,class="token punctuation">}class="token punctuation">;class="token comment">// 创建一个 HTTP 客户端并执行 GET 请求class="token class-name">esp_class="tags" href="/HTTP.html" title=http>http_client_handle_t client class="token operator">= class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_initclass="token punctuation">(class="token operator">&configclass="token punctuation">)class="token punctuation">;class="token function">printfclass="token punctuation">(class="token string">"request  -----------2\n"class="token punctuation">)class="token punctuation">;class="token class-name">esp_err_t err class="token operator">= class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_performclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">; class="token comment">// 请求百度网页时,一执行这行系统就会崩溃class="token function">printfclass="token punctuation">(class="token string">"request  -----------3\n"class="token punctuation">)class="token punctuation">;class="token comment">// 检查请求是否成功class="token keyword">if class="token punctuation">(err class="token operator">== ESP_OKclass="token punctuation">) class="token punctuation">{class="token keyword">int len class="token operator">=  class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_get_content_lengthclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">;class="token function">ESP_LOGIclass="token punctuation">(TAGclass="token punctuation">, class="token string">"Status = %d, content_length = %d"class="token punctuation">,class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_get_status_codeclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">,class="token comment">//状态码lenclass="token punctuation">)class="token punctuation">;class="token comment">//数据长度class="token punctuation">} class="token keyword">else class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"HTTP GET request failed: %s\n"class="token punctuation">, class="token function">esp_err_to_nameclass="token punctuation">(errclass="token punctuation">)class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token function">printfclass="token punctuation">(class="token string">"Response: %.*s\n"class="token punctuation">, class="token function">strlenclass="token punctuation">(local_response_bufferclass="token punctuation">)class="token punctuation">, local_response_bufferclass="token punctuation">)class="token punctuation">;class="token comment">//断开并释放资源class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_cleanupclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">;class="token function">printfclass="token punctuation">(class="token string">"request  -----------4\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">class="tags" href="/HTTP.html" title=http>http_test_taskclass="token punctuation">(class="token keyword">void class="token operator">*argclass="token punctuation">)
class="token punctuation">{class="token function">sleepclass="token punctuation">(class="token number">15class="token punctuation">)class="token punctuation">;class="token function">requestclass="token punctuation">(HTTP_URLclass="token punctuation">)class="token punctuation">;class="token function">vTaskDeleteclass="token punctuation">(class="token constant">NULLclass="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token comment">/*** @brief WiFi 的事件循环Handler* @param arg* @param event_base* @param event_id* @param event_data*/
class="token keyword">void class="token function">wifi_event_handlerclass="token punctuation">(class="token keyword">void class="token operator">*argclass="token punctuation">, class="token class-name">esp_event_base_t event_baseclass="token punctuation">, class="token class-name">int32_t event_idclass="token punctuation">, class="token keyword">void class="token operator">*event_dataclass="token punctuation">)
class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"wifi_event_handler base:%s, id:%d\n"class="token punctuation">, event_baseclass="token punctuation">, event_idclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(event_base class="token operator">== WIFI_EVENT class="token operator">&& event_id class="token operator">== WIFI_EVENT_STA_STARTclass="token punctuation">)class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"esp_wifi_connect\n"class="token punctuation">)class="token punctuation">;class="token function">esp_wifi_connectclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">else class="token keyword">if class="token punctuation">(event_base class="token operator">== WIFI_EVENT class="token operator">&& event_id class="token operator">== WIFI_EVENT_STA_DISCONNECTEDclass="token punctuation">)class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"esp_wifi_connect\n"class="token punctuation">)class="token punctuation">;class="token function">esp_wifi_connectclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">if class="token punctuation">(event_base class="token operator">== IP_EVENT class="token operator">&& event_id class="token operator">== IP_EVENT_STA_GOT_IPclass="token punctuation">)class="token punctuation">{class="token class-name">ip_event_got_ip_t class="token operator">*event class="token operator">= class="token punctuation">(class="token class-name">ip_event_got_ip_t class="token operator">*class="token punctuation">)event_dataclass="token punctuation">;class="token function">ESP_LOGIclass="token punctuation">(class="token string">"ESP32"class="token punctuation">, class="token string">"IP地址:: " IPSTRclass="token punctuation">, class="token function">IP2STRclass="token punctuation">(class="token operator">&eventclass="token operator">->ip_infoclass="token punctuation">.ipclass="token punctuation">)class="token punctuation">)class="token punctuation">;class="token comment">//request(HTTP_URL); 问题点3: 获取到ip地址后,不要直接在这里执行class="tags" href="/HTTP.html" title=http>http请求, 否则会直接崩溃class="token punctuation">}
class="token punctuation">}class="token keyword">void class="token function">app_mainclass="token punctuation">(class="token keyword">voidclass="token punctuation">)
class="token punctuation">{class="token class-name">esp_err_t ret class="token operator">= class="token function">nvs_flash_initclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 初始化默认NVS分区class="token keyword">if class="token punctuation">(ret class="token operator">== ESP_ERR_NVS_NO_FREE_PAGES class="token operator">|| ret class="token operator">== ESP_ERR_NVS_NEW_VERSION_FOUNDclass="token punctuation">)class="token punctuation">{class="token function">ESP_ERROR_CHECKclass="token punctuation">(class="token function">nvs_flash_eraseclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 擦除默认NVS分区ret class="token operator">= class="token function">nvs_flash_initclass="token punctuation">(class="token punctuation">)class="token punctuation">;             class="token comment">// 初始化默认NVS分区class="token punctuation">}class="token function">ESP_ERROR_CHECKclass="token punctuation">(retclass="token punctuation">)class="token punctuation">;class="token function">ESP_ERROR_CHECKclass="token punctuation">(class="token function">esp_netif_initclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">;                class="token comment">// 初始化底层TCP/IP堆栈class="token function">ESP_ERROR_CHECKclass="token punctuation">(class="token function">esp_event_loop_create_defaultclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 创建默认事件循环class="token function">esp_netif_create_default_wifi_staclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 创建默认的WIFI STA。class="token class-name">wifi_init_config_t cfg class="token operator">= class="token function">WIFI_INIT_CONFIG_DEFAULTclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token function">esp_wifi_initclass="token punctuation">(class="token operator">&cfgclass="token punctuation">)class="token punctuation">; class="token comment">// 初始化WiFi为WiFi驱动程序class="token class-name">wifi_sta_config_t cfg_sta class="token operator">= class="token punctuation">{class="token punctuation">.ssid class="token operator">= class="token string">"black"class="token punctuation">,class="token punctuation">.password class="token operator">= class="token string">"black1234"class="token punctuation">,class="token punctuation">.thresholdclass="token punctuation">.authmode class="token operator">= WIFI_AUTH_WPA2_PSKclass="token punctuation">,   class="token comment">//加密方式class="token punctuation">.pmf_cfg class="token operator">= class="token punctuation">{class="token punctuation">.capable class="token operator">= trueclass="token punctuation">,class="token punctuation">.required class="token operator">= falseclass="token punctuation">}class="token punctuation">,class="token punctuation">}class="token punctuation">;class="token function">esp_wifi_set_configclass="token punctuation">(WIFI_IF_STAclass="token punctuation">, class="token punctuation">(class="token class-name">wifi_config_t class="token operator">*class="token punctuation">)class="token operator">&cfg_staclass="token punctuation">)class="token punctuation">; class="token comment">// 设置ESP32 STA或AP的配置class="token function">esp_wifi_set_modeclass="token punctuation">(WIFI_MODE_STAclass="token punctuation">)class="token punctuation">; class="token comment">// 设置WiFi操作模式class="token comment">// 将事件处理程序的实例注册到默认循环中           任何事件class="token function">esp_event_handler_instance_registerclass="token punctuation">(WIFI_EVENTclass="token punctuation">, ESP_EVENT_ANY_IDclass="token punctuation">, wifi_event_handlerclass="token punctuation">, class="token constant">NULLclass="token punctuation">, class="token constant">NULLclass="token punctuation">)class="token punctuation">;class="token comment">// 将事件处理程序的实例注册到默认循环中            工作站从连接的AP获得IP事件class="token function">esp_event_handler_instance_registerclass="token punctuation">(IP_EVENTclass="token punctuation">, IP_EVENT_STA_GOT_IPclass="token punctuation">, wifi_event_handlerclass="token punctuation">, class="token constant">NULLclass="token punctuation">, class="token constant">NULLclass="token punctuation">)class="token punctuation">;class="token function">esp_wifi_startclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 根据当前配置启动wificlass="token function">xTaskCreateclass="token punctuation">(class="token operator">&class="tags" href="/HTTP.html" title=http>http_test_taskclass="token punctuation">, class="token string">"class="tags" href="/HTTP.html" title=http>http_test_task"class="token punctuation">, class="token number">8192class="token punctuation">, class="token constant">NULLclass="token punctuation">, class="token number">5class="token punctuation">, class="token constant">NULLclass="token punctuation">)class="token punctuation">; class="token comment">//问题点4: 这里参数需要设置足够大的栈大小, 否则会导致崩溃
class="token punctuation">}
code>

修正后不崩溃的代码

百度网页返回的class="tags" href="/HTTP.html" title=http>http结果太多了,会导致空间不够,
针对问题代码, 做出调整, 对栈空间大小做限制, 当class="tags" href="/HTTP.html" title=http>http返回内容过长时,直接丢弃

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><pthread.h>class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><string.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdlib.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"freertos/FreeRTOS.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"freertos/task.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_err.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_log.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_system.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"nvs_flash.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_event.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_netif.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_wifi.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_tls.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_crt_bundle.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"esp_class="tags" href="/HTTP.html" title=http>http_client.h"class="token keyword">static class="token keyword">const class="token keyword">char class="token operator">*TAG class="token operator">= class="token string">"HTTP_REQUEST"class="token punctuation">;
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">MAX_HTTP_OUTPUT_BUFFER class="token expression">class="token number">2048
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">HTTP_URL class="token string">"class="tags" href="/HTTP.html" title=http>http://www.baidu.com"class="token comment">// HTTP 请求的处理函数
class="token class-name">esp_err_t class="token function">class="tags" href="/HTTP.html" title=http>http_event_handlerclass="token punctuation">(class="token class-name">esp_class="tags" href="/HTTP.html" title=http>http_client_event_t class="token operator">*evtclass="token punctuation">)
class="token punctuation">{class="token comment">// 缓存class="tags" href="/HTTP.html" title=http>http响应的bufferclass="token keyword">static class="token keyword">char class="token operator">*output_bufferclass="token punctuation">;class="token comment">// 已经读取的字节数class="token keyword">static class="token keyword">int output_lenclass="token punctuation">;class="token keyword">switchclass="token punctuation">(evtclass="token operator">->event_idclass="token punctuation">) class="token punctuation">{class="token keyword">case HTTP_EVENT_ERRORclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ERROR"class="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_CONNECTEDclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_CONNECTED"class="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_HEADER_SENTclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_HEADER_SENT"class="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_HEADERclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_HEADER, key=%s, value=%s"class="token punctuation">, evtclass="token operator">->header_keyclass="token punctuation">, evtclass="token operator">->header_valueclass="token punctuation">)class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_DATAclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_DATA, len=%d"class="token punctuation">, evtclass="token operator">->data_lenclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(class="token operator">!class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_is_chunked_responseclass="token punctuation">(evtclass="token operator">->clientclass="token punctuation">)class="token punctuation">) class="token punctuation">{class="token keyword">if class="token punctuation">(evtclass="token operator">->user_dataclass="token punctuation">) class="token punctuation">{class="token comment">// 这里对buffer长度进行判断, 如果class="tags" href="/HTTP.html" title=http>http返回长度过长, 为防止溢出就丢弃,否则进行追加拷贝class="token keyword">int left class="token operator">= MAX_HTTP_OUTPUT_BUFFER class="token operator">- output_len class="token operator">-class="token number">1class="token punctuation">;class="token keyword">if class="token punctuation">(left class="token operator">> evtclass="token operator">->data_lenclass="token punctuation">)class="token function">memcpyclass="token punctuation">(evtclass="token operator">->user_data class="token operator">+ output_lenclass="token punctuation">, evtclass="token operator">->dataclass="token punctuation">, evtclass="token operator">->data_lenclass="token punctuation">)class="token punctuation">;class="token keyword">else class="token keyword">if class="token punctuation">(left class="token operator">> class="token number">0class="token punctuation">)class="token function">memcpyclass="token punctuation">(evtclass="token operator">->user_data class="token operator">+ output_lenclass="token punctuation">, evtclass="token operator">->dataclass="token punctuation">, leftclass="token punctuation">)class="token punctuation">;class="token keyword">elseclass="token function">ESP_LOGIclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_DATA, buffer full"class="token punctuation">)class="token punctuation">;class="token punctuation">} class="token keyword">else class="token punctuation">{class="token comment">// 如果实测user_data设置为空时,走这里申请堆内存会崩溃则可以注释掉这段,否则可以使用class="token keyword">if class="token punctuation">(output_buffer class="token operator">== class="token constant">NULLclass="token punctuation">) class="token punctuation">{output_buffer class="token operator">= class="token punctuation">(class="token keyword">char class="token operator">*class="token punctuation">) class="token function">mallocclass="token punctuation">(class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_get_content_lengthclass="token punctuation">(evtclass="token operator">->clientclass="token punctuation">)class="token punctuation">)class="token punctuation">;output_len class="token operator">= class="token number">0class="token punctuation">;class="token keyword">if class="token punctuation">(output_buffer class="token operator">== class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token function">ESP_LOGEclass="token punctuation">(TAGclass="token punctuation">, class="token string">"Failed to allocate memory for output buffer"class="token punctuation">)class="token punctuation">;class="token keyword">return ESP_FAILclass="token punctuation">;class="token punctuation">}class="token punctuation">}class="token function">memcpyclass="token punctuation">(output_buffer class="token operator">+ output_lenclass="token punctuation">, evtclass="token operator">->dataclass="token punctuation">, evtclass="token operator">->data_lenclass="token punctuation">)class="token punctuation">;class="token punctuation">}output_len class="token operator">+= evtclass="token operator">->data_lenclass="token punctuation">;class="token punctuation">}class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_ON_FINISHclass="token operator">:class="token function">ESP_LOGDclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_ON_FINISH"class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(output_buffer class="token operator">!= class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token comment">// Response is accumulated in output_buffer. Uncomment the below line to print the accumulated responseclass="token comment">// ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len);class="token function">freeclass="token punctuation">(output_bufferclass="token punctuation">)class="token punctuation">;output_buffer class="token operator">= class="token constant">NULLclass="token punctuation">;class="token punctuation">}output_len class="token operator">= class="token number">0class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token keyword">case HTTP_EVENT_DISCONNECTEDclass="token operator">:class="token function">ESP_LOGIclass="token punctuation">(TAGclass="token punctuation">, class="token string">"HTTP_EVENT_DISCONNECTED"class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(output_buffer class="token operator">!= class="token constant">NULLclass="token punctuation">) class="token punctuation">{class="token function">freeclass="token punctuation">(output_bufferclass="token punctuation">)class="token punctuation">;output_buffer class="token operator">= class="token constant">NULLclass="token punctuation">;class="token punctuation">}output_len class="token operator">= class="token number">0class="token punctuation">;class="token keyword">breakclass="token punctuation">;class="token punctuation">}class="token keyword">return ESP_OKclass="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">requestclass="token punctuation">(class="token keyword">const class="token keyword">char class="token operator">*urlclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"request  -----------1\n"class="token punctuation">)class="token punctuation">;class="token comment">// 响应结果放在这里class="token keyword">char local_response_bufferclass="token punctuation">[MAX_HTTP_OUTPUT_BUFFERclass="token punctuation">] class="token operator">= class="token punctuation">{class="token number">0class="token punctuation">}class="token punctuation">;class="token comment">// 创建一个 HTTP 客户端配置class="token class-name">esp_class="tags" href="/HTTP.html" title=http>http_client_config_t config class="token operator">= class="token punctuation">{class="token punctuation">.method class="token operator">= HTTP_METHOD_GETclass="token punctuation">,class="token punctuation">.url class="token operator">= urlclass="token punctuation">,class="token punctuation">.event_handler class="token operator">= class="tags" href="/HTTP.html" title=http>http_event_handlerclass="token punctuation">,class="token punctuation">.user_data class="token operator">= local_response_bufferclass="token punctuation">,class="token punctuation">.disable_auto_redirect class="token operator">= trueclass="token punctuation">,class="token punctuation">}class="token punctuation">;class="token comment">// 创建一个 HTTP 客户端并执行 GET 请求class="token class-name">esp_class="tags" href="/HTTP.html" title=http>http_client_handle_t client class="token operator">= class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_initclass="token punctuation">(class="token operator">&configclass="token punctuation">)class="token punctuation">;class="token function">printfclass="token punctuation">(class="token string">"request  -----------2\n"class="token punctuation">)class="token punctuation">;class="token class-name">esp_err_t err class="token operator">= class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_performclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">; class="token comment">// 请求百度网页时,一执行这行系统就会崩溃class="token function">printfclass="token punctuation">(class="token string">"request  -----------3\n"class="token punctuation">)class="token punctuation">;class="token comment">// 检查请求是否成功class="token keyword">if class="token punctuation">(err class="token operator">== ESP_OKclass="token punctuation">) class="token punctuation">{class="token keyword">int len class="token operator">=  class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_get_content_lengthclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">;class="token function">ESP_LOGIclass="token punctuation">(TAGclass="token punctuation">, class="token string">"Status = %d, content_length = %d"class="token punctuation">,class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_get_status_codeclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">,class="token comment">//状态码lenclass="token punctuation">)class="token punctuation">;class="token comment">//数据长度class="token punctuation">} class="token keyword">else class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"HTTP GET request failed: %s\n"class="token punctuation">, class="token function">esp_err_to_nameclass="token punctuation">(errclass="token punctuation">)class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token function">printfclass="token punctuation">(class="token string">"Response: %.*s\n"class="token punctuation">, class="token function">strlenclass="token punctuation">(local_response_bufferclass="token punctuation">)class="token punctuation">, local_response_bufferclass="token punctuation">)class="token punctuation">;class="token comment">//断开并释放资源class="token function">esp_class="tags" href="/HTTP.html" title=http>http_client_cleanupclass="token punctuation">(clientclass="token punctuation">)class="token punctuation">;class="token function">printfclass="token punctuation">(class="token string">"request  -----------4\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">class="tags" href="/HTTP.html" title=http>http_test_taskclass="token punctuation">(class="token keyword">void class="token operator">*argclass="token punctuation">)
class="token punctuation">{class="token function">sleepclass="token punctuation">(class="token number">15class="token punctuation">)class="token punctuation">;class="token function">requestclass="token punctuation">(HTTP_URLclass="token punctuation">)class="token punctuation">;class="token function">vTaskDeleteclass="token punctuation">(class="token constant">NULLclass="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token comment">/*** @brief WiFi 的事件循环Handler* @param arg* @param event_base* @param event_id* @param event_data*/
class="token keyword">void class="token function">wifi_event_handlerclass="token punctuation">(class="token keyword">void class="token operator">*argclass="token punctuation">, class="token class-name">esp_event_base_t event_baseclass="token punctuation">, class="token class-name">int32_t event_idclass="token punctuation">, class="token keyword">void class="token operator">*event_dataclass="token punctuation">)
class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"wifi_event_handler base:%s, id:%d\n"class="token punctuation">, event_baseclass="token punctuation">, event_idclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(event_base class="token operator">== WIFI_EVENT class="token operator">&& event_id class="token operator">== WIFI_EVENT_STA_STARTclass="token punctuation">)class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"esp_wifi_connect\n"class="token punctuation">)class="token punctuation">;class="token function">esp_wifi_connectclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">else class="token keyword">if class="token punctuation">(event_base class="token operator">== WIFI_EVENT class="token operator">&& event_id class="token operator">== WIFI_EVENT_STA_DISCONNECTEDclass="token punctuation">)class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"esp_wifi_connect\n"class="token punctuation">)class="token punctuation">;class="token function">esp_wifi_connectclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">if class="token punctuation">(event_base class="token operator">== IP_EVENT class="token operator">&& event_id class="token operator">== IP_EVENT_STA_GOT_IPclass="token punctuation">)class="token punctuation">{class="token class-name">ip_event_got_ip_t class="token operator">*event class="token operator">= class="token punctuation">(class="token class-name">ip_event_got_ip_t class="token operator">*class="token punctuation">)event_dataclass="token punctuation">;class="token function">ESP_LOGIclass="token punctuation">(class="token string">"ESP32"class="token punctuation">, class="token string">"IP地址:: " IPSTRclass="token punctuation">, class="token function">IP2STRclass="token punctuation">(class="token operator">&eventclass="token operator">->ip_infoclass="token punctuation">.ipclass="token punctuation">)class="token punctuation">)class="token punctuation">;class="token comment">//request(HTTP_URL); 问题点2: 获取到ip地址后,不要直接在这里执行class="tags" href="/HTTP.html" title=http>http请求, 否则会直接崩溃 , 这里注释掉不用class="token punctuation">}
class="token punctuation">}class="token keyword">void class="token function">app_mainclass="token punctuation">(class="token keyword">voidclass="token punctuation">)
class="token punctuation">{class="token class-name">esp_err_t ret class="token operator">= class="token function">nvs_flash_initclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 初始化默认NVS分区class="token keyword">if class="token punctuation">(ret class="token operator">== ESP_ERR_NVS_NO_FREE_PAGES class="token operator">|| ret class="token operator">== ESP_ERR_NVS_NEW_VERSION_FOUNDclass="token punctuation">)class="token punctuation">{class="token function">ESP_ERROR_CHECKclass="token punctuation">(class="token function">nvs_flash_eraseclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 擦除默认NVS分区ret class="token operator">= class="token function">nvs_flash_initclass="token punctuation">(class="token punctuation">)class="token punctuation">;             class="token comment">// 初始化默认NVS分区class="token punctuation">}class="token function">ESP_ERROR_CHECKclass="token punctuation">(retclass="token punctuation">)class="token punctuation">;class="token function">ESP_ERROR_CHECKclass="token punctuation">(class="token function">esp_netif_initclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">;                class="token comment">// 初始化底层TCP/IP堆栈class="token function">ESP_ERROR_CHECKclass="token punctuation">(class="token function">esp_event_loop_create_defaultclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">; class="token comment">// 创建默认事件循环class="token function">esp_netif_create_default_wifi_staclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 创建默认的WIFI STA。class="token class-name">wifi_init_config_t cfg class="token operator">= class="token function">WIFI_INIT_CONFIG_DEFAULTclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token function">esp_wifi_initclass="token punctuation">(class="token operator">&cfgclass="token punctuation">)class="token punctuation">; class="token comment">// 初始化WiFi为WiFi驱动程序class="token class-name">wifi_sta_config_t cfg_sta class="token operator">= class="token punctuation">{class="token punctuation">.ssid class="token operator">= class="token string">"black"class="token punctuation">,class="token punctuation">.password class="token operator">= class="token string">"black1234"class="token punctuation">,class="token punctuation">.thresholdclass="token punctuation">.authmode class="token operator">= WIFI_AUTH_WPA2_PSKclass="token punctuation">,   class="token comment">//加密方式class="token punctuation">.pmf_cfg class="token operator">= class="token punctuation">{class="token punctuation">.capable class="token operator">= trueclass="token punctuation">,class="token punctuation">.required class="token operator">= falseclass="token punctuation">}class="token punctuation">,class="token punctuation">}class="token punctuation">;class="token function">esp_wifi_set_configclass="token punctuation">(WIFI_IF_STAclass="token punctuation">, class="token punctuation">(class="token class-name">wifi_config_t class="token operator">*class="token punctuation">)class="token operator">&cfg_staclass="token punctuation">)class="token punctuation">; class="token comment">// 设置ESP32 STA或AP的配置class="token function">esp_wifi_set_modeclass="token punctuation">(WIFI_MODE_STAclass="token punctuation">)class="token punctuation">; class="token comment">// 设置WiFi操作模式class="token comment">// 将事件处理程序的实例注册到默认循环中           任何事件class="token function">esp_event_handler_instance_registerclass="token punctuation">(WIFI_EVENTclass="token punctuation">, ESP_EVENT_ANY_IDclass="token punctuation">, wifi_event_handlerclass="token punctuation">, class="token constant">NULLclass="token punctuation">, class="token constant">NULLclass="token punctuation">)class="token punctuation">;class="token comment">// 将事件处理程序的实例注册到默认循环中            工作站从连接的AP获得IP事件class="token function">esp_event_handler_instance_registerclass="token punctuation">(IP_EVENTclass="token punctuation">, IP_EVENT_STA_GOT_IPclass="token punctuation">, wifi_event_handlerclass="token punctuation">, class="token constant">NULLclass="token punctuation">, class="token constant">NULLclass="token punctuation">)class="token punctuation">;class="token function">esp_wifi_startclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 根据当前配置启动wificlass="token function">xTaskCreateclass="token punctuation">(class="token operator">&class="tags" href="/HTTP.html" title=http>http_test_taskclass="token punctuation">, class="token string">"class="tags" href="/HTTP.html" title=http>http_test_task"class="token punctuation">, class="token number">8192class="token punctuation">, class="token constant">NULLclass="token punctuation">, class="token number">5class="token punctuation">, class="token constant">NULLclass="token punctuation">)class="token punctuation">; class="token comment">//问题点3: 这里参数需要设置足够大的栈大小, 否则会导致崩溃, 可以根据实测来改, 最好MAX_HTTP_OUTPUT_BUFFER大,否则可能会崩溃.
class="token punctuation">}
code>

这样连上wifi后, class="tags" href="/HTTP.html" title=http>http get请求百度网页就正常了, 可以打印部分内容, 建议换成简单的页面的网址, 百度返回的数据太多了.

class="tags" href="/ESP32.html" title=esp32>esp32_433">class="tags" href="/ESP32.html" title=esp32>esp32相关文章

可见我的class="tags" href="/ESP32.html" title=esp32>esp32专栏
作者:帅得不敢出门 csdn原创谢绝转载


http://www.ppmy.cn/news/1520832.html

相关文章

【亚马逊云】注册登录AWS 合作伙伴网络(APN)操作流程

文章目录 1、什么是APN&#xff1f;2、登录AWS官网3、加入 AWS 合作伙伴网络4、登录 AWS 合作伙伴网络5、常见问题5.1 忘记密码5.2 修改信息 6、活动上新1️⃣「云上驰骋&#xff0c;考证无忧」云从业者认证考试优惠活动2️⃣ Amazon 动手实验3️⃣AWS Certified 助理级认证挑战…

[Tools: LoRA] Diffusers中Stable Diffusion的实现

实现底层原理 Diffusers中的Attention操作实现在AttnProcessor类&#xff08;diffusers.models.attention_processor.py&#xff09;&#xff0c;里面定义了单次Attention操作。添加LoRA&#xff0c;本质上是用LoRAAttnProcessor类替换AttnProcessor类。LoRAAttnProcessor中新…

强连通分量专题总结

~~~~~ 总题单链接 ~~~~~ 对于只需要考虑强连通分量的题&#xff0c;就可以用强连通分量&#xff08;大雾 ~~~~~ 我想了很久&#xff0c;确实没有什么好说的 … \ldots …

ECCV2024|RegionDrag:基于区域的图像编辑方法,通过手动拖拽实现图像编辑!

香港大学和牛津大学提出了一种使用扩散模型进行基于区域的快速图像编辑方法RegionDrag&#xff0c; RegionDrag 是一种基于区域的图像编辑方法&#xff0c;通过使用户能够通过 手柄和 目标区域表达指令&#xff0c;提供比点拖动方法更快、更精确的图像编辑&#xff0c;在速度上…

el-table利用折叠面板 type=“expand“ 嵌套el-table,并实现 明细数据多选,选中明细数据后返回原数据得嵌套格式

效果图: 废话不多说直接上代码&#xff0c;完整代码展示&#xff1a; <template><el-tableborderref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"><el-table-columnwidth"50"la…

Java | Leetcode Java题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; class Solution {int index 0;public NestedInteger deserialize(String s) {if (s.charAt(index) [) {index;NestedInteger ni new NestedInteger();while (s.charAt(index) ! ]) {ni.add(deserialize(s));if (s.charAt(index) ,) {in…

创新之光闪耀,点赋科技在第十三届创新创业大赛中绽放光彩

近日&#xff0c;第十三届创新创业大赛决赛落下帷幕&#xff0c;这场充满激情与挑战的赛事吸引了众多优秀企业参与角逐。在激烈的竞争中&#xff0c;点赋科技脱颖而出&#xff0c;荣获第三名的佳绩。 创新创业大赛一直是企业展示实力、交流创新理念的重要平台。本次大赛中&…

前端防抖和节流函数的实现原理

在前端开发中&#xff0c;防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用的优化技术&#xff0c;它们主要用于减少事件处理函数的执行频率&#xff0c;从而提高程序性能和用户体验。 防抖&#xff08;Debounce&#xff09; 防抖的目…

iomuxc、pinctrl子系统、gpio子系统(学习总结)

iomuxc、pinctrl子系统、gpio子系统三者的关系 相互依赖&#xff1a;IOMUXC、pinctrl子系统和gpio子系统在功能上相互依赖。IOMUXC提供了引脚复用和电气属性的配置能力&#xff0c;pinctrl子系统负责从设备树中获取这些配置信息并完成初始化&#xff0c;而gpio子系统则在引脚被…

UE 【材质编辑】自定义材质节点

使用UE的材质编辑器&#xff0c;蓝图提供了大量的节点函数&#xff1a; 实际上&#xff0c;这是一段封装好的包含一串HLSL代码的容器。打开“Source/Runtime/Engine/Classes/Material”&#xff0c;可以看到很多不同节点的头文件&#xff1a; 照葫芦画瓢 以UMaterialExpressi…

notepad++将换行替换成空

将多行里的换行置为一行&#xff0c;例如将下面的6行置为3行 crrlH打开替换框&#xff0c; 替换目标为【,\r\n】&#xff0c;替换成空&#xff0c;勾选循环查找和 正则表达式&#xff0c;全部替换即可。 替换后的效果

应该怎么从0搭建一个图像识别系统,如果想考计算机的研究生应该如何准备

搭建一个图像识别系统的过程可以分为以下几个步骤&#xff1a; 数据收集和准备&#xff1a;收集包含标注的图像数据集&#xff0c;并将其准备为训练集和测试集。确保数据集的多样性和代表性。 特征提取和选择&#xff1a;选择适当的特征提取方法&#xff0c;如卷积神经网络&am…

如何配置iSAID_Devkit环境

这个库有点年头了&#xff0c;使用README.md里的conda env create -f environment.yml会说包之间有冲突, 没法安装. 解决方法: 自己建立一个conda env, conda create -n py_isaid pip python3.6.8 记得自己提前定好python版本use gpt to transform environment.yml to setup.p…

mac安装spark

参考&#xff1a;在Mac上安装Spark apache-spark-3.5.1_mac安装spark-CSDN博客 几个需要用到的路径&#xff1a; hadoop的bin目录&#xff1a;/opt/homebrew/Cellar/hadoop/3.4.0/bin spark的conf目录/opt/homebrew/Cellar/apache-spark/3.5.2/libexec/conf spark的bin目录&am…

Elasticsearch之原理详解

简介 ES是使用 Java 编写的一种开源搜索引擎&#xff0c;它在内部使用 Lucene 做索引与搜索&#xff0c;通过对 Lucene 的封装&#xff0c;隐藏了 Lucene 的复杂性&#xff0c;取而代之的提供一套简单一致的 RESTful API 然而&#xff0c;Elasticsearch 不仅仅是 Lucene&#…

SpringCloud Alibaba】(十三)学习 RocketMQ 消息队列

目录 1、MQ 使用场景与选型对比1.1、MQ 的使用场景1.2、引入 MQ 后的注意事项1.3、MQ 选型对比 2、下载、安装 RocketMQ 及 RocketMQ 控制台2.1、下载安装 RocketMQ2.2、测试 RocketMQ 环境2.3、RocketMQ 控制台【图形化管理控制台】2.3.1、下载、安装2.3.2、验证 RocketMQ 控制…

day-49 使数组中所有元素相等的最小操作数

思路 第一个数和最后一个数要变为一致&#xff0c;需要操作n-1次&#xff0c;然后第二个数和倒数第二个数要操作n-3次 解题过程 以此类推即可得出答案 Code class Solution {public int minOperations(int n) {int ans0;int t(n-1);while(t>0){anst;t-2;}return ans;} }作…

String核心设计模式——建造者模式

目录 建造者模式 优点 缺点 使用场景 结构 步骤 1 Item.java Packing.java 步骤 2 Wrapper.java Bottle.java 步骤 3 Burger.java ColdDrink.java 步骤 4 VegBurger.java ChickenBurger.java Coke.java Pepsi.java 步骤 5 Meal.java 步骤 6 MealBuilder…

Proteus 仿真设计:开启电子工程创新之门

摘要&#xff1a; 本文详细介绍了 Proteus 仿真软件在电子工程领域的广泛应用。从 Proteus 的功能特点、安装与使用方法入手&#xff0c;深入探讨了其在电路设计、单片机系统仿真、PCB 设计等方面的强大优势。通过具体的案例分析&#xff0c;展示了如何利用 Proteus 进行高效的…

CSP-CCF ★201512-2 消除类游戏★

一、问题描述 问题描述 消除类游戏是深受大众欢迎的一种游戏&#xff0c;游戏在一个包含有n行m列的游戏棋盘上进行&#xff0c;棋盘的每一行每一列的方格上放着一个有颜色的棋子&#xff0c;当一行或一列上有连续三个或更多的相同颜色的棋子时&#xff0c;这些棋子都被消除。当…