From d487f58c6be4ed22f735d12861b59b85c3a924b9 Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期六, 20 十二月 2025 21:53:25 +0800
Subject: [PATCH] HTTP下载路径文件成功,解析路径文件成功,CRC用的软件,硬件解析不对。准备改BOOT

---
 STM32H743/FML/Internet/HTTPClient.c |  204 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 123 insertions(+), 81 deletions(-)

diff --git a/STM32H743/FML/Internet/HTTPClient.c b/STM32H743/FML/Internet/HTTPClient.c
index 947d4c1..5dd4da6 100644
--- a/STM32H743/FML/Internet/HTTPClient.c
+++ b/STM32H743/FML/Internet/HTTPClient.c
@@ -1,8 +1,8 @@
 /*******************************************************************************
  * File Name         : HTTP.c
  * Description       :
- * Created on        : 2020年7月1日
- * Author            : 杜键
+ * Created on        : 2020锟斤拷7锟斤拷1锟斤拷
+ * Author            : 锟脚硷拷
  *******************************************************************************/
 
 /*******************************************************************************
@@ -66,7 +66,7 @@
 
 static HIDO_UINT32 l_u32HTTPTryCnt = 0;
 static HIDO_UINT32 l_u32HTTPPort = 80;
-static HIDO_CHAR l_acHTTPPath[64];
+static HIDO_CHAR l_acHTTPPath[128];  // Increased from 64 to 128 for longer file paths
 static HIDO_CHAR l_acHTTPHost[64];
 static HIDO_UINT32 l_u32HTTPPostLen = 0;
 
@@ -97,8 +97,8 @@
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 static HIDO_INT32 HTTPClient_Response(HIDO_UINT32 _u32RespCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len)
 {
@@ -128,8 +128,8 @@
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 static HIDO_VOID HTTPClient_TimerCallback(HIDO_VOID *_pArg)
 {
@@ -145,8 +145,8 @@
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2020年11月14日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷11锟斤拷14锟斤拷
  *******************************************************************************/
 static void HTTPClient_SocketEventProc(HIDO_INT32 _i32SockID, E_SocketEvent _eEvent, HIDO_VOID *_pArg)
 {
@@ -193,7 +193,15 @@
                 HIDO_TimerCancel(l_u32HTTPClientTimerID);
                 l_eHTTPClientState = HTTP_CLIENT_STATE_IDLE;
 
-                HTTPClient_Response(l_u32HTTPRespCode, l_pu8HTTPRespBody, l_u32HTTPContentLength);
+                // 瀵逛簬GET_FILE鏂规硶锛屽彂閫丯ULL琛ㄧず涓嬭浇瀹屾垚
+                if(HTTP_METHOD_GET_FILE == l_eHTTPMethod)
+                {
+                    HTTPClient_Response(l_u32HTTPRespCode, HIDO_NULL, 0);
+                }
+                else
+                {
+                    HTTPClient_Response(l_u32HTTPRespCode, l_pu8HTTPRespBody, l_u32HTTPContentLength);
+                }
             }
             else
             {
@@ -228,7 +236,7 @@
 
                 if (HTTP_RECV_STATE_HEAD == l_eHTTPRecvState)
                 {
-                    /* 收到"\r\n\r\n */
+                    /* 锟秸碉拷"\r\n\r\n */
                     l_pu8HTTPRespBody = (HIDO_UINT8 *)HIDO_UtilStrnstr(l_acHTTPRecvBuff, "\r\n\r\n", u32RecvLen);
                     if (l_pu8HTTPRespBody != HIDO_NULL)
                     {
@@ -266,58 +274,50 @@
                             break;
                         }
 
-                        /* 获取文件分片信息 */
+                        /* 锟斤拷取锟侥硷拷锟斤拷片锟斤拷息 */
                         if(HTTP_METHOD_GET_FILE == l_eHTTPMethod)
                         {
                             HIDO_DataStruct stETag;
 
                             memset(&l_stHTTPGetFileResponse, 0, sizeof(l_stHTTPGetFileResponse));
 
+                            // 妫�鏌ユ槸鍚︽湁Content-Range澶达紙206 Partial Content鍝嶅簲锛�
                             pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "Content-Range: ", u32RecvLen);
                             if (pcKeyName != HIDO_NULL)
                             {
+                                // 鏈塕ange锛岃В鏋怰ange淇℃伅
                                 if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
                                         u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "Content-Range: bytes %d-%d/%d\r\n",
                                         &u32Range0, &u32Range1, &u32RangeAll) != 3)
                                 {
                                     Socket_Close(l_i32HTTPClientSockID);
-                                    
                                     break;
                                 }
+                                l_stHTTPGetFileResponse.m_u32RangeBegin = u32Range0;
+                                l_stHTTPGetFileResponse.m_u32RangeEnd = u32Range1;
+                                l_stHTTPGetFileResponse.m_u32RangeTotal = u32RangeAll;
                             }
                             else
                             {
-                                Socket_Close(l_i32HTTPClientSockID);
-
-                                break;
+                                // 鏃燫ange澶达紝浣跨敤Content-Length浣滀负鎬诲ぇ灏忥紙200 OK鍝嶅簲锛�
+                                l_stHTTPGetFileResponse.m_u32RangeBegin = 0;
+                                l_stHTTPGetFileResponse.m_u32RangeEnd = l_u32HTTPContentLength - 1;
+                                l_stHTTPGetFileResponse.m_u32RangeTotal = l_u32HTTPContentLength;
                             }
 
-                            l_stHTTPGetFileResponse.m_u32RangeBegin = u32Range0;
-                            l_stHTTPGetFileResponse.m_u32RangeEnd = u32Range1;
-                            l_stHTTPGetFileResponse.m_u32RangeTotal = u32RangeAll;
-
+                            // ETag鏄彲閫夌殑
                             pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "ETag: ", u32RecvLen);
-                             if (pcKeyName != HIDO_NULL)
-                             {
-                                 if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
-                                         u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "ETag: %p\r\n", &stETag) != 1)
-                                 {
-                                     Socket_Close(l_i32HTTPClientSockID);
-                                     
-                                     break;
-                                 }
-                             }
-                             else
-                             {
-                                 Socket_Close(l_i32HTTPClientSockID);
-
-                                 break;
-                             }
-
-                             if((stETag.m_u32Len + 1) < sizeof(l_stHTTPGetFileResponse.m_acETag))
-                             {
-                                 memcpy(l_stHTTPGetFileResponse.m_acETag, stETag.m_pData, stETag.m_u32Len);
-                             }
+                            if (pcKeyName != HIDO_NULL)
+                            {
+                                if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
+                                        u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "ETag: %p\r\n", &stETag) == 1)
+                                {
+                                    if((stETag.m_u32Len + 1) < sizeof(l_stHTTPGetFileResponse.m_acETag))
+                                    {
+                                        memcpy(l_stHTTPGetFileResponse.m_acETag, stETag.m_pData, stETag.m_u32Len);
+                                    }
+                                }
+                            }
                         }
 
                         l_u32HTTPRecvTotalLen = l_pu8HTTPRespBody - (HIDO_UINT8 *)l_acHTTPRecvBuff + l_u32HTTPContentLength;
@@ -325,6 +325,11 @@
 
                         if (l_u32HTTPRecvBuffLen >= l_u32HTTPRecvTotalLen)
                         {
+                            // 瀵逛簬GET_FILE鏂规硶锛岄渶瑕佸厛浼犻�抌ody鏁版嵁
+                            if(HTTP_METHOD_GET_FILE == l_eHTTPMethod && l_u32HTTPContentLength > 0)
+                            {
+                                HTTPClient_Response(l_u32HTTPRespCode, l_pu8HTTPRespBody, l_u32HTTPContentLength);
+                            }
                             Socket_Close(l_i32HTTPClientSockID);
                         }
                     }
@@ -333,6 +338,11 @@
                 {
                     if (l_u32HTTPRecvBuffLen >= l_u32HTTPRecvTotalLen)
                     {
+                        // 瀵逛簬GET_FILE鏂规硶锛岄渶瑕佸厛浼犻�抌ody鏁版嵁
+                        if(HTTP_METHOD_GET_FILE == l_eHTTPMethod && l_u32HTTPContentLength > 0)
+                        {
+                            HTTPClient_Response(l_u32HTTPRespCode, l_pu8HTTPRespBody, l_u32HTTPContentLength);
+                        }
                         Socket_Close(l_i32HTTPClientSockID);
                     }
                 }
@@ -350,12 +360,12 @@
 
 /*******************************************************************************
  * Function Name     : HTTPClient_ParseUrl
- * Description       : 解析Url
+ * Description       : 锟斤拷锟斤拷Url
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_ParseUrl(HIDO_CHAR *_pcUrl, HIDO_CHAR *_pcHost, HIDO_UINT32 _u32HostSize,
         HIDO_CHAR *_pcPath, HIDO_UINT32 _u32PathSize, HIDO_UINT32 *_pu32Port)
@@ -419,8 +429,8 @@
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2021年5月3日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2021锟斤拷5锟斤拷3锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_GetPostFileData(HIDO_UINT32 _u32Offset, HIDO_VOID *_pBuff, HIDO_UINT32 _u32BuffSize, HIDO_UINT32 *_pu32Len)
 {
@@ -442,8 +452,8 @@
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_Post(HIDO_CHAR *_pcUrl, HIDO_CHAR *_pcBody, HIDO_UINT32 _u32BodyLen, FN_HTTPResponseCallback _fnResponseCallback, HIDO_VOID *_pArg)
 {
@@ -457,7 +467,7 @@
         return HIDO_ERR;
     }
 
-    /* 解析Url */
+    /* 锟斤拷锟斤拷Url */
     if(HTTPClient_ParseUrl(_pcUrl, l_acHTTPHost, sizeof(l_acHTTPHost), l_acHTTPPath, sizeof(l_acHTTPPath), &l_u32HTTPPort) != HIDO_OK)
     {
         return HIDO_ERR;
@@ -497,8 +507,8 @@
  * Input             :
  * Output            :
  * Return            :
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_Get(HIDO_CHAR *_pcUrl, FN_HTTPResponseCallback _fnResponseCallback, HIDO_VOID *_pArg)
 {
@@ -512,7 +522,7 @@
         return HIDO_ERR;
     }
 
-    /* 解析Url */
+    /* 锟斤拷锟斤拷Url */
     if(HTTPClient_ParseUrl(_pcUrl, l_acHTTPHost, sizeof(l_acHTTPHost), l_acHTTPPath, sizeof(l_acHTTPPath), &l_u32HTTPPort) != HIDO_OK)
     {
         return HIDO_ERR;
@@ -545,18 +555,20 @@
 
 /*******************************************************************************
  * Function Name     : HTTPClient_GetFile
- * Description       : HTTP 下载文件
- * Input             : _pcUrl 文件连接
- *                   : _fnGetFileCallback 文件下载事件回调
- *                   : _pstOpt 下载参数
- *                   : _pArg 用户参数,回调使用
+ * Description       : HTTP 锟斤拷锟斤拷锟侥硷拷
+ * Input             : _pcUrl 锟侥硷拷锟斤拷锟斤拷
+ *                   : _fnGetFileCallback 锟侥硷拷锟斤拷锟斤拷锟铰硷拷锟截碉拷
+ *                   : _pstOpt 锟斤拷锟截诧拷锟斤拷
+ *                   锟斤拷 _pArg 锟矫伙拷锟斤拷锟斤拷,锟截碉拷使锟斤拷
  * Output            : None
- * Return            : HIDO_OK 成功,HIDO_ERR 失败
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Return            : HIDO_OK 锟缴癸拷,HIDO_ERR 失锟斤拷
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_GetFile(HIDO_CHAR *_pcUrl, FN_HTTPGetFileCallback _fnGetFileCallback, ST_HTTPGetFileOpt *_pstOpt, HIDO_VOID *_pArg)
 {
+    HIDO_INT32 ret;
+
     if(l_eHTTPClientState != HTTP_CLIENT_STATE_IDLE)
     {
         return HIDO_ERR;
@@ -572,8 +584,9 @@
         return HIDO_ERR;
     }
 
-    /* 解析Url */
-    if(HTTPClient_ParseUrl(_pcUrl, l_acHTTPHost, sizeof(l_acHTTPHost), l_acHTTPPath, sizeof(l_acHTTPPath), &l_u32HTTPPort) != HIDO_OK)
+    /* 锟斤拷锟斤拷Url */
+    ret = HTTPClient_ParseUrl(_pcUrl, l_acHTTPHost, sizeof(l_acHTTPHost), l_acHTTPPath, sizeof(l_acHTTPPath), &l_u32HTTPPort);
+    if(ret != HIDO_OK)
     {
         return HIDO_ERR;
     }
@@ -581,14 +594,23 @@
     /* URL */
     HIDO_UtilSnprintf(l_acHTTPUrl, sizeof(l_acHTTPUrl), _pcUrl);
 
+    // 鏋勫缓鍩虹HTTP璇锋眰澶�
     l_u32HTTPSendBuffLen = HIDO_UtilSnprintf(l_acHTTPSendBuff, sizeof(l_acHTTPSendBuff),
             "GET /%s HTTP/1.1\r\n"
             "Host: %s\r\n"
             "User-Agent: QUECTEL_MODULE\r\n"
             "Connection: Keep-Alive\r\n"
-            "Accept: */*\r\n"
+            "Accept: */*\r\n",
+            l_acHTTPPath, l_acHTTPHost);
+
+    // 鍙湁褰揜angeEnd > RangeBegin涓斾笉涓�0鏃舵墠娣诲姞Range澶�
+    if(_pstOpt->m_u32RangeEnd > 0 && _pstOpt->m_u32RangeEnd != 0xFFFFFFFF)
+    {
+        l_u32HTTPSendBuffLen += HIDO_UtilSnprintf(l_acHTTPSendBuff + l_u32HTTPSendBuffLen, 
+            sizeof(l_acHTTPSendBuff) - l_u32HTTPSendBuffLen,
             "Range: bytes=%u-%u\r\n",
-            l_acHTTPPath, l_acHTTPHost, _pstOpt->m_u32RangeBegin, _pstOpt->m_u32RangeEnd);
+            _pstOpt->m_u32RangeBegin, _pstOpt->m_u32RangeEnd);
+    }
 
     if(strlen(_pstOpt->m_acIfRange) != 0)
     {
@@ -617,15 +639,15 @@
 
 /*******************************************************************************
  * Function Name     : HTTPClient_PostFile
- * Description       : HTTP 上传文件
- * Input             : _pcUrl              HTTP路径
- *                   : _pcFileName         文件名称
- *                   : _fnResponseCallback HTTP响应回调函数
- *                   : _pArg               参数
+ * Description       : HTTP 锟较达拷锟侥硷拷
+ * Input             : _pcUrl              HTTP路锟斤拷
+ *                   : _pcFileName         锟侥硷拷锟斤拷锟斤拷
+ *                   : _fnResponseCallback HTTP锟斤拷应锟截碉拷锟斤拷锟斤拷
+ *                   : _pArg               锟斤拷锟斤拷
  * Output            : Mone
- * Return            : HIDO_OK 成功,HIDO_ERR 失败
- * Author            : 杜键
- * Modified Date:    : 2021年5月3日
+ * Return            : HIDO_OK 锟缴癸拷,HIDO_ERR 失锟斤拷
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2021锟斤拷5锟斤拷3锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_PostFile(HIDO_CHAR *_pcUrl, FN_HTTPPostDataCallback _fnPostDataCallback, FN_HTTPResponseCallback _fnResponseCallback,
         HIDO_VOID *_pArg)
@@ -655,7 +677,7 @@
         return HIDO_ERR;
     }
 
-    /* 解析Url */
+    /* 锟斤拷锟斤拷Url */
     if(HTTPClient_ParseUrl(_pcUrl, l_acHTTPHost, sizeof(l_acHTTPHost), l_acHTTPPath, sizeof(l_acHTTPPath), &l_u32HTTPPort) != HIDO_OK)
     {
         return HIDO_ERR;
@@ -675,12 +697,12 @@
 
 /*******************************************************************************
  * Function Name     : HTTPClient_Poll
- * Description       : HTTP客户端轮询处理
+ * Description       : HTTP锟酵伙拷锟斤拷锟斤拷询锟斤拷锟斤拷
  * Input             : None
  * Output            : None
- * Return            : HIDO_OK 成功,HIDO_ERR 失败
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Return            : HIDO_OK 锟缴癸拷,HIDO_ERR 失锟斤拷
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_Poll(HIDO_VOID)
 {
@@ -708,12 +730,12 @@
 
 /*******************************************************************************
  * Function Name     : HTTPClient_Init
- * Description       : HTTP客户端初始化
+ * Description       : HTTP锟酵伙拷锟剿筹拷始锟斤拷
  * Input             : None
  * Output            : None
- * Return            : HIDO_OK 成功,HIDO_ERR 失败
- * Author            : 杜键
- * Modified Date:    : 2020年7月1日
+ * Return            : HIDO_OK 锟缴癸拷,HIDO_ERR 失锟斤拷
+ * Author            : 锟脚硷拷
+ * Modified Date:    : 2020锟斤拷7锟斤拷1锟斤拷
  *******************************************************************************/
 HIDO_INT32 HTTPClient_Init(HIDO_VOID)
 {
@@ -731,3 +753,23 @@
 
     return HIDO_OK;
 }
+
+/*******************************************************************************
+ * Function Name     : HTTPClient_GetState
+ * Description       : 鑾峰彇HTTPClient褰撳墠鐘舵�侊紙鐢ㄤ簬璋冭瘯锛�
+ * Return            : 0=IDLE, 1=CONNECTING, 2=CONNECTED
+ *******************************************************************************/
+HIDO_INT32 HTTPClient_GetState(HIDO_VOID)
+{
+    return (HIDO_INT32)l_eHTTPClientState;
+}
+
+/*******************************************************************************
+ * Function Name     : HTTPClient_Reset
+ * Description       : 寮哄埗閲嶇疆HTTPClient鐘舵�佸埌IDLE锛堢敤浜庨敊璇仮澶嶏級
+ *******************************************************************************/
+HIDO_VOID HTTPClient_Reset(HIDO_VOID)
+{
+    l_eHTTPClientState = HTTP_CLIENT_STATE_IDLE;
+    HIDO_TimerCancel(l_u32HTTPClientTimerID);
+}

--
Gitblit v1.10.0