增加cat1升级服务
authorhcj <1224667075@qq.com>
Sat, 25 Oct 2025 08:03:23 +0000 (16:03 +0800)
committerhcj <1224667075@qq.com>
Sat, 25 Oct 2025 08:03:23 +0000 (16:03 +0800)
code/sdk/zhihui/4g/cat1Service/CMakeLists.txt
code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c
code/sdk/zhihui/4g/cat1Service/Service/cat1_tcpServer.c
code/sdk/zhihui/4g/cat1Service/include/cat1_server.h
code/sdk/zhihui/4g/cat1Service/include/cat1_tcpServer.h

index 62ff463..691a92a 100644 (file)
@@ -9,6 +9,20 @@ set(COMPONENT_NAME "cat1Service")
 set(PUBLIC_HEADER
 )
 
+if( (BOARD_FD230 IN_LIST DEFINES ))
+    set(DEVICE_PATH fd230)
+elseif( BOARD_W9 IN_LIST DEFINES )
+    set(DEVICE_PATH w9)
+elseif( BOARD_FD272 IN_LIST DEFINES )
+    set(DEVICE_PATH fd272)
+elseif( BOARD_N9 IN_LIST DEFINES )
+    set(DEVICE_PATH n9)
+elseif( BOARD_LEINIAO IN_LIST DEFINES )
+    set(DEVICE_PATH fd230)
+else()
+    message(FATAL_ERROR "Unknown device type: please define BOARD_FD230, BOARD_W9, BOARD_FD272, BOARD_N9, or BOARD_LEINIAO")
+endif()
+
 set(PRIVATE_HEADER
 ${CMAKE_CURRENT_SOURCE_DIR}/Service
 ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include
@@ -17,6 +31,9 @@ ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/inc
 # ${ROOT_DIR}/open_source/openharmony/base/iothardware/peripheral/interfaces/inner_api
 # ${ROOT_DIR}/open_source/openharmony/base/security/huks/frameworks/huks_standard/main/crypto_engine/mbedtls/include
 # ${ROOT_DIR}/open_source/openharmony/base/security/huks/frameworks/huks_standard/main/common/include
+${ROOT_DIR}/zhihui/services/ble_service/blemoder
+${ROOT_DIR}/zhihui/services/ble_service/bleservice
+${ROOT_DIR}/application/wearable/${DEVICE_PATH}/service/broadcast/include
 )
 
 # 源文件列表
index 532200d..25328b6 100644 (file)
@@ -18,6 +18,7 @@
 #include <lwip/netdb.h>
 // #include <netinet/in.h>
 #include "lwip/inet.h"
+#include "cat1_tcpServer.h"
 
 /* Define htons function if not available */
 #ifndef htons
@@ -104,6 +105,12 @@ enum UDP_COMMAND_HEAD {
 
     UDP_MSG_SEND_VOLTE_SWITCH = 0x1A,//VOLTE开关
 
+    UDP_MSG_SEND_OTA= 0x1B,//OTA 升级
+
+    UDP_MSG_SEND_AI_ID= 0x1C,//ai设备id获取
+
+    UDP_MSG_TCP_OTA_INIT= 0x1D,//TCP ota升级
+
     UDP_MSG_WATCH_REPLY_ACK = 0xAC,//
     // UDP_MSG_WATCH_REPLY_HANGUP = 0x21,//
 };
@@ -292,7 +299,7 @@ static uint8_t PY_SRV_VER_CURRENT = 0;
 #define  PY_SRV_VER_5 "PY_SRV_V5"
 #define  PY_SRV_VER_6 "PY_SRV_V6"
 
-static uint8_t g_py_ver = 4;
+uint8_t g_py_ver = 4;
 
 
 static osTimerId_t g_timer_time_answer = NULL;
@@ -1198,6 +1205,13 @@ static void time_sync_func(void)
 #endif
     if (cat1_api_need_update_signal())        
         cat1_getsignal();
+
+    #ifdef SUPPORT_CHINA_MOBILE_AI_REGULATION
+        char device_id[128]={0};
+        get_cmai_dev_id(device_id);
+        if(strlen(device_id)<=10)
+        cat1_get_DEV_ID();
+    #endif
 }
 
 void restart_time_sync(void)
@@ -1259,6 +1273,20 @@ void send_dtmf_number_toCat1(char ch)//发送dtfm
     udp_send_msg_toCat1(UDP_MSG_SEND_DTMF_NUMBER,&ch);
 }
 
+void cat1_get_DEV_ID(void)
+{
+    cat1_print_dbg("UDP_CMD_get_DEV_ID\n");
+    udp_send_msg_toCat1(UDP_MSG_SEND_AI_ID,"0");
+}
+
+void cat1_start_tcp_ota_init(void)
+{
+    cat1_print_dbg("UDP_MSG_TCP_OTA_INIT\n");
+    udp_send_msg_toCat1(UDP_MSG_TCP_OTA_INIT,"0");
+}
+
+
+
 /**
  * @brief 发送指令给Cat1,输入 CMD_4G_T , cmd_buf 为指令所需参数.
  * @return 成功 ERRCODE_SUCC 或者其他失败ERRCODE .
@@ -1510,6 +1538,9 @@ static int udp_packet_parse(char *rx_buffer, int len)
             index = cat1_handle_sms(msg_buffer);
             // uapi_save_runtime_log(RUNTIME_LOG_CAT1_UDP_MSG_SMS);
             break;
+        case UDP_MSG_SEND_AI_ID:
+            set_cmai_dev_id(msg_buffer);
+            break;
         default:
             cat1_print_err("error message: %s\n", rx_buffer);
             index = 1;
@@ -1676,10 +1707,22 @@ errcode_t cat1_server_init(void)
     //第一次启动,要确保去除已经添加过的cat1 Vote
     restart_sleep_cat1_timer();
 #endif
+    uint8_t need_ota=0;
+    FILE *fp= fopen(CAT1_PY_IS_NEED_UDP_PATH,"rb+");
+    if(fp)
+    {
+        fread(&need_ota,sizeof(uint8_t),1,fp);
+        fclose(fp);
+        remove(CAT1_PY_IS_NEED_UDP_PATH);
+        if(need_ota>g_py_ver)
+        {
+            cat1_start_tcp_ota_init();
+            cat1_tcp_server_init();
+        }
+       
+    }
 
 
-    cat1_tcp_server_init();
-
     return ERRCODE_SUCC;
 }
 
index f98f608..302cbaa 100644 (file)
@@ -40,9 +40,13 @@ static inline u16_t htons(u16_t n)
 #include "cat1_utils.h"
 #include "cat1_tcpServer.h"
 #include "cat1_runtime.h"
+#include "bleInstruct.h"
+#include "broadcast_feature.h"
 
 #ifdef __cplusplus
+
 extern "C" {
+
 #endif /* __cplusplus */
 
 
@@ -54,14 +58,15 @@ extern "C" {
 #include "cat1_server_hal.h"
 #include "cat1_ctl.h"
 #include "tcxo.h"
-#include "cat1_utils.h"
-
-
-
+#include "custom_utils.h"
 #include "cmsis_os.h"
+#include "broadcast_feature.h"
 
 static uint8_t g_skip_cat1_service_udp_transfer = 0;
 
+uint8_t is_need_udp_updata=0;
+
+
 #define PEER_IP "172.16.1.2"
 #define PEER_PORT 5001
 #define SERVER_IP "172.16.1.5"
@@ -74,6 +79,15 @@ static uint8_t g_msg_format_type = 0;
 #else
 #define CAT1_PY_PATH "/system/cat1ota" //存放需要升级的py文件路径
 #endif
+
+
+#ifdef  SINGLE_USER_PARTITION
+#define CAT1_PY_UDP_PATH "/user/system/cat1otaudp" //存放需要升级的py文件路径
+#else
+#define CAT1_PY_UDP_PATH "/system/cat1otaudp" //存放需要升级的py文件路径
+#endif
+
+
 #define CAT1_REPLYA_FILE_SIZE_FUN 1  //是否需要CAT1回复文件大小一致传输完单个文件是否与SIZE大小匹配比较
 static osTimerId_t file_transfer_timer=NULL;
 static uint8_t timerOut_count = 0;
@@ -116,6 +130,9 @@ struct tcp_msg_old_t {
 };
 #pragma pack(pop)
 
+#include "cmsis_os2.h"
+extern osStatus_t osDelay(uint32_t ticks);
+#define cat1_msleep(ms) osDelay(ms) /* osDelay(1) : 1ms */
 
 static int g_listen_sock = 0;
 struct sockaddr_in filesourceAddr = {0};
@@ -164,7 +181,7 @@ static int pack_tlv_format(char *tx_buffer,uint8_t mode,uint8_t cmd, char *conte
 {
     
     int content_length = (int)strlen(content);
-    if(content_length > MAX_TCP_MSG_BUFFER_LEN || content == NULL)
+        if(content_length > MAX_TCP_MSG_BUFFER_LEN || content == NULL)
     {
         printf("content data error: content_length %d %s\r\n",content_length,content);
         return -1;
@@ -193,7 +210,11 @@ static void udp_send_response(char *tx_buffer,uint8_t mode, uint8_t cmd, char *c
     // printf("msg_format_type %d  \n",g_msg_format_type,len);
     int err = 0;
     if( len > 0 ) {
+
         err = sendto(g_listen_sock, tx_buffer, len, 0, (struct sockaddr *)&filesourceAddr, sizeof(filesourceAddr));
+        // err=send(g_listen_sock,tx_buffer,len,0);
+        cat1_msleep(10);
+        cat1_print_err("udp_send_response\n");
         if (err < 0) {
             cat1_print_err("Error occured during sending: errno %d\n", errno);
                }
@@ -209,6 +230,9 @@ void ble_tcp_send_msg_toCat1(uint8_t mode,uint8_t cmd,char *content)
         cat1_print_err("Error cat1 poweroff tcp skipp send data\n");
         return ;
     }
+    printf("ble_tcp_send_msg_toCat1 1\r\n");
+
+    cat1_api_wakeup_cat1(1);
     // uart_port_register_irq(UART_BUS_0);
     osal_irq_enable(UART_1_IRQN);
 
@@ -217,11 +241,15 @@ void ble_tcp_send_msg_toCat1(uint8_t mode,uint8_t cmd,char *content)
         cat1_print_err(" g_skip_cat1_service_udp_transfer \n");
         return ;
     }
-    char station_tx_buffer[MAX_TCP_MSG_BUFFER_LEN] = {0};
+    char *station_tx_buffer=(char*)malloc(MAX_TCP_MSG_BUFFER_LEN);
     if( filesourceAddr.sin_port != 0 ) {
         
         udp_send_response(station_tx_buffer,mode,cmd, content);
+        cat1_print_err("ble_tcp_send_msg_toCat1 2\n");
     }
+    free(station_tx_buffer);
+
+    cat1_api_wakeup_cat1(0);
 }
 
 
@@ -306,10 +334,12 @@ void cat1_ota_send_data(uint8_t Code,char *fileName,uint32_t fileSize,char *data
             cJSON_AddNumberToObject(dataJSON,"Code",CAT1_TCP_START_SEND_FILE_DATA);
             cJSON_AddStringToObject(dataJSON,"data",(char *)data); // FE 头 0012c 文件长度 + data+crc
             json_format = cJSON_PrintUnformatted(dataJSON);
-            // printf("start cat1_ota_send_data json_format:%s %d\r\n",data,strlen(data));
+            printf("start cat1_ota_send_data json_format:%s %d\r\n",data,strlen(data));
             cJSON_Delete(dataJSON);
             printf("cat1_ota_send_data two:\r\n");
             ble_tcp_send_msg_toCat1(FILE_TRANSFER_CMD,0,json_format);
+            // if(json_format)
+            printf("free json_format \r\n");
             cJSON_free(json_format);
             break;
         // case CAT1_TCP_START_OTA_FAILE: //OTA失败
@@ -407,10 +437,12 @@ static void stop_cat1_ota(void){ //停止 CAT1 ota 清标识
         }
     }
     if(fp != NULL){ //防止打开文件没有关闭
-        printf("file is not close!\r\n");
+        printf("file is not lwip_close!\r\n");
         fclose(fp);
         fp = NULL;
     }
+
+    cat1_api_wakeup_cat1(0);
 }
 
 static void  cat1_file_Timer_CallBack(int data_tmp)
@@ -486,16 +518,16 @@ void read_dir(void){
         // 跳过'.'和'..'目录
         if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
             printf("%s\n", entry->d_name); // 输出文件名
-            // std::string filename= entry->d_name;
-            // //0 1 2
-            // if(filename=="Cat1pyVersion.txt" 
-            // || filename=="main.py"
-            // || filename=="main_init.py" 
-            // || filename=="tcpService.py")
-            // {
-            //     printf("屏蔽升级文件 %s\n",filename.c_str());
-            //     continue;
-            // }
+        //    entry->d_name;
+            //0 1 2
+            if(strcmp("Cat1pyVersion.txt",entry->d_name)==0 
+            || strcmp("main.py",entry->d_name)==0 
+            || strcmp("main_init.py",entry->d_name)==0 
+            || strcmp("tcpService.py",entry->d_name)==0 )
+            {
+                printf("屏蔽升级文件 %s\n",entry->d_name);
+                continue;
+            }
 
             fileNameList[file_count] = (char *)malloc(DEFAULT_MAX_FILE_NAME_SIZE * sizeof(char));
             if (fileNameList[file_count] == NULL) {
@@ -530,6 +562,56 @@ void read_dir(void){
     }
 }
 
+void read_UDP_dir(void){
+    
+    for (int i = 0; i < DEFAULT_MAX_FILE_COUNT; i++) { //释放内存
+        if(fileNameList[i] != NULL){
+            free(fileNameList[i]);
+            fileNameList[i] = NULL;
+        }
+    }
+
+    file_count = 0;
+
+    printf("fileNameList[file_count]\r\n");
+
+    for(int i=0;i<5;i++)
+    {
+        fileNameList[file_count] = (char *)malloc(DEFAULT_MAX_FILE_NAME_SIZE * sizeof(char));
+
+        if(i==0)
+        snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","telecom_dmp.py");
+        else if (i==1)
+        snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","china_mobile_dmp.py");
+        else if (i==2)
+        snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","cat1Service.py");
+        else if (i==3)
+        snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","tcpserver.py");
+        else
+        snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","main.py");
+
+        printf("fileNameList[file_count] %s\r\n",fileNameList[file_count]);
+        file_count+=1;
+    }
+            
+    send_dir_info();
+    noreplayCount = 0;
+    uint32_t tick;
+    osStatus_t retTimer;
+    if(file_transfer_timer == NULL){
+        file_transfer_timer = osTimerNew((osTimerFunc_t)cat1_file_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+        tick = 1000;// osMs2Tick(1000);
+        retTimer = osTimerStart(file_transfer_timer, tick);
+        if (retTimer != osOK && file_transfer_timer != NULL) {
+            cat1_print_err("StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+            osTimerDelete(file_transfer_timer);
+            file_transfer_timer = NULL;
+        }
+    }
+
+}
+
+
 void send_curfile_info_data(void)
 {
     cat1_ota_flag = CAT1_TCP_START_SEND_SINGLE_FILE_INFO;
@@ -539,6 +621,9 @@ void send_curfile_info_data(void)
         if(strlen(fileNameList[curfilecount]) != 0 && filesize != 0){
             char file_path[DEFAULT_MAX_FILE_NAME_SIZE]={0};
             memset(file_path,0,DEFAULT_MAX_FILE_NAME_SIZE);
+            if(is_need_udp_updata)
+            sprintf_s(file_path,DEFAULT_MAX_FILE_NAME_SIZE,"%s/%s",CAT1_PY_UDP_PATH,fileNameList[curfilecount]);
+            else
             sprintf_s(file_path,DEFAULT_MAX_FILE_NAME_SIZE,"%s/%s",CAT1_PY_PATH,fileNameList[curfilecount]);
             if(fp != NULL){
                 fclose(fp);
@@ -587,6 +672,10 @@ void read_file_info_data(void){
             struct dirent *entry;
             char file_path[DEFAULT_MAX_FILE_NAME_SIZE]={0};
             memset(file_path,0,DEFAULT_MAX_FILE_NAME_SIZE);
+
+            if(is_need_udp_updata)
+            sprintf_s(file_path,DEFAULT_MAX_FILE_NAME_SIZE,"%s/%s",CAT1_PY_UDP_PATH,fileNameList[curfilecount]);
+            else
             sprintf_s(file_path,DEFAULT_MAX_FILE_NAME_SIZE,"%s/%s",CAT1_PY_PATH,fileNameList[curfilecount]);
             
             count+=1;
@@ -682,6 +771,10 @@ void send_data_case(uint8_t mode){
     switch (mode)
     {
         case READ_DIR_INFO: //读文件目录信息
+            printf("READ_DIR_INFO\r\n");
+            if(is_need_udp_updata)
+            read_UDP_dir();
+            else
             read_dir();
             break;
         case READ_FILE_DATA_INFO://收到CAT1回复开始发送文件信息
@@ -706,6 +799,12 @@ void send_data_case(uint8_t mode){
 void start_cat1_ota(void){
     stop_cat1_ota();
     send_data_case(READ_DIR_INFO); //开始OTA 就开始升级py文件
+
+    uint8_t TRANSMIT_DATA=START_CAT1_OTA;
+                    
+    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+    cat1_api_wakeup_cat1(1);
 }
 void Cat1_OTA(uint8_t ota_state)
 {    
@@ -866,6 +965,9 @@ static int udp_packet_parse(char *rx_buffer, int len)
     {
         return 0;
     } 
+    uint8_t shutdowflag = 1;//重启
+    uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL;
+
     switch (cmd)
     {
         case CAT1_REPLAY_CREAT_DIR_FAILE: //cat1:创建临时文件夹失败
@@ -875,6 +977,7 @@ static int udp_packet_parse(char *rx_buffer, int len)
             creat_file_err+=1;
             if(creat_file_err >= FAILE_COUNT){ //创建十次都出错不创建结束当前的升级
                 creat_file_err=0;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
                 stop_cat1_ota();
                 break;
             }
@@ -904,6 +1007,7 @@ static int udp_packet_parse(char *rx_buffer, int len)
             if(write_data_err >= FAILE_COUNT){
                 write_data_err = 0;
                 stop_cat1_ota();
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
                 break;
             }
             printf("CAT1_REPLAY_WRITE_FILE_ERROR! %d",cmd);
@@ -916,6 +1020,8 @@ static int udp_packet_parse(char *rx_buffer, int len)
             data_crc_err+=1;
             if(data_crc_err >= FAILE_COUNT){ //连续十次CRC都出错就结束进程
                 data_crc_err = 0;
+                uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
                 stop_cat1_ota();
                 break;
             }
@@ -937,16 +1043,22 @@ static int udp_packet_parse(char *rx_buffer, int len)
             if(creat_file_err >= FAILE_COUNT){
                 creat_file_err = 0;
                 stop_cat1_ota();
+                uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
                 break;
             }
             send_data_case(CREAT_FILE_FAILE);
             break;
         case CAT1_REPLAY_OTA_SUCC: //ota 成功失败与否 收到CAT1的回复就停止计时器
             stop_cat1_ota();
+            //成功直接重启
+            CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag));
             //添加GUI
             break;
         case CAT1_REPLAY_OTA_FALIE:
+   
             stop_cat1_ota();
+
             break;
         case CAT1_REPLAY_FILE_SIZE_OK: //文件大小发送和接收的一致
             read_file_info_data();
@@ -956,6 +1068,7 @@ static int udp_packet_parse(char *rx_buffer, int len)
             if(file_size_err >= FAILE_COUNT){
                 file_size_err = 0;
                 stop_cat1_ota();
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
                 break;
             }
             send_curfile_info_data();
@@ -1006,9 +1119,67 @@ static int udp_socket_file_init()
 
     return listen_sock;
 }
-#include "cmsis_os2.h"
-extern osStatus_t osDelay(uint32_t ticks);
-#define cat1_msleep(ms) osDelay(ms) /* osDelay(1) : 1ms */
+
+static int tcp_socket_file_init()
+{
+    int addr_family;
+    int ip_protocol;
+    int opt = 1;
+    struct sockaddr_in destAddr;
+    char addr_str[128];
+
+    // destAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+    destAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
+    destAddr.sin_family = AF_INET;
+    destAddr.sin_port = htons(PORT);
+    addr_family = AF_INET;
+    ip_protocol = IPPROTO_IP;
+    inet_ntoa_r(destAddr.sin_addr, addr_str, sizeof(addr_str) - 1);
+
+    int listen_sock = socket(addr_family, SOCK_STREAM, ip_protocol);
+    if (listen_sock < 0) {
+        cat1_print_err("Unable to create socket: errno %d\n", errno);
+        return -1;
+    }
+    // setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
+    //  setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
+    
+    filesourceAddr.sin_addr.s_addr = inet_addr(PEER_IP);
+    filesourceAddr.sin_family = AF_INET;
+    filesourceAddr.sin_port = htons(PEER_PORT);
+
+    return listen_sock;
+}
+
+
+void re_connect(void)
+{
+    // socklen_t addrLen = sizeof(filesourceAddr);
+    // lwip_close(g_listen_sock);
+    // // while (1)
+    // {
+    //     int connret=connect(g_listen_sock, (struct sockaddr *)&filesourceAddr,addrLen);
+    //     cat1_print_err("Unable to connect: errno %d\n", errno);
+    //     if(connret=0)
+    //     {
+    //         cat1_print_err("connect succ\n");
+    //         // break;
+    //     }
+    //     else
+    //     {
+    //         cat1_msleep(1000);
+    //         cat1_print_err("connecting...\n");
+    //     }
+    // }
+    remove(CAT1_PY_IS_NEED_UDP_PATH);
+    cat1_print_err("CAT1_PY_IS_NEED_UDP_PATH\n");
+}
+
+uint8_t errno_count=0;
+static uint8_t IS_need_ota=1;
+extern uint8_t g_py_ver;
+
+
 void cat1_server_file_task(void *pvParameters)
 {
     char rx_buffer[512];
@@ -1016,13 +1187,85 @@ void cat1_server_file_task(void *pvParameters)
     int index;
     socklen_t addrLen = sizeof(filesourceAddr);
     while (1) {
-        if( g_listen_sock > 0 ) close(g_listen_sock);
-        g_listen_sock = udp_socket_file_init();
-        if( g_listen_sock < 0 ) {
-            cat1_print_err("socket init fail and retry\n");
-            // vTaskDelay(1000/portTICK_RATE_MS);
+        if(errno_count>10)
+        {
+            //如果失败太多次将退出循环,避免浪费系统资源
+            // return;
+            cat1_print_err("errno count %d\n",errno_count);
+        }
+        if( g_listen_sock > 0 ) 
+        {
+            cat1_print_err("lwip_close(g_listen_sock)\n");
+            lwip_close(g_listen_sock);
+        }
+
+        if(is_need_udp_updata==0)
+        {
+            g_listen_sock = tcp_socket_file_init();
+            if( g_listen_sock < 0 ) {
+                cat1_print_err("socket init fail and retry\n");
+                // vTaskDelay(1000/portTICK_RATE_MS);
+                errno_count++;
+                cat1_msleep(1000);
+                continue;
+            }
             cat1_msleep(1000);
-            continue;
+            int connret=connect(g_listen_sock, (struct sockaddr *)&filesourceAddr,addrLen);
+            if(connret>=0)
+            {
+                cat1_print_err("connect succ\n");
+            }
+            else
+            {
+                cat1_msleep(1000);
+                cat1_print_err("Unable to connect: errno %d\n", errno);
+                cat1_print_err("connecting...\n");
+                errno_count++;
+                continue;
+            }
+        }
+        else
+        {
+            g_listen_sock = udp_socket_file_init();
+            if( g_listen_sock < 0 ) {
+                cat1_print_err("socket init fail and retry\n");
+                // vTaskDelay(1000/portTICK_RATE_MS);
+                cat1_msleep(1000);
+                errno_count++;
+                continue;
+            }
+        }
+    
+        errno_count=0;
+
+        if(IS_need_ota)
+        {
+            IS_need_ota=0;
+            if(g_py_ver==16)
+            {
+                uint8_t TRANSMIT_DATA=IS_NEED_CAT1_OTA;
+                    
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+            }
+            else if(g_py_ver==17)
+            {
+                Cat1_OTA(CAT1_TCP_START_OTA);
+            }
+            else if(g_py_ver==18)
+            {
+                uint8_t TRANSMIT_DATA=IS_NEED_CAT1_OTA;
+                    
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+            }
+            else if (g_py_ver>=19 && (uapi_dev_runtime_get_cat1_networkstat()) )
+            {
+                char * cat1_modemver = uapi_dev_runtime_get_cat1_modemver();
+
+                // star_http_ota_updata(cat1_modemver ,g_py_ver);
+                
+               
+            }
+            
         }
         
         while (1) {
@@ -1066,6 +1309,8 @@ void cat1_server_file_task(void *pvParameters)
 #define CAT1_SERVICE_TASK_SIZE       (0x800*5)
 #define CAT1_SERVICE_TASK_PRIO       5
 
+
+
 errcode_t cat1_tcp_server_init(void)
 {
     cat1_print_info("cat1_tcp_server_init !\r\n");
@@ -1076,8 +1321,14 @@ errcode_t cat1_tcp_server_init(void)
     taskcfg.attr.stack_size = CAT1_SERVICE_TASK_SIZE;
     taskcfg.func = cat1_server_file_task;
     taskcfg.use_mem = USE_EXTEND_MEM;
-    
-    errcode_t ret=cat1_create_osThread_custom(&taskcfg);
+  
+    if(g_py_ver<=16)
+    {
+        is_need_udp_updata=1;
+    }
+    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+
+
     if(ret != ERRCODE_SUCC)
     {
         cat1_print_err("create cat1_service_file failed %d!\r\n",ret);
@@ -1086,6 +1337,31 @@ errcode_t cat1_tcp_server_init(void)
     return ERRCODE_SUCC;
 }
 
+char* xor_encrypt_decrypt(const char* message, const char* key) {
+    if (message == NULL || key == NULL) {
+        return NULL;
+    }
+
+    size_t message_len = strlen(message);
+    size_t key_len = strlen(key);
+
+    // 分配内存用于存储结果
+    char* result = (char*)malloc(message_len + 1);
+    if (result == NULL) {
+        return NULL; // 内存分配失败
+    }
+
+    // 执行 XOR 操作
+    for (size_t i = 0; i < message_len; ++i) {
+        result[i] = message[i] ^ key[i % key_len];
+    }
+    result[message_len] = '\0'; // 确保字符串以 null 结尾
+
+    return result;
+}
+
+
+
 #ifdef __cplusplus
 
 }
index 80e9094..f3df815 100644 (file)
@@ -45,6 +45,7 @@ uint8_t get_call_hungup_flag(void);
 uint8_t set_call_hungup_flag(uint8_t data);
 
 void cat1_call_hungup_timer(void);
+void cat1_start_tcp_ota_init(void);
 
 #ifdef __cplusplus
 }
index 032268f..ef0e7e9 100644 (file)
@@ -77,6 +77,14 @@ void cat1_ota_send_data(uint8_t Code,char *fileName,uint32_t fileSize,char *data
 void Cat1_OTA(uint8_t ota_state);
 //获取CAT1 OTA升级状态 返回 CAT1_TCP_STOP_OTA 不在升级状态 其他在升级状态中
 uint8_t Get_Cat1_OTA_Flag(void);
+
+#ifdef  SINGLE_USER_PARTITION
+#define CAT1_PY_IS_NEED_UDP_PATH "/user/system/cat1otaudp/is_need_updata.txt" //存放需要升级的py文件路径
+#else
+#define CAT1_PY_IS_NEED_UDP_PATH "/system/cat1otaudp/is_need_updata.txt" //存放需要升级的py文件路径
+#endif
+
+
 #ifdef __cplusplus
 #if __cplusplus
 }