Переглянути джерело

网络连接程序改动,运行状态良好

CHENJIE-PC\QiXiang_CHENJIE 4 роки тому
батько
коміт
d07d333429
1 змінених файлів з 71 додано та 34 видалено
  1. 71 34
      src/app.c

+ 71 - 34
src/app.c

@@ -50,7 +50,7 @@ static UINT8                    gImsi[16] = {0};
 static INT32                    sockfd = -1;
 static UINT32                   gCellID = 0;
 int TcpconnectID = -1;
-volatile bool tcp_ready = false;
+volatile uint8_t Tcp_statuts = 0;
 
 uint8_t Batt_Cell_Num = 17;//默认数值14、17
 uint8_t Batt_Cell_Num_2 ;//默认数值
@@ -994,8 +994,8 @@ static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 pa
         {
             netif = (NmAtiNetifInfo *)param;
             if (netif->netStatus == NM_NETIF_ACTIVATED)
-                sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
-                tcp_ready = true;
+                //sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
+                Tcp_statuts = 1;
             break;
         }
     }
@@ -1141,12 +1141,19 @@ static void Tcp_Task(void* arg)
     uint32_t tau;
     uint32_t act;
     uint8_t NB_send_len;
+    uint8_t Reconnect_Num = 0;
     appSetEDRXSettingSync(0,5,0);
     appSetPSMSettingSync(1,3*60*60,10);
-
-    #ifdef USING_PRINTF
-        printf("psm:pmode-%d,tau-%d,act-%d!\n",pmode,tau,act);
-    #endif
+    slpManWakeSrc_e Wakeup_source;
+    Wakeup_source =  slpManGetWakeupSrc();//获取唤醒源
+    if(Wakeup_source==0)
+    {
+        Tcp_statuts = 0;
+    }
+    else
+    {
+        Tcp_statuts = 1;
+    }
     while(true)
     {
         switch(gProcess_Tcp_Task)
@@ -1158,57 +1165,86 @@ static void Tcp_Task(void* arg)
             }
             case PROCESS_TCP_STATE_LINK:
             {
-                if(!tcp_ready)
-                {
-                    #ifdef USING_PRINTF
-                        printf("tcp not ready!\n");
-                    #endif
-                    PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
-                }
-                else
+                #ifdef USING_PRINTF
+                    printf("TCP_statuts:%d\n",Tcp_statuts);
+                #endif
+                switch(Tcp_statuts)
                 {
-                    if(TcpconnectID<0)
+                    case 0://0代表网络为驻网前
                     {
                         #ifdef USING_PRINTF
-                            printf("Connecting...!%d\n",TcpconnectID);
+                                printf("TCP Not Ready\n");
                         #endif
+                        PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
+                        break;
+                    }
+                    case 1://1代表网络驻网
+                    {
                         if (getaddrinfo( serverip, serverport , &hints, &server_res ) != 0 )
                         {
                             #ifdef USING_PRINTF
                                 printf("TCP connect unresolved dns\n");
                             #endif
+                            // Tcp_statuts=0;
+                            // appSetCFUN(0);
+                            // osDelay(10);
+                            // appSetCFUN(1);
+                            // PSInitEventCallbackTable();
                         }
+                        Tcp_statuts=2;
+                        break;
+                    }
+                    case 2://2代表尝试建立连接
+                    {
+                        #ifdef USING_PRINTF
+                            printf("Connecting...!%d\n",TcpconnectID);
+                        #endif
                         sockfd = socket(AF_INET, SOCK_STREAM, 0);
                         if(sockfd<0)
                         {
                             #ifdef USING_PRINTF
                                 printf("socket create error\n");
                             #endif
-                        }
-                        TcpconnectID = connect(sockfd, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen);
-                        if(TcpconnectID<0 && errno != EINPROGRESS)
-                        {
-                            #ifdef USING_PRINTF
-                                printf("Connect failed!%d\n",TcpconnectID);
-                            #endif
-                            closesocket(sockfd);
-                            PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
-                            break;
+                            Tcp_statuts=1;
                         }
                         else
                         {
-                            PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_WORK);
-                            break;
+                            TcpconnectID = connect(sockfd, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen);
+                            if(TcpconnectID<0 && errno != EINPROGRESS)
+                            {
+                                #ifdef USING_PRINTF
+                                    printf("Connect failed!%d,Reconnect:%d\n",TcpconnectID,Reconnect_Num);
+                                #endif
+                                close(sockfd);
+                                Tcp_statuts=2;
+                                PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
+                                Reconnect_Num++;
+                            }
+                            else
+                            {
+                                Tcp_statuts=3;
+                                Reconnect_Num = 0;
+                            }
+                            if(Reconnect_Num>=20)
+                            {
+                                Tcp_statuts=1;
+                                Reconnect_Num = 0;
+                            }
                         }
+                        break;
+                        
                     }
-                    else 
+                    case 3://3代表连接建立成功
                     {
                         PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_WORK);
+                        break;
+                    }
+                    case 4://4代表连接断开
+                    {
+                        Tcp_statuts=2;
+                        break;
                     }
                 }
-                #ifdef USING_PRINTF
-                        printf("tcp_statuts,%d,%d!\n",tcp_ready,TcpconnectID);
-                #endif
                 break;
             }
             case PROCESS_TCP_STATE_WORK:
@@ -1271,6 +1307,7 @@ static void Tcp_Task(void* arg)
                                 closesocket(sockfd);
                                 TcpconnectID = -1;
                                 Tcp_Index=-1;
+                                Tcp_statuts = 4;
                             }
                             else
                             {
@@ -1310,6 +1347,7 @@ static void Tcp_Task(void* arg)
                                 closesocket(sockfd);
                                 TcpconnectID = -1;
                                 Tcp_Index=-1;
+                                Tcp_statuts = 4;
                             }
                             else
                             {
@@ -1331,7 +1369,6 @@ static void Tcp_Task(void* arg)
             {
                 slpManPlatVoteEnableSleep(TcpSlpHandler, SLP_SLP2_STATE); 
                 closesocket(sockfd);
-                tcp_ready = false;
                 //deregisterPSEventCallback(socketRegisterPSUrcCallback);//注销NB网络事件函数
                 #ifdef USING_PRINTF
                     printf("TCP_STATE_SLEEP\n");