蓝牙函数优化
authorluozheng <1732036298@qq.com>
Tue, 17 Mar 2026 08:41:41 +0000 (16:41 +0800)
committerluozheng <1732036298@qq.com>
Tue, 17 Mar 2026 08:41:41 +0000 (16:41 +0800)
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c
code/sdk/zhihui/services/ble_service/bleservice/bleService.c
code/sdk/zhihui/services/ble_service/bleservice/bleService.h

index fac7c32..dddc9af 100644 (file)
@@ -491,7 +491,7 @@ errcode_t sendBleData(uint8_t *buf,uint16_t len)
     #endif
     //if(Bleconnect == true )
     {
-        ret = svr_ble_bt_gatts_noyify(buf,len);
+        ret = svr_ble_bt_gatts_notify(buf,len);
     }
     return ret;
     
@@ -518,7 +518,7 @@ void sendDataNow(uint8_t *buf,uint16_t len)
 {
     //if(Bleconnect == true )
     {
-        svr_ble_bt_gatts_noyify(buf,len);
+        svr_ble_bt_gatts_notify(buf,len);
     }
 }
 
@@ -1470,9 +1470,16 @@ void sendBindInfor(uint8_t *data)
         // 构造绑定指令并发送
         value[17] = bond;
         value[18] = Calculate_CRC(value,18);
-        sendBleData(value,19);
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Bind] 发送首次绑定指令,指令内容:");
+        for(int i=0;i<19;i++)
+        {
+            printf("0x%02X ",value[i]);
+        }
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Bind] 发送首次绑定指令,CRC: 0x%02X", value[18]);
 
+        sendBleData(value,19);
+
         #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION
         #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR
         comfirmPaire(1);
@@ -4129,7 +4136,7 @@ void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_
                 uint32_t pack;
                 uint16_t pack_size=(ble_nus_max_data_len-18);
                 if(pack_size>482)pack_size=482;
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据分包大小: %d 字节", pack_size);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "数据分包大小: %d 字节", pack_size);
 
                 if(data_size%pack_size==0)
                 {
@@ -4139,15 +4146,15 @@ void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_
                 {   
                     pack=data_size/pack_size+1;
                 }
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "总数据包数: %u", pack);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "总数据包数: %u", pack);
                 
                 uint32_t pack_id=1;
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始发送GPS数据包...");
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "开始发送GPS数据包...");
                 while (surplus_len!=0)
                 {
                     if(surplus_len>=pack_size)
                     {
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "发送数据包 %u/%u, 大小: %d, 偏移: %u", 
+                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "发送数据包 %u/%u, 大小: %d, 偏移: %u", 
                                       pack_id, pack, pack_size, offset);
                         surplus_len=surplus_len-pack_size;
 
@@ -7753,272 +7760,311 @@ static void  ble_transfer_Timer_CallBack(int data)
         cancel_recv_file(1);
     }
 }
-uint32_t OTA_FILE_value=0;
 
-errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)
+uint32_t OTA_FILE_value=0;
+errcode_t decode_ota_data(ble_read_data *buffer_handle, uint8_t *data, uint16_t datalen, uint8_t crcvalue)
 {
-    if(datalen<sizeof(msg_header_t))
+    // ====================== 入参安全校验 ======================
+    if (buffer_handle == NULL || data == NULL || datalen == 0)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] 入参无效!buffer:%p, data:%p, len:%d",
+                      buffer_handle, data, datalen);
+        return ERRCODE_FAIL;
+    }
+
+    if (datalen < sizeof(msg_header_t))
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] 数据长度不足!len:%d < header:%zu",
+                      datalen, sizeof(msg_header_t));
         return ERRCODE_FAIL;
     }
 
-    msg_header_t *header =  (msg_header_t*)data; 
+    // ====================== 解析头部 ======================
+    msg_header_t *header = (msg_header_t *)data;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] cmdtype:0x%02X, cmdid:0x%02X, pkg_len:%d, pkg_idx:%d",
+                  header->cmdtype, header->cmdid, header->package_len, header->package_index);
 
-    if(header->cmdtype!=0x06)
+    if (header->cmdtype != 0x06)
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] cmdtype 错误!非OTA命令");
         return ERRCODE_FAIL;
     }
 
-    uint8_t* data_=data+sizeof(msg_header_t);
-        //datalen-=18;
-    datalen=header->package_len;
+    uint8_t  *data_body   = data + sizeof(msg_header_t);
+    uint16_t body_len     = header->package_len;
 
-    if(header->cmdid==0x0B)
-    {   
-        //取消文件传输
-        if(Check_CRC(data_,datalen,crcvalue))
+    // ====================== cmdid 0x0B:取消传输 ======================
+    if (header->cmdid == 0x0B)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] 收到取消文件传输命令");
+
+        if (Check_CRC(data_body, body_len, crcvalue))
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] CRC校验成功,回复成功");
             cancel_recv_file(0);
-            uint8_t replydata= 1;
-            ble_reply_msgarr(6,0x0B,&replydata,1);
+            uint8_t reply = 1;
+            ble_reply_msgarr(6, 0x0B, &reply, 1);
         }
         else
         {
-             cancel_recv_file(0);
-            uint8_t replydata= 0;
-            ble_reply_msgarr(6,0x0B,&replydata,1);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] CRC校验失败,回复失败");
+            cancel_recv_file(0);
+            uint8_t reply = 0;
+            ble_reply_msgarr(6, 0x0B, &reply, 1);
         }
-
+        return ERRCODE_SUCC;
     }
-    else if(header->cmdid==0x02)
+
+    // ====================== cmdid 0x02:OTA数据传输 ======================
+    else if (header->cmdid == 0x02)
     {
+        uint32_t package_id = header->package_index;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DATA] 包序号:%d, 数据长度:%d", package_id, body_len);
 
-        uint32_t package_id=header->package_index;
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id);
-        if(Check_CRC(data_,datalen,crcvalue))
+        // CRC 校验失败
+        if (!Check_CRC(data_body, body_len, crcvalue))
         {
-        
-            if(package_id==0)
-            {
-            last_package_id=package_id;
-            if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DATA] CRC校验失败!pkg_id:%d", package_id);
+            return ERRCODE_FAIL;
+        }
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[OTA DATA] CRC校验成功");
+
+        // ====================== 第0号包:创建文件 ======================
+        if (package_id == 0)
+        {
+            last_package_id = package_id;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DATA] 收到第0包,开始创建文件");
+
+            if (buffer_handle->file_recv_stat.recv_file_stat <= 0 && buffer_handle->file_recv_stat.file == NULL)
             {
                 buffer_handle->file_recv_stat.lrcvalue = 0;
+
+                // ========== 根据文件类型创建文件 ==========
                 if (buffer_handle->file_recv_stat.file_type == 1)
                 {
-
-                    buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);
-
-
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 创建固件升级文件");
+                    buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH, "w+");
                 }
-                //音乐文件传输
                 else if (buffer_handle->file_recv_stat.file_type == 2)
                 {
-                    char musicpath[64]={0};
-                    get_music_path(musicpath,64);
-                    //"/user/userdata/music"
-                    char filepath[256]={0};
-                    create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);
-
-                    buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+                    char musicpath[64] = {0};
+                    char filepath[256] = {0};
+                    get_music_path(musicpath, sizeof(musicpath));
+                    create_mp3_name(filepath, musicpath, buffer_handle->file_recv_stat.file_name);
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 创建音乐文件: %s", filepath);
+                    buffer_handle->file_recv_stat.file = fopen(filepath, "w+");
                 }
-                //app_file
                 else if (buffer_handle->file_recv_stat.file_type == 4)
                 {
-                   char filepath[128]={0};
-                    if (get_app_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+                    char filepath[128] = {0};
+                    if (get_app_file_path(buffer_handle->file_recv_stat.file_name, strlen(buffer_handle->file_recv_stat.file_name), filepath, sizeof(filepath)) == ERRCODE_SUCC)
+                    {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 创建APP文件: %s", filepath);
+                        buffer_handle->file_recv_stat.file = fopen(filepath, "w+");
+                    }
+                    else
                     {
-                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");//?
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
-                    }else{
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
-                    }            
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 获取APP文件路径失败");
+                    }
                 }
-                //gnss文件传输
                 else if (buffer_handle->file_recv_stat.file_type == 7)
                 {
-                    char filepath[128]={0};
-                    if (get_epo_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+                    char filepath[128] = {0};
+                    if (get_epo_file_path(buffer_handle->file_recv_stat.file_name, strlen(buffer_handle->file_recv_stat.file_name), filepath, sizeof(filepath)) == ERRCODE_SUCC)
+                    {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 创建GNSS EPO文件: %s", filepath);
+                        buffer_handle->file_recv_stat.file = fopen(filepath, "w+");
+                    }
+                    else
                     {
-                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
-                    }else{
-                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 获取EPO文件路径失败");
                     }
                 }
                 else
                 {
-                    char filepath[128]={0};
-                    if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+                    char filepath[128] = {0};
+                    if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name, strlen(buffer_handle->file_recv_stat.file_name), filepath, sizeof(filepath)) == ERRCODE_SUCC)
                     {
-                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
-                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
-                    }else{
-                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
-                    }            
+                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 创建普通文件: %s", filepath);
+                        buffer_handle->file_recv_stat.file = fopen(filepath, "w+");
+                    }
+                    else
+                    {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 获取文件路径失败");
+                    }
                 }
 
-
-
+                // ========== 文件创建失败 ==========
                 if (buffer_handle->file_recv_stat.file == NULL)
                 {
-                      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file  \n");
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 文件创建失败!");
                     return ERRCODE_FAIL;
                 }
-                size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);
-                if(writtensize == datalen)
-                {
-                    timer_flie_flag=10;
-
-                    buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
-                            buffer_handle->file_recv_stat.received_size += datalen;
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);
-                    OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
-
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 文件创建成功");
 
-                }else{
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
+                // ========== 写入第0包数据 ==========
+                size_t write_len = fwrite(data_body, 1, body_len, buffer_handle->file_recv_stat.file);
+                if (write_len != body_len)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 第0包写入失败!write:%zu, need:%d", write_len, body_len);
                     return ERRCODE_FAIL;
                 }
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 第0包写入成功");
+
+                // 更新LRC、接收长度
+                buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_body, body_len, buffer_handle->file_recv_stat.lrcvalue);
+                buffer_handle->file_recv_stat.received_size += body_len;
+
+                // ====================== 修复:安全整数进度计算 ======================
+                uint32_t recv_size = buffer_handle->file_recv_stat.received_size;
+                uint32_t total_size = buffer_handle->file_recv_stat.file_size;
+                uint32_t progress = 0;
+                if(total_size > 0){
+                    progress = (recv_size * 100) / total_size;
+                }
+                OTA_FILE_value = progress;
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA PROGRESS] 进度: %lu%% (%lu/%lu)",
+                              progress, recv_size, total_size);
 
-
+                timer_flie_flag = 10;
                 buffer_handle->file_recv_stat.recv_file_stat = 1;
-                ////////////////创建文件传输超时定时器//////////////////
-                uint32_t tick;
-                osStatus_t retTimer;
-                if(BR_TRANSFER_timer!=NULL)
+
+                // ========== 创建传输超时定时器 ==========
+                if (BR_TRANSFER_timer != NULL)
                 {
                     osTimerDelete(BR_TRANSFER_timer);
                     BR_TRANSFER_timer = NULL;
                 }
-                ble_read_timer_p=buffer_handle;
-                timer_flie_flag=10;
 
+                ble_read_timer_p = buffer_handle;
                 BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);
-                tick =1000;// osMs2Tick(1000);
-                retTimer = osTimerStart(BR_TRANSFER_timer, tick);
-                if (retTimer != osOK && BR_TRANSFER_timer != NULL) {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+                if (osTimerStart(BR_TRANSFER_timer, 1000) != osOK)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA TIMER] 启动传输定时器失败");
                     osTimerDelete(BR_TRANSFER_timer);
                     BR_TRANSFER_timer = NULL;
                     return ERRCODE_FAIL;
                 }
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA TIMER] 传输定时器启动成功");
 
-                {
-                    if(buffer_handle->file_recv_stat.file_type==3)
-                    TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
-                    
-                    if(buffer_handle->file_recv_stat.file_type==1)
-                    TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
-                
-                    if(buffer_handle->file_recv_stat.file_type==2)
-                    TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+                // ========== 发布传输状态事件 ==========
+                if (buffer_handle->file_recv_stat.file_type == 1)
+                    TRANSMIT_DATA = TRANS_OTA_TRANSMITTING;
+                else if (buffer_handle->file_recv_stat.file_type == 2)
+                    TRANSMIT_DATA = TRANS_MP3_TRANSMITTING;
+                else if (buffer_handle->file_recv_stat.file_type == 3)
+                    TRANSMIT_DATA = TRANS_DIAL_TRANSMITTING;
+                else if (buffer_handle->file_recv_stat.file_type == 4)
+                    TRANSMIT_DATA = TRANS_BIN_TRANSMITTING;
+                else if (buffer_handle->file_recv_stat.file_type == 7)
+                    TRANSMIT_DATA = TRANS_EPO_TRANSMITTING;
 
-                     if(buffer_handle->file_recv_stat.file_type==4)
-                    TRANSMIT_DATA=TRANS_BIN_TRANSMITTING;
-                    
-                    //gnss文件传输
-                    if(buffer_handle->file_recv_stat.file_type==7)
-                    TRANSMIT_DATA=TRANS_EPO_TRANSMITTING;
-                    
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
-                }
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT, &TRANSMIT_DATA, 1);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA EVENT] 发布传输中事件");
             }
-            ///////////////////////////////////////////////////////////
         }
-        else if ((last_package_id+1)==package_id)
+
+        // ====================== 连续包:正常写入 ======================
+        else if ((last_package_id + 1) == package_id)
         {
-            last_package_id=package_id;
+            last_package_id = package_id;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DATA] 连续包正常接收: %d", package_id);
+
             if (buffer_handle->file_recv_stat.file == NULL)
             {
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file  \n");
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA ERROR] 文件句柄为空,无法写入");
                 return ERRCODE_FAIL;
             }
-            //写入文件
-            size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);
-            if(writtensize == datalen)
-            {
-                timer_flie_flag=10;
 
-                buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
-                        buffer_handle->file_recv_stat.received_size += datalen;
-                OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size
-                ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"OTA_FILE_value %d \n",OTA_FILE_value);
-
-            }else{
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
+            // 写入文件
+            size_t write_len = fwrite(data_body, 1, body_len, buffer_handle->file_recv_stat.file);
+            if (write_len != body_len)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FILE] 写入失败!write:%zu, need:%d", write_len, body_len);
                 return ERRCODE_FAIL;
             }
 
-            //检查文件是否写完
-            if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)
+            // 更新LRC & 进度
+            timer_flie_flag = 10;
+            buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_body, body_len, buffer_handle->file_recv_stat.lrcvalue);
+            buffer_handle->file_recv_stat.received_size += body_len;
+
+            // ====================== 修复:安全整数进度计算 ======================
+            uint32_t recv_size = buffer_handle->file_recv_stat.received_size;
+            uint32_t total_size = buffer_handle->file_recv_stat.file_size;
+            uint32_t progress = 0;
+            if(total_size > 0){
+                progress = (recv_size * 100) / total_size;
+            }
+            OTA_FILE_value = progress;
+
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA PROGRESS] 累计: %lu, 总大小: %lu, 进度: %lu%%",
+                          recv_size, total_size, progress);
+
+            // ====================== 文件接收完成 ======================
+            if (buffer_handle->file_recv_stat.received_size >= buffer_handle->file_recv_stat.file_size)
             {
-                if (buffer_handle->file_recv_stat.file!=NULL)
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA FINISH] 文件接收完成!");
+
+                // 关闭文件
+                if (buffer_handle->file_recv_stat.file != NULL)
                 {
                     fclose(buffer_handle->file_recv_stat.file);
                     buffer_handle->file_recv_stat.file = NULL;
                 }
+
+                // 释放文件名
                 if (buffer_handle->file_recv_stat.file_name != NULL)
                 {
                     free(buffer_handle->file_recv_stat.file_name);
-                    buffer_handle->file_recv_stat.file_name=NULL;
+                    buffer_handle->file_recv_stat.file_name = NULL;
                 }
-                buffer_handle->file_recv_stat.recv_file_stat = 2;
-                buffer_handle->receive_file_flag = 0;
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");
 
-                if(BR_TRANSFER_timer)
+                // 关闭定时器
+                if (BR_TRANSFER_timer != NULL)
                 {
                     osTimerStop(BR_TRANSFER_timer);
                     osTimerDelete(BR_TRANSFER_timer);
                     BR_TRANSFER_timer = NULL;
                 }
-                ble_read_timer_p=NULL;
-
-                //gnss文件传输
-                if(buffer_handle->file_recv_stat.file_type==7)
-                TRANSMIT_DATA=TRANS_EPO_TRANSMITTING;
-                else
-                TRANSMIT_DATA=FILE_IS_DONE;
-        
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                ble_read_timer_p = NULL;
 
+                // 更新状态
+                buffer_handle->file_recv_stat.recv_file_stat = 2;
+                buffer_handle->receive_file_flag = 0;
+                TRANSMIT_DATA = FILE_IS_DONE;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT, &TRANSMIT_DATA, 1);
 
-                ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功
-            }
-
-            }
-            else if (last_package_id==package_id)
-            {
-                uint32_t replydata=0xffffffff;
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n");
-                //ble_reply_msgarr(6,4,&replydata,4);
+                // 回复APP成功
+                ble_reply_cmd(OTA_FILE_SUCC_CMD, 1);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[OTA REPLY] 回复APP接收成功");
             }
-            else if (last_package_id!=package_id)
-            {
-                uint32_t replydata= last_package_id+1;
-                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n");
-                
+        }
 
-                ble_reply_msgarr(0x06,0x04,&replydata,4);
-            }
-            return ERRCODE_SUCC;
+        // ====================== 包重复 ======================
+        else if (last_package_id == package_id)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA WARN] 包重复!pkg_id:%d, last_id:%d", package_id, last_package_id);
         }
+
+        // ====================== 包丢失/乱序 ======================
         else
         {
-            return ERRCODE_FAIL;
+            uint32_t reply_pkg = last_package_id + 1;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA ERROR] 包丢失!期望:%d, 收到:%d", reply_pkg, package_id);
+            ble_reply_msgarr(0x06, 0x04, &reply_pkg, 4);
         }
+
+        return ERRCODE_SUCC;
     }
+
+    // ====================== 不支持的命令 ======================
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA DECODE] 不支持的cmdid:0x%02X", header->cmdid);
     return ERRCODE_FAIL;
 }
 
 
 
-
 errcode_t decode_ota_json(ble_read_data *buffer_handle) {
 
     if (uapi_dev_runtime_get_train_status() == 1) {
index d65da75..b07f96a 100644 (file)
@@ -1645,38 +1645,78 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     return;\r
 }\r
 \r
-errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端\r
+\r
+#define BLE_NOTIFY_MAX_RETRY_CNT    3       // 最大重试次数(原逻辑:1次+2次重试 = 共3次)\r
+#define BLE_NOTIFY_RETRY_DELAY_MS   50      // 重试间隔 50ms\r
+errcode_t svr_ble_bt_gatts_notify(uint8_t *data, uint16_t data_len) //这里是设备数据上报给app手机端\r
 {\r
+    // 1. 入参合法性校验(防止空指针崩溃)\r
+    if (data == NULL || data_len == 0)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BLE Notify] 入参无效 data:%p, len:%d", data, data_len);\r
+        return ERRCODE_INVALID_PARAM;\r
+    }\r
+\r
+    // 2. 连接状态判断\r
+    if (g_ble_conn_id == 0)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BLE Notify] 无BLE连接,conn_id=0");\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    // 3. 填充发送结构体\r
     gatts_ntf_ind_t data_info;\r
     data_info.attr_handle = g_ble_server_handle;\r
     data_info.value = data;\r
     data_info.value_len = data_len;\r
-    if (g_ble_conn_id == 0)\r
-      return 0;\r
-    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-    uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
-    if(ret!=ERRCODE_SUCC)\r
-    {\r
-        msleep(50);\r
-        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
-        if(ret!=ERRCODE_SUCC)\r
-        {\r
-            msleep(100);\r
-            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
 \r
-            uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
+    errcode_t ret = ERRCODE_FAIL;\r
+    uint8_t retry_cnt = 0;\r
 \r
-            if(ret!=ERRCODE_SUCC)\r
+    // 4. 循环重试发送(最多重试3次)\r
+    for (retry_cnt = 0; retry_cnt < BLE_NOTIFY_MAX_RETRY_CNT; retry_cnt++)\r
+    {\r
+        ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
+        // uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
+\r
+        if (ret == ERRCODE_SUCC)\r
+        {\r
+            // 发送成功\r
+            if (retry_cnt == 0)\r
             {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
-                g_ble_conn_id, g_ble_server_handle,data_len);\r
-                ble_set_ai_Answer_str("BLE NOTIF ERROR",5);\r
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[BLE Notify] 首次发送成功!len:%d", data_len);\r
             }\r
-       \r
+            else\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BLE Notify] 第%d次重试发送成功!len:%d", retry_cnt, data_len);\r
+            }\r
+            break;\r
+        }\r
+\r
+        // 发送失败,打印并延时重试\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BLE Notify] 第%d次发送失败!ret:0x%x, len:%d",\r
+                      retry_cnt + 1, ret, data_len);\r
+\r
+        // 最后一次失败不再延时\r
+        if (retry_cnt < BLE_NOTIFY_MAX_RETRY_CNT - 1)\r
+        {\r
+            msleep(BLE_NOTIFY_RETRY_DELAY_MS);\r
         }\r
     }\r
-    return ret;  \r
+\r
+    // 5. 最终全部失败处理\r
+    if (ret != ERRCODE_SUCC)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "[BLE Notify] 全部%d次发送失败!ret:0x%x, server_id:%u, conn_id:%u, handle:%u, len:%d",\r
+                      BLE_NOTIFY_MAX_RETRY_CNT, ret,\r
+                      g_ble_server_id, g_ble_conn_id, g_ble_server_handle, data_len);\r
+\r
+        // 上报异常\r
+        ble_set_ai_Answer_str("BLE NOTIF ERROR", 5);\r
+    }\r
+\r
+    return ret;\r
 }\r
 \r
 \r
index 9ccb659..d7e0256 100644 (file)
@@ -54,7 +54,7 @@ void svr_ble_adv_factory_test_start_param(void);//特殊版蓝牙广播
 void srv_ble_server_register_gap_ble_callbacks(void);
 bool ble_gatts_cmp_uuid(const bt_uuid_t *tgt_uuid, const bt_uuid_t *src_uuid);
 void srv_ble_server_register_gatt_callbacks(void);
-errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len);
+errcode_t svr_ble_bt_gatts_notify(uint8_t *data, uint16_t data_len);
 void svr_ble_adv_start(void);
 errcode_t svr_ble_adv_stop(void);
 void ble_avd_mode_change(uint8_t mode);