STM32 ESP8266 WiFi模塊驅動

STM32 ESP8266 WiFi模塊驅動

1. 簡介

ESP8266是一款高度集成的WiFi芯片,可以為其他設備提供WiFi聯網功能。本筆記記錄了基于STM32 HAL庫的ESP8266驅動實現,包括硬件連接、初始化配置、AT指令交互等關鍵部分。

項目源碼倉庫:STM32_Sensor_Drives

2. 硬件連接

在這里插入圖片描述

2.1 引腳定義

ESP8266與STM32的連接引腳定義如下:

/******************************** ESP8266 連接引腳定義 ***********************************/
#define      macESP8266_CH_PD_PORT                            GPIOA
#define      macESP8266_CH_PD_PIN                             GPIO_PIN_11
#define      macESP8266_RST_PORT                              GPIOA
#define      macESP8266_RST_PIN                               GPIO_PIN_12#define      macESP8266_USART_BAUD_RATE                       115200
#define      macESP8266_USART_TX_PORT                         GPIOB   
#define      macESP8266_USART_TX_PIN                          GPIO_Pin_10
#define      macESP8266_USART_RX_PORT                         GPIOB
#define      macESP8266_USART_RX_PIN                          GPIO_Pin_11
#define      macESP8266_USARTx                                huart3

2.2 GPIO初始化

gpio.c中,我們初始化了ESP8266所需的GPIO引腳:

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);/*Configure GPIO pins : PA4 PA11 PA12 */GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_11|GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// ... 其他GPIO配置 ...
}

3. 數據結構定義

3.1 ESP8266工作模式枚舉

/******************************* ESP8266 數據類型定義 ***************************/
typedef enum{STA,        // 客戶端模式AP,         // 熱點模式STA_AP      // 客戶端+熱點模式
} ENUM_Net_ModeTypeDef;typedef enum{enumTCP,    // TCP協議enumUDP,    // UDP協議
} ENUM_NetPro_TypeDef;typedef enum{Multiple_ID_0 = 0,Multiple_ID_1 = 1,Multiple_ID_2 = 2,Multiple_ID_3 = 3,Multiple_ID_4 = 4,Single_ID_0 = 5,
} ENUM_ID_NO_TypeDef;typedef enum{OPEN = 0,      // 開放模式WEP = 1,       // WEP加密WPA_PSK = 2,   // WPA-PSK加密WPA2_PSK = 3,  // WPA2-PSK加密WPA_WPA2_PSK = 4, // WPA/WPA2混合加密
} ENUM_AP_PsdMode_TypeDef;

3.2 數據接收緩沖區結構

/******************************* ESP8266 外部全局變量聲明 ***************************/
#define RX_BUF_MAX_LEN     1024                                     //最大接收緩存字節數extern struct  STRUCT_USARTx_Fram                                  //串口數據幀的處理結構體
{char  Data_RX_BUF [ RX_BUF_MAX_LEN ];  // 數據接收緩沖區union {__IO uint16_t InfAll;struct  {__IO uint16_t FramLength       :15;  // 數據幀長度__IO uint16_t FramFinishFlag   :1;   // 數據幀接收完成標志} InfBit;}Inf;} strEsp8266_Fram_Record;

4. 函數宏定義

/*********************************************** ESP8266 函數宏定義 *******************************************/
#define     macESP8266_CH_ENABLE()                 HAL_GPIO_WritePin(macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN, GPIO_PIN_SET)
#define     macESP8266_CH_DISABLE()                HAL_GPIO_WritePin(macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN, GPIO_PIN_RESET)#define     macESP8266_RST_HIGH_LEVEL()            HAL_GPIO_WritePin(macESP8266_RST_PORT, macESP8266_RST_PIN, GPIO_PIN_SET)
#define     macESP8266_RST_LOW_LEVEL()             HAL_GPIO_WritePin(macESP8266_RST_PORT, macESP8266_RST_PIN, GPIO_PIN_RESET)

5. 串口重定向

為了方便打印調試信息,重定向了printf函數:

/* 串口重定向相關定義 */
extern UART_HandleTypeDef *current_huart;
#define printf_log(...) do { \current_huart = &huart2; \printf(__VA_ARGS__); \
} while(0)#define printf_wifi(...) do { \current_huart = &macESP8266_USARTx; \printf(__VA_ARGS__); \
} while(0)/* printf重定向實現 */
int fputc(int ch, FILE *f)
{if (f == stdout) // 僅處理標準輸出{HAL_UART_Transmit(current_huart, (uint8_t *)&ch, 1, 100); // 阻塞發送if (ch == '\n')                                           // 發送\n時自動補充\rHAL_UART_Transmit(current_huart, (uint8_t *)"\r", 1, 100);}return ch;
}

6. ESP8266初始化與配置

6.1 ESP8266啟動函數

/*** @brief  ESP8266 (Sta Tcp Client)透傳* @param  無* @retval 無*/
void ESP8266_start(void)
{printf_log("\r\n正在配置 ESP8266 ......\r\n");HAL_UART_Receive_IT(&macESP8266_USARTx, &UART_TEMP_CHAR, 1);macESP8266_CH_ENABLE();  // 使能ESP8266ESP8266_AT_Test();       // AT測試ESP8266_Net_Mode_Choose(STA_AP);  // 設置為STA+AP模式// 連接到指定的WiFi熱點while (!ESP8266_JoinAP(macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd));ESP8266_Cmd("AT+CIFSR", "OK", 0, 1000);  // 查詢IP地址ESP8266_Cmd("AT+CIPMUX=1", "OK", 0, 1000);  // 啟用多連接ESP8266_Cmd("AT+CIPSERVER=1,8288", "OK", 0, 1000);  // 創建TCP服務器// ESP8266_Cmd("AT+CIPSTART="TCP",192.168.1.1,8000","OK",0,1000);printf_log("\r\n配置 ESP8266 完畢\r\n");
}

6.2 ESP8266復位函數

/** 函數名:ESP8266_Rst* 描述  :重啟WF-ESP8266模塊* 輸入  :無* 返回  : 無* 調用  :被 ESP8266_AT_Test 調用*/
void ESP8266_Rst(void)
{
#if 0ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );#elsemacESP8266_RST_LOW_LEVEL();  // 復位引腳拉低HAL_Delay(500);macESP8266_RST_HIGH_LEVEL();  // 復位引腳拉高
#endif
}

7. AT指令交互

7.1 AT指令發送與響應檢查

/** 函數名:ESP8266_Cmd* 描述  :對WF-ESP8266模塊發送AT指令* 輸入  :cmd,待發送的指令*         reply1,reply2,期待的響應,為NULL表不需響應,兩者為或邏輯關系*         waittime,等待響應的時間* 返回  : 1,指令發送成功*         0,指令發送失敗* 調用  :被外部調用*/
uint8_t ESP8266_Cmd(char *cmd, char *reply1, char *reply2, uint32_t waittime)
{strEsp8266_Fram_Record.Inf.InfBit.FramLength = 0; // 從新開始接收新的數據包printf_wifi("%s\r\n", cmd);  // 發送AT指令if ((reply1 == NULL) && (reply2 == NULL)) // 不需要接收數據return 1;HAL_Delay(waittime); // 延時等待響應strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.Inf.InfBit.FramLength] = '\0';printf_log("%s", strEsp8266_Fram_Record.Data_RX_BUF);  // 打印響應數據// 檢查響應是否包含期望的字符串if ((reply1 != NULL) && (reply2 != NULL)){if (strstr(strEsp8266_Fram_Record.Data_RX_BUF, reply1) != NULL ||strstr(strEsp8266_Fram_Record.Data_RX_BUF, reply2) != NULL)return 1;return 0;}else if (reply1 != NULL){if (strstr(strEsp8266_Fram_Record.Data_RX_BUF, reply1) != NULL)return 1;return 0;}else{if (strstr(strEsp8266_Fram_Record.Data_RX_BUF, reply2) != NULL)return 1;return 0;}
}

7.2 AT測試函數

/** 函數名:ESP8266_AT_Test* 描述  :對WF-ESP8266模塊進行AT測試啟動* 輸入  :無* 返回  : 無* 調用  :被外部調用*/
void ESP8266_AT_Test(void)
{char count = 0;macESP8266_RST_HIGH_LEVEL();HAL_Delay(1000);while (count < 10){if (ESP8266_Cmd("AT", "OK", NULL, 500))  // 發送AT測試指令return;ESP8266_Rst();  // 如果失敗則復位ESP8266++count;}
}

8. WiFi連接功能

8.1 設置工作模式

/** 函數名:ESP8266_Net_Mode_Choose* 描述  :選擇WF-ESP8266模塊的工作模式* 輸入  :enumMode,工作模式* 返回  : 1,選擇成功*         0,選擇失敗* 調用  :被外部調用*/
uint8_t ESP8266_Net_Mode_Choose(ENUM_Net_ModeTypeDef enumMode)
{switch (enumMode){case STA:  // 客戶端模式return ESP8266_Cmd("AT+CWMODE=1", "OK", "no change", 2500);case AP:   // 熱點模式return ESP8266_Cmd("AT+CWMODE=2", "OK", "no change", 2500);case STA_AP:  // 客戶端+熱點模式return ESP8266_Cmd("AT+CWMODE=3", "OK", "no change", 2500);default:return 0;}
}

8.2 連接WiFi熱點

/** 函數名:ESP8266_JoinAP* 描述  :WF-ESP8266模塊連接外部WiFi* 輸入  :pSSID,WiFi名稱字符串*       :pPassWord,WiFi密碼字符串* 返回  : 1,連接成功*         0,連接失敗* 調用  :被外部調用*/
uint8_t ESP8266_JoinAP(char *pSSID, char *pPassWord)
{char cCmd[120];sprintf(cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord);return ESP8266_Cmd(cCmd, "OK", NULL, 5000);
}

8.3 創建WiFi熱點

/** 函數名:ESP8266_BuildAP* 描述  :WF-ESP8266模塊創建WiFi熱點* 輸入  :pSSID,WiFi名稱字符串*       :pPassWord,WiFi密碼字符串*       :enunPsdMode,WiFi加密方式代號字符串* 返回  : 1,創建成功*         0,創建失敗* 調用  :被外部調用*/
uint8_t ESP8266_BuildAP(char *pSSID, char *pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode)
{char cCmd[120];sprintf(cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode);return ESP8266_Cmd(cCmd, "OK", 0, 1000);
}

9. TCP/IP通信功能

9.1 啟用多連接

/** 函數名:ESP8266_Enable_MultipleId* 描述  :WF-ESP8266模塊啟動多連接* 輸入  :enumEnUnvarnishTx,配置是否多連接* 返回  : 1,配置成功*         0,配置失敗* 調用  :被外部調用*/
uint8_t ESP8266_Enable_MultipleId(FunctionalState enumEnUnvarnishTx)
{return ESP8266_Cmd("AT+CIPMUX=%d", "OK", 0, 500);
}

9.2 連接服務器

/** 函數名:ESP8266_Link_Server* 描述  :WF-ESP8266模塊連接外部服務器* 輸入  :enumE,網絡協議*       :ip,服務器IP字符串*       :ComNum,服務器端口字符串*       :id,模塊連接服務器的ID* 返回  : 1,連接成功*         0,連接失敗* 調用  :被外部調用*/
uint8_t ESP8266_Link_Server(ENUM_NetPro_TypeDef enumE, char *ip, char *ComNum, ENUM_ID_NO_TypeDef id)
{char cStr[100] = {0}, cCmd[120];switch (enumE){case enumTCP:sprintf(cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum);break;case enumUDP:sprintf(cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum);break;default:break;}if (id < 5)sprintf(cCmd, "AT+CIPSTART=%d,%s", id, cStr);elsesprintf(cCmd, "AT+CIPSTART=%s", cStr);return ESP8266_Cmd(cCmd, "OK", "ALREAY CONNECT", 4000);
}

9.3 創建/關閉TCP服務器

/** 函數名:ESP8266_StartOrShutServer* 描述  :WF-ESP8266模塊開啟或關閉服務器模式* 輸入  :enumMode,開啟/關閉*       :pPortNum,服務器端口號字符串*       :pTimeOver,服務器超時時間字符串,單位:秒* 返回  : 1,操作成功*         0,操作失敗* 調用  :被外部調用*/
uint8_t ESP8266_StartOrShutServer(FunctionalState enumMode, char *pPortNum, char *pTimeOver)
{char cCmd1[120], cCmd2[120];if (enumMode)  // 開啟服務器{sprintf(cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum);sprintf(cCmd2, "AT+CIPSTO=%s", pTimeOver);return (ESP8266_Cmd(cCmd1, "OK", 0, 500) &&ESP8266_Cmd(cCmd2, "OK", 0, 500));}else  // 關閉服務器{sprintf(cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum);return ESP8266_Cmd(cCmd1, "OK", 0, 500);}
}

10. 數據收發功能

10.1 發送數據

/** 函數名:ESP8266_SendString* 描述  :WF-ESP8266模塊發送字符串* 輸入  :enumEnUnvarnishTx,聲明是否已使能了透傳模式*       :pStr,要發送的字符串*       :ulStrLength,要發送的字符串的字節數*       :ucId,哪個ID發送的字符串* 返回  : 1,發送成功*         0,發送失敗* 調用  :被外部調用*/
uint8_t ESP8266_SendString(FunctionalState enumEnUnvarnishTx, char *pStr, uint32_t ulStrLength, ENUM_ID_NO_TypeDef ucId)
{char cStr[20];uint8_t bRet = 0;if (enumEnUnvarnishTx)  // 透傳模式{printf_wifi("%s", pStr);bRet = 1;}else  // 非透傳模式{if (ucId < 5)sprintf(cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2);elsesprintf(cStr, "AT+CIPSEND=%d", ulStrLength + 2);ESP8266_Cmd(cStr, "> ", 0, 1000);  // 等待發送指令的響應bRet = ESP8266_Cmd(pStr, "SEND OK", 0, 1000);  // 發送數據}return bRet;
}

10.2 接收數據

/** 函數名:ESP8266_ReceiveString* 描述  :WF-ESP8266模塊接收字符串* 輸入  :enumEnUnvarnishTx,聲明是否已使能了透傳模式* 返回  : 接收到的字符串首地址* 調用  :被外部調用*/
char *ESP8266_ReceiveString(FunctionalState enumEnUnvarnishTx)
{char *pRecStr = 0;strEsp8266_Fram_Record.Inf.InfBit.FramLength = 0;strEsp8266_Fram_Record.Inf.InfBit.FramFinishFlag = 0;while (!strEsp8266_Fram_Record.Inf.InfBit.FramFinishFlag);  // 等待接收完成strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.Inf.InfBit.FramLength] = '\0';if (enumEnUnvarnishTx)  // 透傳模式pRecStr = strEsp8266_Fram_Record.Data_RX_BUF;else  // 非透傳模式{if (strstr(strEsp8266_Fram_Record.Data_RX_BUF, "+IPD"))pRecStr = strEsp8266_Fram_Record.Data_RX_BUF;}return pRecStr;
}

10.3 UART接收中斷回調

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart == &macESP8266_USARTx){if (strEsp8266_Fram_Record.Inf.InfBit.FramLength < (RX_BUF_MAX_LEN - 1))strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.Inf.InfBit.FramLength++] = UART_TEMP_CHAR;if (HAL_UART_GetState(&macESP8266_USARTx) == HAL_UART_STATE_READY){strEsp8266_Fram_Record.Inf.InfBit.FramFinishFlag = 1;ucTcpClosedFlag = strstr(strEsp8266_Fram_Record.Data_RX_BUF, "CLOSED\r\n") ? 1 : 0;strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.Inf.InfBit.FramLength] = '\0';if (strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.Inf.InfBit.FramLength-1] == '}'){printf_log(strEsp8266_Fram_Record.Data_RX_BUF);strEsp8266_Fram_Record.Inf.InfBit.FramLength = 0;}}HAL_UART_Receive_IT(&macESP8266_USARTx, &UART_TEMP_CHAR, 1);}
}

11. 主程序調用

main.c中,我們初始化外設并調用ESP8266啟動函數:

int main(void)
{/* 初始化HAL庫 */HAL_Init();/* 配置系統時鐘 */SystemClock_Config();/* 初始化外設 */MX_GPIO_Init();MX_USART2_UART_Init();MX_USART3_UART_Init();/* 啟動ESP8266 WiFi模塊 */ESP8266_start();/* 主循環 */while (1){HAL_Delay(200);}
}

12. 總結

本驅動實現了基于STM32 HAL庫的ESP8266 WiFi模塊驅動,主要功能包括:

  1. ESP8266初始化與復位
  2. AT指令交互
  3. WiFi連接與熱點創建
  4. TCP/IP服務器創建與客戶端連接
  5. 數據收發功能

通過這些功能,可以實現STM32與ESP8266的通信,進而實現WiFi聯網功能,為物聯網應用提供基礎。

使用時,只需修改macUser_ESP8266_ApSsidmacUser_ESP8266_ApPwd為實際的WiFi名稱和密碼即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92828.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7 種最佳 DBAN 替代方案,徹底擦除硬盤數據

DBAN&#xff08;Darik 的 Boot and Nuke&#xff09;長期以來一直是安全擦除計算機數據的首選解決方案。然而&#xff0c;盡管 DBAN 廣受歡迎&#xff0c;但它也存在一些明顯的局限性&#xff0c;這些局限性隨著時間的推移變得越來越明顯。現在&#xff0c;本文將更詳細地探討…

【K8s】K8s控制器——Deamonset、Statefulset、Job與CronJob

1、Deamonset2、Statefulset3、Job與CronJob一次性作業與周期性作業#- 8.6 #cat > daemonset.yml <<EOF apiVersion: apps/v1 kind: DaemonSet metadata:name: test-demonsetlabels:daemonset: test spec:selector:matchLabels:name: testpodtemplate:metadata:labels…

基于柔性管控終端的新能源汽車充電站有序充電系統設計與實現

摘要&#xff1a;隨著新能源汽車的迅猛發展&#xff0c;充電基礎設施面臨著電力負荷激增、電網穩定性下降等挑戰。本文針對當前充電設施無序充電導致的電網壓力問題&#xff0c;提出了一種基于柔性管控終端的充電站有序充電系統解決方案。通過分析國內外有序充電技術發展現狀&a…

10-docker基于dockerfile自動制作鏡像

文章目錄一.為什么要學習自動構建鏡像1.為什么要學習自動化構建鏡像2.根據dockerfile自動構建鏡像的流程3.常用的dockerfile指令二.使用dockerfile構建nginx服務鏡像&#xff08;FR0M&#xff0c;RUN&#xff0c;CMD&#xff09;1.創建dockerfile的存儲路徑2.編寫dockerfile文件…

如何解決大模型API明明一分鐘內只發起了一次請求,卻觸發了 “Your account reached max request” 的錯誤

問題背景 在使用 OpenAI SDK 進行 API 調用時&#xff0c;你可能會遇到這樣的困惑&#xff1a;明明一分鐘內只發起了一次請求&#xff0c;卻觸發了 “Your account reached max request” 的錯誤。仔細排查之后發現&#xff0c;并不是 SDK 真正向服務端發送了超限的多次請求&a…

使用Spring Boot+Vue3開源的即時通訊 IM 系統

1. 產品概述V-IM 是一款基于 Electron 和 Vue 3 開發的跨平臺即時通訊客戶端&#xff0c;目前正在進行2025年版本的開發。該應用提供了豐富的即時通訊功能&#xff0c;支持個人聊天、群組聊天、文件傳輸等功能&#xff0c;適用于企業內部通訊或團隊協作場景。2. 核心功能2.1 用…

在Mac上搭建本地AI工作流:Dify與DeepSeek的完美結合

在Mac上搭建本地AI工作流&#xff1a;Dify與DeepSeek的完美結合 一、Dify平臺簡介 Dify是一個開源的大語言模型(LLM)應用開發平臺&#xff0c;旨在簡化和加速生成式AI應用的創建和部署。其名字蘊含著"Define&#xff08;定義&#xff09; Modify&#xff08;修改&#x…

centos出現ping: baidu.com: 未知的名稱或服務問題

出現的問題如下&#xff1a;自己電腦連接的是實驗室的無線網&#xff0c;宿主機可以上網&#xff0c;但是虛擬機無法ping通百度 解決&#xff1a; 將連接的網絡換成自己的手機熱點&#xff0c;然后就解決了。。。

GitHub第三方登錄全解析:OAuth 2.0流程詳解(適合初學者)

&#x1f510; GitHub第三方登錄全解析&#xff1a;OAuth 2.0流程詳解&#xff08;適合初學者&#xff09; &#x1f31f; 什么是OAuth&#xff1f;為什么需要它&#xff1f; 想象一下&#xff1a;你開發了一個學習筆記應用"DocFlow"&#xff0c;用戶需要登錄才能使用…

MyBatis持久層實現

MyBatis持久層實現 package com.example.usermanagement.mapper;import com.example.usermanagement.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List;/*** 用戶Mapper接口* Mapper: 標識這是M…

BW處理鏈日志存儲分析與清理

處理鏈日志存儲分析使用程序 RSPC_LOGS_ANALYZE 分析處理鏈日志占用空間*&---------------------------------------------------------------------* *& Report RSPC_LOGS_ANALYZE *&---------------------------------------------------------------------* *&a…

mysql 簡單操作手冊

以下是一份 MySQL 日常操作速查手冊&#xff0c;包含啟動/停止服務、連接/退出客戶端、數據庫管理、用戶權限等常用命令&#xff0c;適用于 macOS&#xff08;Homebrew 安裝&#xff09;和 Linux 系統&#xff1a;一、服務管理 &#x1f6a6;操作命令&#xff08;Homebrew&…

HTML5 Web Workers 深度剖析:助力網頁性能飛速提升

在當今數字化時代&#xff0c;Web 應用的性能已成為決定用戶體驗和業務成功的關鍵因素。隨著 Web 應用的復雜性不斷增加&#xff0c;如何高效利用設備資源、提升網頁響應速度成為開發者面臨的重大挑戰。 HTML5 Web Workers 的誕生與意義 在傳統的網頁開發中&#xff0c;JavaScr…

調度系統部署架構是什么樣的呢?

簡單示例一個部署架構圖&#xff0c;如下所示&#xff1a;&#x1f4d8; 各組件說明&#xff1a;? 服務器端組件&#xff08;控制節點&#xff09;Slurm&#xff1a;slurmctld&#xff08;主控調度器&#xff09;&#xff0c;slurmdbd&#xff08;數據庫服務&#xff09;PBS P…

SQL 與 NoSQL 的核心區別

數據庫是存儲、管理和檢索數據的系統。根據數據模型和設計理念&#xff0c;可分為SQL 數據庫&#xff08;關系型數據庫&#xff09; 和NoSQL 數據庫&#xff08;非關系型數據庫&#xff09;。兩者的核心區別在于數據的組織方式、靈活性、事務支持和適用場景。&#x1f4a1;一、…

力扣 hot100 Day71

45. 跳躍游戲 II 給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。 每個元素 nums[i] 表示從索引 i 向后跳轉的最大長度。換句話說&#xff0c;如果你在索引 i 處&#xff0c;你可以跳轉到任意 (i j) 處&#xff1a; 0 < j < nums[i] 且i j < n …

什么是 Spring MVC?

題目詳細答案Spring MVC 是 Spring 框架中的一個模塊&#xff0c;用于構建基于 Web 的應用程序。它遵循 Model-View-Controller#&#xff08;MVC&#xff09;設計模式&#xff0c;將業務邏輯、用戶界面和數據分離&#xff0c;以促進代碼的可維護性和可擴展性。主要包含幾個概念…

第十篇:3D模型性能優化:從入門到實踐

第十篇&#xff1a;3D模型性能優化&#xff1a;從入門到實踐 引言 在3D開發中&#xff0c;性能優化是區分普通應用和卓越應用的關鍵。Three.js應用的流暢運行需要60FPS的渲染效率&#xff0c;而移動端設備更面臨嚴格的資源限制。本文將深入解析性能優化核心技術&#xff0c;并通…

基于 Easy Rules 的電商訂單智能決策系統:構建可擴展的業務規則引擎實踐

Easy Rules 是一個輕量級且易于使用的規則引擎&#xff0c;適用于Java應用。下面是一個簡單的示例&#xff0c;演示如何使用 Easy Rules 定義和執行規則。 添加依賴 首先&#xff0c;在你的Java項目中添加 Easy Rules 的 Maven 依賴&#xff08;如果你使用的是Maven構建工具&am…

如何使用gpt進行模型微調?

對 GPT 類大語言模型&#xff08;如 GPT-3、GPT-2、Hugging Face 的 GPT 系列、ChatGLM 等開源或閉源模型&#xff09;進行微調&#xff08;Fine-tuning&#xff09;&#xff0c;目的是讓模型在特定任務或領域&#xff08;如法律、醫療、客服、代碼生成等&#xff09;上表現更優…