STM32 EC200 物联网项目实操 第2篇 FTP OTA升级

 背景:

做了个物联网项目,需要做个OTA升级,程序分为两部分,一部分是BOOT引导程序,一部是主程序,在BOOT引导程序里面实现了和EC200 4G模块通讯,和FTP服务器通讯,获取OTA升级BIN文件。主程序里有和服务器通讯并获取服务器下发的OTA升级指令功能。

摘要:

记录了STM32F0系统单片机 BOOT引导程序通过4G模块进行OTA升级的实操过程  

使用EC200 4G物联网模块,使用MD5算法校验OTA升级文件正确性。BOOT实现了FTP服务器OTA bin文件获取,跳转APP主程序的功能。

运行开发环境介绍

硬件环境

STM32F091CBT6

J-LINK  V11

软件开发环境

IAR 8.32.1 

VSCODE 

STM32 CUBE

软件支持包ST HAL库
4G模块        EC200N-CN

具体实现

STM32内部FLASH分配

程序运行流程:

BOOT程序读取EEPROM芯片中存储的OTA结构体变量信息。

需要OTA的话,则连接OTA信息结构体中读取FTP服务器URL和用户名和密码

访问FTP服务器,读取升级BIN文件到本地EEPROM,然后计算MD5值,判断MD5值是否和OTA信息结构体中的一样,如果一样则将BIN文件写入到STM32内部FLASH中,然后执行IAP跳转,程序跳转到主程序执行。

程序运行流程图:

OTA信息包是在主程序中,由服务器下发给单片机的,校验后存储在EEPROM芯片中

部分代码:

 main.c程序代码:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *             
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "iwdg.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stm32f0xx_hal.h"
#include "EC200N.h"

// #include "RN8302_Drv.h"
// #include "SEGGER_RTT.h"
// #include "CloudDataProtocol.h"
#include "publics.h"
#include "data.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t      g_u16_CMD       = 0xff;


float         g_f_tempvalue   = 30.0f;
float         g_f_test        = 220.0f;

uint8_t       gu8_Sta =0;

uint8_t       gu8_temp=0;
uint8_t       gu8_index=0;



/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/
  
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  
  /* USER CODE END SysInit */
  
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_IWDG_Init();
  MX_USART1_UART_Init();
  MX_USART4_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //HAL_GPIO_WritePin(GPIOB,MCU_RST_8302B_Pin,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(RESET_4G_GPIO_Port,RESET_4G_Pin,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(POWERKEY_4G_GPIO_Port,POWERKEY_4G_Pin,GPIO_PIN_RESET);

  HAL_GPIO_WritePin(POWERKEY_4G_GPIO_Port,POWERKEY_4G_Pin,GPIO_PIN_SET);
       
  HAL_Delay(500); 
  MX_FEED_IWDG();
  HAL_Delay(500); 
  MX_FEED_IWDG();  
  HAL_Delay(500); 
  MX_FEED_IWDG();
  HAL_Delay(500); 
  MX_FEED_IWDG();    
  

  SEGGER_RTT_Init();
  Sys_BaseTimeInit();
  DEBUG_printf(DEBUG_UART,"BOOT starting\r\n");
  DEBUG_printf(DEBUG_UART,"BOOT read stBoot2\r\n");  

  DEBUG_printf(DEBUG_UART,"BOOT _SystemParameters_TypeDef size = %d\r\n",sizeof(_SystemParameters_TypeDef));  
  DEBUG_printf(DEBUG_UART,"BOOT _MTRInitParmType_Def      size = %d\r\n",sizeof(_MTRInitParmType_Def));    
  DEBUG_printf(DEBUG_UART,"BOOT _Boot2StatusType_Def      size = %d\r\n",sizeof(_Boot2StatusType_Def));      
  
  
  // gs_TCPRecInfoOTA.u16_FLG = M_SYS_OTA_FLA;
  // FRAM_Write(Sys_OTAParmAddr,&gs_TCPRecInfoOTA,sizeof(_TcpRecvCMDInfo_OTA));      
  
  FRAM_Read(&stBoot2, Sys_BOOT2ParmAddr, sizeof(_Boot2StatusType_Def));
  FRAM_Read(&stBoot2_temp, Sys_BOOT2ParmAddr, sizeof(_Boot2StatusType_Def));  

  gu8_Sta = F_CMP_DATA(&stBoot2,&stBoot2_temp,sizeof(_Boot2StatusType_Def));
  
  if( SUCCESS!=gu8_Sta)
  {
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2  != stBoot2_temp \r\n");    
  }


  
  if( M_SYS_OTA_FLA  == stBoot2.u16_FLG)
  {
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_FLG %x\r\n",stBoot2.u16_FLG);       
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 is valid\r\n");  
      
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 FilePath %s\r\n",stBoot2.FilePath);  
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 ServerDMN %s\r\n",stBoot2.ServerDMN);  
      
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 FileName %s\r\n",stBoot2.FileName);          
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 UserName %s\r\n",stBoot2.UserName);         
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 PassWord %s\r\n",stBoot2.PassWord);       
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 Md5Value %s\r\n",stBoot2.Md5Value);                                         
      
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_OTA_URL_LEN %d\r\n",gs_TCPRecInfoOTA.u16_OTA_URL_LEN);             
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 ucA_OTA_URL %s\r\n",gs_TCPRecInfoOTA.ucA_OTA_URL);   
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_OTA_MD5_LEN %d\r\n",gs_TCPRecInfoOTA.u16_OTA_URL_LEN);             
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 ucA_FILE_MD5 %s\r\n",gs_TCPRecInfoOTA.ucA_FILE_MD5);    

      APP_EC20Link_Init();

      gs_DecCmd.SysCmd = M_OTA_NEED_UP;
  }
  else
  {
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_FLG %x\r\n",stBoot2.u16_FLG);            
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 is invalid\r\n");        
      gs_DecCmd.SysCmd = M_OTA_JUMP;
  }
  
  //QUEUE_StructCreate(&UpMachComCmdQue,(uint8_t *)UpMachComBuffer,sizeof(UpMachComBuffer),sizeof(_UpComCmdDataPacket));
  
  // F_DataSYNInit();
  // ReadRn8002CalREGData();
  
  

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 2);//huart1��Ҫ������������޸�?
    Sys_BaseTimeUpdate();
    if(gu8_debug)
    {
        MX_FEED_IWDG();   
    }
    
    if( g_SysBaseTime.f200ms ==1 )
    {
        HAL_GPIO_TogglePin(GPIOB,LED_PCB_Pin);
      //(DEBUG_RTT,"DEBUG_printf %d\r\n",Sys_GetSec());      
    }
    
    if( M_OTA_NEED_UP  ==  gs_DecCmd.SysCmd)
    {
        if( g_SysBaseTime.f200ms ==1 )
        {
            F_EC200N_RecvDatStaHandle(&g_u16_EC20CMD,&g_u16_EC20_STA);  
            F_APP_EC200N(&g_u16_EC20CMD,&g_u16_EC20_STA);              
        }
    }
    else if( M_OTA_JUMP  ==  gs_DecCmd.SysCmd)
    {
        APP_UpGrade_JumpOut();
    }
    else
    {

    }
    
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 2);//huart1
    return ch;    
}

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
    
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 程序跳转的实现:

#include "Upgrade.h"

_IapFunc_Def Jump2Sector;
/******************************************************************************
* Name		: APP_UpGrade_JumpOut
* brief		: This function is used to quit the boot.
* param		: None
* retval	: BSP status
*******************************************************************************/
FuncState APP_UpGrade_JumpOut(void)
{
	FuncState ret = FAIL;
	static uint32_t u32UPDTiming = 0;
	
	// if((TRUE == stUPDJumpFlag)
	// && (TRUE == InitFlag)
	// && (0 == stBoot.UPD_ATRB.ErrCode)
	// &&((1 == u8WifiUpdataInit)
	// ||(0xff == u8WifiUpdataInit))
	// &&(1 == g_u8SendFlag)
	// )
	{
		u32UPDTiming++;
		if(UPGRADE_REBOOT_CNTDOWN <= u32UPDTiming)
		{
			//APP_UpGrade_StartUpBeep(0x000FFFFF);
			
			//BSP_DeInit();
                        BSP_UART_DeInit();
			
			MX_FEED_IWDG();		
			/* 屏蔽所有中断,防止在跳转过程中,中断干扰出现异常 */
			__disable_irq();	
			
			Jump2Sector = (_IapFunc_Def)*(uint32_t*)(APP_ADDR + 4);
			__set_MSP(*(__IO uint32_t*)(APP_ADDR));
			Jump2Sector();
			while(1)
			{
				u32UPDTiming++;
			}
		}
	}
	
	// else
	// {
	// 	u32UPDTiming = 0;
	// }
	
	return ret;
}





#ifndef _UPGRADE_H_
#define _UPGRADE_H_
//#include "data.h"
#include "publics.h"


#define UPGRADE_REBOOT_CNTDOWN 200 

typedef void(*_IapFunc_Def)(void);




FuncState APP_UpGrade_JumpOut(void);

#endif

EC200N.c

#include "publics.h"
//#include "EC200N.H"
#include "usart.h"
#include "iwdg.h"


static ValueState st_EC20RecvCmd;
static ValueState st_EC20RestCmd;
static ValueState st_EC20DownloadCmd;

static uint32_t m_u8_EC20SendLenth;
static uint32_t m_u8_EC20RecvLenth;

_ProcVariableAllType_Def        st_EC20LinkVar;






uint16_t gu16_SendLen =0;
char Sendbuf[EC20_SEND_BUFF_SIZE];
//uint8_t RecvBuf[EC20_SEND_BUFF_SIZE];

uint32_t  g32_NowSec  = 0;
uint32_t  g32_LastSec = 0;
uint32_t  g32_DiffSec = 0;

_TcpRecvCMDInfo_OTA             gs_TCPRecInfoOTA;

_Boot2StatusType_Def            stBoot2;
_Boot2StatusType_Def            stBoot2_temp;

ErrorStatus F_OpenEC200N(void)
{
    //GPIO操作
    return 0;
}

// char PalodTest[50] ="{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"Reg1":19.5}}";

// ErrorStatus F_TestEC200N(uint8_t *cmd)
// {
//     // scanf("%s",buf);
    
//     uint8_t lu8_cmd =0;
//     lu8_cmd = (uint8_t)(*cmd);
//     memset(&Sendbuf[0],0x00,sizeof(Sendbuf));
//     // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
    
//     switch (lu8_cmd)
//     {
//     case 0:
//         return 1;
//         break;
//     case 1:
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT");  
//         break;
//     case 2:
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");  
//         break;       
//     case 3://查询SIM卡
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
//         break;      
//     case 4://查询信号,31最大,小于10证明信号超级不好
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");  
//         break;      
//     case 5://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");  
//         break;         
//     case 6://附着网络是否成功
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");  
//         break;    
//     case 7://设置数据格式
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");  
//         break;   

//     case 8://打开工业物联网云端口
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");  
//         break;   
    
//     case 9://这步执行成功后,设备应该在线了。
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\"");  
//         break;          
//     case 10://发送数据命令
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");  
//         gu16_SendLen = strlen(Sendbuf);
//         MX_FEED_IWDG();   
//         HAL_UART_Transmit(&hUART_4G, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改
//         MX_FEED_IWDG();   
//         MX_FEED_IWDG(); 
//         HAL_Delay(800);  
        
//         memset(&Sendbuf[0],0x00,sizeof(Sendbuf));
//         sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");   
//         gu16_SendLen = strlen(Sendbuf);        
//         HAL_UART_Transmit(&hUART_4G, (uint8_t *)&Sendbuf,87, 0xffff);//huart1需要根据你的配置修改
//         (*cmd) = 0;           
//         return 1;
//         break;    

//     case 11://Paload数据
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");  
//         break;      

//     case 20://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0");  
//         break;    
        
//     case 21://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=1");  
//         break;   

//     case 22://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=2");  
//         break;   

//     case 23://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=3");  
//         break;           
        
//     case 24://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=4");  
//         break;    

//     case 25://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=5");  
//         break;  

//     case 26://清除链接
//         /* code */
//         // F_DataPacking_SUNKUN_1(); 
//         break;          
                        
//     default:
//         break;
//     }       
    
//     MX_FEED_IWDG();   
//     HAL_UART_Transmit(&hUART_4G, (uint8_t *)&Sendbuf,86, 0xffff);//huart1需要根据你的配置修改
//     (*cmd) = 0;        
// }

/*
    M_4G_IDLE   
    M_AT_TESTING   
    M_AT_TEST_OK 
    M_AT_TEST_ERR
    M_SIM_CHECKING
    M_SIM_CHECK_OK
    M_SIM_CHECK_ERR
    M_CSQ_CHECKING
    M_CSQ_CHECK_OK
    M_CGREG_CHECKING
    M_CGREG_CHECK_OK
    M_CGREG_CHECK_ERR
    M_CGATT_CHECKING
    M_CGATT_CHECK_OK
    M_CGATT_CHECK_ERR
    M_QMTCFG_SETTING
    M_QMTCFG_SET_OK
    M_QMTCFG_SET_ERR
    M_QMTOPEN_OPENING
    M_QMTOPEN_OPEN_OK
    M_QMTOPEN_OPEN_ERR

    M_QMTCONN_CONNING
    M_QMTCONN_CONN_OK
    M_QMTCONN_CONN_ERR   

    M_QMTPUBEX_PUBING
    M_QMTPUBEX_PUB_OK
    M_QMTPUBEX_PUB_ERR        

*/

#define M_MIN_TCP_DP_LEN 20
#define M_CommSecRecvBufLen  1024



uint32_t u32cnt= 0;

//  m_u8_EC20RecvBuff     替换位  ArryBuf  
uint8_t  m_u8_EC20RecvBuff[EC20_RECV_BUFF_SIZE]= {0};
enum_4G_CMD gLastCMD = 0;
enum_4G_CMD gSavedLastCMD = 0;  //可手动保存一下CMD状态 等着跳回时使用
enum_4G_CMD gLastSTA = 0;
enum_4G_CMD gSavedLastSTA = 0;  //可手动保存一下STA状态 等着跳回时使用

uint8_t     gu8_TCPDirTransfMode = 0; //1为透传模式  

// typedef struct
// {    
//     uint32_t u32_RcvLen ;         // 总的TCP  len长度  
//     uint32_t u32_RcvIdleLen;     // TCP 接收二级缓存 空余的长度  
//     uint32_t u32_UsedLen ;        //有效的TCP  DP len 长度  从HEADER头开始的长度
//     int      i32_HeaderIndex ;     //查找到的TCP通讯header的索引ID    
//     uint32_t gu32_EndIndex ;       //查找到的TCP通讯末尾+1的索引ID 
//     uint8_t  gu8ParseSta;         //1 第一阶段 寻找到了包头 接下来找    
// }_CommRecvVar;  

_CommRecvVar    gs_TCPCOMM;

// uint32_t gu32_TCPRcvLen =0;         // 总的TCP  len长度  
// uint32_t gu32_TCPRcvIdleLen =0;     // TCP 接收二级缓存 空余的长度  
// uint32_t gu32_TCPUsedLen =0;        //有效的TCP  DP len 长度  从HEADER头开始的长度
// int      g32_TCPHeaderIndex =0;     //查找到的TCP通讯header的索引ID    
// uint32_t gu32_TCPEndIndex =0;       //查找到的TCP通讯末尾+1的索引ID 
// uint8_t  gu8TCPRecvSta = 0;         //1 第一阶段 寻找到了包头 接下来找
LUnion          LU_TCP_LEN;

ErrorStatus F_EC200N_RecvDatStaHandle(enum_4G_CMD *cmd,enum_4G_CMD *status)
{
    char    str_OK[] = "OK";
    char    *pch =NULL;

    ErrorStatus lerr = SUCCESS;
    
    uint32_t lu32_cmd =0 ,lu32_status = 0;
    lu32_cmd = (uint32_t)(*cmd);  
    lu32_status = (uint32_t)(*status); 
    u32cnt = UART_4G_fifo_cnt(); 
    {
        
        memset(&m_u8_EC20RecvBuff,0,sizeof(m_u8_EC20RecvBuff));
        if( u32cnt > (sizeof(m_u8_EC20RecvBuff)-2)) 
        {
            UART_4G_read(&m_u8_EC20RecvBuff,sizeof(m_u8_EC20RecvBuff));
            m_u8_EC20RecvLenth = sizeof(m_u8_EC20RecvBuff);
            //ERR
            DEBUG_printf(DEBUG_UART,"EC200 ERR %s%d \r\n",__FILE__,__LINE__);
            return ERROR;
        }
        else if(u32cnt>0)
        {
            m_u8_EC20RecvLenth = u32cnt;
            UART_4G_read(&m_u8_EC20RecvBuff,u32cnt);
            DEBUG_printf(DEBUG_UART,"EC200_UART_RECV :%s\r\n",m_u8_EC20RecvBuff);
			st_EC20RecvCmd = TRUE;            
        }
        else if( 0 == u32cnt)
        {
            // if( 1 == g_SysBaseTime.f2s)
            // {
            //     (*status) += 2;
            // }
        }
    }
}

ErrorStatus F_APP_EC200N(enum_4G_CMD *cmd,enum_4G_CMD *status)
{

	// _ProcJumpType_Def ret = PROC_JUMP_HOLD;
	// _ProcParmType_Def tempProcParm = *pProcParm;
	static char *retStr	    = NULL;
	static char *retStr1    = NULL;    
	static char *retHeader  = NULL;
	static char *retTail	= NULL;

	char *retStrHead = NULL;
	char *retStrTail = NULL;

	uint16_t tempLenth = 0;    

	uint32_t u32FileLenth   = 0;
	FuncState retFunc;
	//static uint16_t s_u16_recvKeepFlag = 0;
	static uint16_t s_u16_recvFirstFlag = 0;
	static uint32_t s_u32_Revclenth = 0;
	static uint32_t s_u32_PutBufferlenth = 0;
	static uint8_t m_u8_FileRecvBuffer[EC20_RECV_BUFF_SIZE] = {0};


    ErrorStatus l_err = SUCCESS;
    
    char str_OK[] = "OK";
    char *pch =NULL;
    
    ErrorStatus lerr = SUCCESS;

    uint32_t lu32_cmd =0 ,lu32_status = 0;
    lu32_cmd = (uint32_t)(*cmd);  
    lu32_status = (uint32_t)(*status); 
        
    memset(&Sendbuf,0,sizeof(Sendbuf));
    // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
    
    switch (lu32_cmd)
    {

        case M_EC20_HARD_RESET_START:
            gu8_TCPDirTransfMode =0;  //开启透传模式
            //DO IT
            DEBUG_printf(DEBUG_UART,"EC20 RESET_4G_Pin = GPIO_PIN_SET \r\n");
            HAL_GPIO_WritePin(RESET_4G_GPIO_Port,RESET_4G_Pin,GPIO_PIN_SET); 
            HAL_Delay(1000);  
            MX_FEED_IWDG(); 
            HAL_Delay(1000);  
            MX_FEED_IWDG();              
            HAL_GPIO_WritePin(RESET_4G_GPIO_Port,RESET_4G_Pin,GPIO_PIN_RESET);   
            DEBUG_printf(DEBUG_UART,"EC20 RESET_4G_Pin = GPIO_PIN_RESET \r\n");                     
            MX_FEED_IWDG();                       
            (*status) = M_EC20_HARD_RESET_ING;    
            break;

        case M_4G_IDLE:
            //DEBUG_printf(0,"M_4G_IDLE\r\n"); 
            //gu16_SendLen = strlen(Sendbuf); 
            //(*status) = M_4G_IDLE;
            //(*cmd) = 0;
          goto JUMP_STA_ING_HANDLE;
            break;
        case M_AT_TEST_START:
            gu8_TCPDirTransfMode =0;  //开启透传模式        
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT"); 
            gu16_SendLen = strlen(Sendbuf);             
            (*status) = M_AT_TESTING;                     
            break;
        // case 2:
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");  
        //     break;       
        case M_SIM_CHECK_START://查询SIM卡
            /* code */
            gu8_TCPDirTransfMode =0;  //开启透传模式               
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_SIM_CHECKING;                                     
            break;    
                
        case M_CSQ_CHECK_START://查询信号,31最大,小于10证明信号超级不好
            /* code */
            gu8_TCPDirTransfMode =0;  //开启透传模式               
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");  
            gu16_SendLen = strlen(Sendbuf)+2; 
            (*status) = M_CSQ_CHECKING;            
            break;      
        case M_CGREG_CHECK_START://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_CGREG_CHECKING;             
            break;  

        case M_CGATT_CHECK_START://附着网络是否成功
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_CGATT_CHECKING;              
            break;    
            
        case M_QIACT1_SET_START:// 激活QIACT PDP场景
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_CONTEXT_PRFL);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_QIACT1_SETTING;              
            break;  
        
        case M_QUERY_QIACT_START:// 查询场景状态
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_CONTEXT_INFO);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_QUERY_QIACT_ING;              
            break;                

        case M_FTP_CFG_CONTID_START :    // FTP     上下文设置   FTP CONTEX ID SET
            /* code */
            APP_EC20Link_Init();
            sprintf((char*)&Sendbuf[0],EC20_FTP_CONTEXTID,st_EC20LinkVar.u8_FtpContextID);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_CONTID_ING;              
            break;                    

        case M_FTP_CFG_ACC_START :      // ACCOUNT  设置   FTP ACCOUNT  SET
            /* code */
         
            sprintf((char*)&Sendbuf[0],EC20_FTP_ACCOUNT,
                                                    &st_EC20LinkVar.s_FtpUserName[0],
                                                    &st_EC20LinkVar.s_FtpUserPassword[0]);            
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_ACC_ING;   
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_ACC_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_ACC_ING\r\n");                          
            break;                    

        case M_FTP_CFG_FT_START :       // filetype  设置   FTP filetype  SET
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_FILE_TYPE,st_EC20LinkVar.u8_FtpFileType); 
            
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_FT_ING; 
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_FT_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_FT_ING\r\n");                                    
            break;     

        case M_FTP_CFG_TM_START :       // transfer mode  上下文设置   FTP transfer mode  SET
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_TRANS_MODE,st_EC20LinkVar.u8_FtpTransMode);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_TM_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_TM_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_TM_ING\r\n");                                      
            break;                 
        
        case M_FTP_CFG_RSPT_START :       // rsptimeout  设置   FTP rsptimeout  SET
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_RSP_TIMEOUT,st_EC20LinkVar.u8_FtpTimeOut1S);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_RSPT_ING;    
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_RSPT_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_RSPT_ING\r\n");                                  
            break;                 

        case M_FTP_QFTPOPEN_START :       // ftp  打开   ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_OPEN,&st_EC20LinkVar.s_FtpServerDMN[0],
														st_EC20LinkVar.u16_FtpPortNum);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPOPEN_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPOPEN_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPOPEN_ING\r\n");                                     
            break;   

        case M_FTP_QFTPCLOSE_START :       // ftp  关闭   ftp    close
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_CLOSE);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPCLOSE_ING;   
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPCLOSE_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPCLOSE_ING\r\n");                                    
            break;  

        case M_FTP_QFTPCWD_START :       // ftp  配置 FTP(S)服务器当前目录    
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_CWD_FOLDER,&st_EC20LinkVar.s_FtpFilePath[0]);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPCWD_ING;    
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPCWD_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPCWD_ING\r\n");                              
            break;                              

        case M_FTP_QFTPSIZE_START :       // ftp  获取文件的大小  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_QUERY_SIZE,&st_EC20LinkVar.s_FtpFileName[0]);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPSIZE_ING;   
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPSIZE_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPSIZE_ING\r\n");                                     
            break;        

        case M_FTP_QFTPGET_START :       // ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_GET_FILE,
            											&st_EC20LinkVar.s_FtpFileName[0],
	    													EC20_FILE_NEW_NAME);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPGET_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPGET_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPGET_ING\r\n");                                  
            break;   

        case M_FTP_QFDELUFSALL_START :       // ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FILE_QFDELUFSALL);       
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFDELUFSALL_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFDELUFSALL_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFDELUFSALL_ING\r\n");                                  
            break;                        

        case M_FTP_QFOPEN_START :       // ftp  
            /* code */
		    st_EC20LinkVar.p_FileName = EC20_FILE_NEW_NAME;            
            sprintf((char*)&Sendbuf[0],EC20_FILE_OPEN,st_EC20LinkVar.p_FileName);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFOPEN_ING;    
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFOPEN_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFOPEN_ING\r\n");                                  
            break;       

        case M_FTP_QFCLOSE_START :       // ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FILE_CLOSE,st_EC20LinkVar.u16_FileHandle);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFCLOSE_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFCLOSE_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFCLOSE_ING\r\n");                                      
            break;         
        
        case M_FTP_QFSEEK_START :       // ftp  
            /* code */
            uint32_t lu32_BSP_ERR = 0;
            BSP_FLASH_Erase(0,&lu32_BSP_ERR);
            st_EC20LinkVar.u32_FilePosition = 0;
            sprintf((char*)&Sendbuf[0],EC20_FILE_SEEK,
                                                    st_EC20LinkVar.u16_FileHandle,
													st_EC20LinkVar.u32_FilePosition);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFSEEK_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFSEEK_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFSEEK_ING\r\n");                                       
            break;    


        case M_FTP_QFREAD_START :       // ftp  
            /* code */

            sprintf((char*)&Sendbuf[0],EC20_FILE_READ,
													st_EC20LinkVar.u16_FileHandle,
													EC20_FILE_EXCHANGE_SIZE);            
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFREAD_ING;    


            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFREAD_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFREAD_ING\r\n");                                 
            break;                      

        // case M_QIOPEN_START:// OPEN EC200 TCP SOKCET 打开EC200 SOCKET
        //     /* code */
        //     gu8_TCPDirTransfMode =  M_EC20_AT;  //   进入AT模式         
        //     sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_SOCKET_OPEN_TEST);  
        //     gu16_SendLen = strlen(Sendbuf); 
        //     (*status) = M_QIOPEN_ING;              
        //     break;  
            
        // case M_TCP_LOGIN_START:// LOGING 
        //     /* code */
        //     gu8_TCPDirTransfMode =  M_EC20_TT ;  //开启透传模式
        //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));

        //     l_err = F_TCP_LoginDataPack();
        //     if(SUCCESS == l_err)
        //     {
        //         gu16_SendLen = gs_TCP_DataPack.u32Length;
        //         memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
                
        //         (*status) = M_TCP_LOGIN_ING;                  
        //     }            
        //     break;       
        
        // case M_TCP_DATAUP_START:// TCP 数据上报开始
        //     /* code */
        //     // sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_SOCKET_OPEN);  
        //     // gu16_SendLen = strlen(Sendbuf); 
        //     // (*status) = M_QIOPEN_ING;          
        //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));
        //     l_err = F_TCP_DataUpDataPack();
        //     if(SUCCESS == l_err)
        //     {
        //         gu16_SendLen = gs_TCP_DataPack.u32Length;
        //         memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
                
        //         (*status) = M_TCP_DATAUP_ING;                  
        //     }                
        //     break;                       
        
        // case M_QICLOSE_START:// OPEN EC200 TCP SOKCET 打开EC200 SOCKET
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_SOCKET_CLOSE);  
        //     gu16_SendLen = strlen(Sendbuf); 
        //     (*status) = M_QICLOSE_ING;              
        //     break;              
        
        // case M_QMTCFG_SET_START://设置数据格式
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");  
        //     gu16_SendLen = strlen(Sendbuf); 
        //     (*status) = M_QMTCFG_SETTING;                
        //     break;   

        // case M_QMTOPEN_OPEN_START://打开工业物联网云端口
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006"); 
        //     gu16_SendLen = strlen(Sendbuf);              
        //     (*status) = M_QMTOPEN_OPENING;  
        //     break;   
            
        // case M_QMTCONN_CONN_START://这步执行成功后,设备应该在线了。
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\""); 
        //     gu16_SendLen = strlen(Sendbuf);               
        //     (*status) = M_QMTCONN_CONNING;             
        //     break;      
        
        // case M_QMTPUBEX_PUB_START://发送数据命令
        //     /* code */
        //     memset(&Sendbuf,0,sizeof(Sendbuf));   
        //     F_DataPacking_SUNKUN_1(Sendbuf,sizeof(Sendbuf));  
        //     gu16_SendLen = strlen(Sendbuf);   
        //     memset(&Sendbuf,0,sizeof(Sendbuf)); 
        //     sprintf((char*)&Sendbuf[0],"%s,%d\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\"",gu16_SendLen);  
        //     gu16_SendLen = strlen(Sendbuf);
        //     MX_FEED_IWDG();   
        //     HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//huart1需要根据你的配置修改
        //     MX_FEED_IWDG();   
        //     MX_FEED_IWDG(); 
        //     HAL_Delay(800);  

        //     memset(&Sendbuf,0,sizeof(Sendbuf));   
        //     F_DataPacking_SUNKUN_1(Sendbuf,sizeof(Sendbuf));  
        //     gu16_SendLen = strlen(Sendbuf);                                 
            
        //     //sprintf(Sendbuf,SUNKON_PAYLOAD,gf_testUAV,gf_testUBV,gf_testUCV,gf_testIAA,gf_testIBA,gf_testICA,gf_testPAW,gf_testPBW,gf_testPCW,gf_testPTW);  

        //     //sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");        
        //     HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//huart1需要根据你的配置修改
            
        //     (*status) = M_QMTPUBEX_PUBING;          
        //     return 1;
        //     break;   
        
        // case M_QMTDISC_0_START://清除链接
        //         /* code */
        //     memset(&Sendbuf,0,sizeof(Sendbuf));                     
        //     sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0"); 
        //     gu16_SendLen = strlen(Sendbuf);   
        //     (*status) = M_QMTDISC_0_ING;                         
        //         break;     

        default:
            //return ERROR;
          
            goto JUMP_STA_ING_HANDLE;
            break;
    }

    (*cmd) = (*status);
    HAL_UART_Transmit(&huart1, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//huart1需要根据你的配置修改 
    HAL_UART_Transmit(&UART_4G, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//hUART_4G需要根据你的配置修改 
    // memset(&g_SysBaseTime,0,sizeof(g_SysBaseTime));
    // Sys_BaseTimeInit();
    g32_LastSec = Sys_GetSec(); 

    //ING STATUS
    
JUMP_STA_ING_HANDLE:
   
   switch ( lu32_status )
    {
        
    case M_EC20_HARD_RESET_ING:

        g32_NowSec = Sys_GetSec();
        g32_DiffSec = g32_NowSec - g32_LastSec;            
        pch = strstr(m_u8_EC20RecvBuff, "RDY");        
	    if (pch != NULL)
        {
            // (*status) += 1;
            (*status)   = M_EC20_HARD_RESET_INIT_WAIT;
            (*cmd)      = M_EC20_HARD_RESET_INIT_WAIT;
             g32_LastSec = Sys_GetSec();
        }
        else if( g32_DiffSec > 10)
        {
            // (*status) += 2;
            (*status)  = M_EC20_HARD_RESET_ERR;
        }      
        break;
        
    case M_EC20_HARD_RESET_INIT_WAIT:
        //重启后的初始化等待步骤
        g32_NowSec  =   Sys_GetSec();
        g32_DiffSec =   g32_NowSec - g32_LastSec; 
        if(g32_DiffSec > M_EC20_RESET_INIT_WAIT_S) 
        {
            (*cmd)  =   M_SIM_CHECK_START;            
        }        
        break;
        
        // g32_NowSec = Sys_GetSec();
        // g32_DiffSec = g32_NowSec - g32_LastSec;        
        // pch = strstr(ArryBuf, str_OK); 
        // if (pch != NULL)
        // {
        // (*status) += 1;
        // }
        // else if( g32_DiffSec > 6)
        // {
        // (*status) += 2;
        // }       

    case M_AT_TESTING:
        pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        else if( g_SysBaseTime.f2s == 1)
        {
            (*status) += 2;
        }      
        break;

    case M_SIM_CHECKING:
        pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        else if( g_SysBaseTime.f2s == 1)
        {
            //(*status) += 2;
            (*status) = M_SIM_CHECK_ERR;
        }        
        break;      

    case M_CSQ_CHECKING:
        {
            pch = strstr(m_u8_EC20RecvBuff, str_OK);        
            if (pch != NULL)
            {
                (*status) += 1;
            }
            else if( g_SysBaseTime.f2s == 1)
            {
                (*status) += 2;
            }
            break;              
        }
        
    case M_CGATT_CHECKING:
        {
            pch = strstr(m_u8_EC20RecvBuff, str_OK);        
            if (pch != NULL)
            {
            (*status) += 1;
            }
            else if( g_SysBaseTime.f2s == 1)
            {
            (*status) += 2;
            }
            break;   
        }        

    case M_QIACT1_SETTING:
        pch = strstr(m_u8_EC20RecvBuff, EC20_CONTEXT_PRFL_ANS);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        else if( g_SysBaseTime.f2s == 1)
        {
            (*status) += 2;
        }      
        break;        

    case M_QUERY_QIACT_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_CONTEXT_INFO_ANS);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) += 2;  //M_QIOPEN_ERR
        }          
        break;      

    case M_FTP_CFG_CONTID_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_CONTID_OK;
            DEBUG_printf(DEBUG_UART,"FTP context id set ok\r\n");
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_CONTID_ERR;  //M_QIOPEN_ERR
            DEBUG_printf(DEBUG_UART,"FTP context id set timeout\r\n");                   
        }          
        break;    

    case M_FTP_CFG_ACC_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_ACC_OK;
            DEBUG_printf(DEBUG_UART,"FTP ACC set ok\r\n");            
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_ACC_ERR;  //M_QIOPEN_ERR
            DEBUG_printf(DEBUG_UART,"FTP ACC set timeout\r\n");              
        }          
        break;     

    case M_FTP_CFG_FT_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_FT_OK;
            DEBUG_printf(DEBUG_UART,"FTP file type set ok\r\n");                    
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_FT_ERR;  //M_QIOPEN_ERR
            DEBUG_printf(DEBUG_UART,"FTP file type set timeout\r\n");                    
        }          
        break;     
    
    case M_FTP_CFG_TM_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_TM_OK;
            DEBUG_printf(DEBUG_UART,"FTP transfer mode set ok\r\n");                   
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_TM_ERR;  //
            DEBUG_printf(DEBUG_UART,"FTP transfer mode set timeout\r\n");                
        }          
        break;        

    case M_FTP_CFG_RSPT_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_RSPT_OK;
            DEBUG_printf(DEBUG_UART,"FTP RSPT set ok\r\n");                        
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_RSPT_ERR;  //
            DEBUG_printf(DEBUG_UART,"FTP RSPT set timeout\r\n");                           
        }          
        break;     

    case M_FTP_QFTPOPEN_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        // pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OPEN_ANS);        
	    // if (pch != NULL)
        // {
        //     (*status)  = M_FTP_QFTPOPEN_OK;
        // }
        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_OPEN_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_OPEN_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLoginInfo));
                memcpy(&st_EC20LinkVar.s_FtpLoginInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLoginInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING s_FtpLoginInfo %s\r\n",st_EC20LinkVar.s_FtpLoginInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                                    
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPOPEN_OK;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_OK \r\n"); 
                }
                else
                {
                    (*status)  = M_FTP_QFTPOPEN_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ERR u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                          
                }
            }
            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLoginInfo));
                memcpy(&st_EC20LinkVar.s_FtpLoginInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLoginInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING s_FtpLoginInfo %s\r\n",st_EC20LinkVar.s_FtpLoginInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                                
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPOPEN_OK;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_OK \r\n");  
                }
                else
                {
                    (*status)  = M_FTP_QFTPOPEN_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);       
                }
            }
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING unknow\r\n");   
            }
        }        
        else if ( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPOPEN_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ERR timeout \r\n");              
        }     

        break;                                        
            
    case    M_FTP_QFDELUFSALL_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_QFDELUFSALL_OK;
            DEBUG_printf(DEBUG_UART,"EC20 M_FTP_QFDELUFSALL_OK ok\r\n");                        
        }     
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFDELUFSALL_ERR;  //
            DEBUG_printf(DEBUG_UART,"EC20 M_FTP_QFDELUFSALL_ERR timeout\r\n");                           
        }     
        break;


    case    M_FTP_QFTPCLOSE_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_CLOSE_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);				
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_CLOSE_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLogoffInfo));
                memcpy(&st_EC20LinkVar.s_FtpLogoffInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLogoffInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING s_FtpLogoffInfo %s\r\n",st_EC20LinkVar.s_FtpLogoffInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                     
                //ret = PROC_JUMP_NEXT;
                (*status)  = M_FTP_QFTPCLOSE_OK;
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_OK\r\n");
            }
            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLogoffInfo));
                memcpy(&st_EC20LinkVar.s_FtpLogoffInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLogoffInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                //ret = PROC_JUMP_NEXT;
                (*status)  = M_FTP_QFTPCLOSE_ERR;
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING s_FtpLogoffInfo %s\r\n",st_EC20LinkVar.s_FtpLogoffInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);   
            }
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING unknow\r\n");   
            }
        } 
        else if ( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPCLOSE_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING timeout \r\n");  
        }                    

        break;  

    case M_FTP_QFTPCWD_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                       
        
        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_CWD_FOLDER_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_CWD_FOLDER_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFolderInfo));
                memcpy(&st_EC20LinkVar.s_FtpFolderInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFolderInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING s_FtpFolderInfo %s\r\n",st_EC20LinkVar.s_FtpFolderInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);   
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING u16_FtpProErrCode %d\r\n",st_EC20LinkVar.u16_FtpProErrCode);   
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPCWD_OK;  //  
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_OK\r\n");                   
                }
                else 
                {
                    (*status) = M_FTP_QFTPCWD_ERR;  //
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ERR u16_FtpErrCode %d \r\n",st_EC20LinkVar.u16_FtpErrCode);   
                }
            }
            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFolderInfo));
                memcpy(&st_EC20LinkVar.s_FtpFolderInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFolderInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPCWD_ERR;  //                    
                }
                (*status) = M_FTP_QFTPCWD_ERR;  // 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ERR u16_FtpErrCode %s %d \r\n",EC20_FTP_ERR,st_EC20LinkVar.u16_FtpErrCode);                  
            }
        }
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPCWD_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING timeout \r\n");              
        }          
        break;  

    case M_FTP_QFTPSIZE_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                         

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_QUERY_SIZE_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_QUERY_SIZE_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFileInfo));
                memcpy(&st_EC20LinkVar.s_FtpFileInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFileInfo[0]);

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ING s_FtpFileInfo %s\r\n",st_EC20LinkVar.s_FtpFileInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                   
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    st_EC20LinkVar.u32_FtpFileOriginalSize = atoi(retStr1 + 1);
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_OK u32_FtpFileOriginalSize %d\r\n",st_EC20LinkVar.u32_FtpFileOriginalSize);                       
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPSIZE_OK;
                }
                else
                {
                    (*status)  = M_FTP_QFTPSIZE_ERR;                    
                    st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR u16_FtpProErrCode %d\r\n",st_EC20LinkVar.u16_FtpProErrCode);                          
                }
            }

            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFileInfo));
                memcpy(&st_EC20LinkVar.s_FtpFileInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFileInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPSIZE_ERR;  
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode); 
                }
                else
                {
                    (*status) = M_FTP_QFTPSIZE_ERR;  
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode); 
                }
            }
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ING unkonw\r\n"); 
            }
        } 
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPSIZE_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR timeout \r\n");                    
        }                 

        break;     
    
    case M_FTP_QFTPGET_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                      

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_GET_FILE_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_GET_FILE_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpDataInfo));
                memcpy(&st_EC20LinkVar.s_FtpDataInfo[0],retStrHead,tempLenth);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ING s_FtpDataInfo %s \r\n",st_EC20LinkVar.s_FtpDataInfo[0]); 

                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpDataInfo[0]);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ING u16_FtpErrCode %d \r\n",st_EC20LinkVar.u16_FtpErrCode);                 
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    st_EC20LinkVar.u32_FtpFileDownloadSize = atoi(retStr1 + 1);
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPGET_OK;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_OK u32_FtpFileDownloadSize %d \r\n",st_EC20LinkVar.u32_FtpFileDownloadSize);   
                }
                else if(613 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    (*status)  = M_FTP_QFTPGET_ERR;
                    st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ERR u16_FtpProErrCode %d \r\n",st_EC20LinkVar.u16_FtpProErrCode);                       
                }
                else
                {

                }
            } //END if(NULL != retStr)

            else if(NULL != retStr1)            
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpDataInfo));
                memcpy(&st_EC20LinkVar.s_FtpDataInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpDataInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPGET_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_OK u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode);                    
                }
                else
                {
                    (*status) = M_FTP_QFTPGET_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ERR u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode);                       
                }

            } //END else if(NULL != retStr1)  
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ING unkonw\r\n");
            }
        } // END if(TRUE == st_EC20RecvCmd)
        else if( g32_DiffSec > 16)
        {
            (*status) = M_FTP_QFTPGET_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ERR timeout \r\n");                 
        }  

    case M_FTP_QFOPEN_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;     
        
        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_OPEN_ANS,
                                            &st_EC20LinkVar.s_FileOpenInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileOpenInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileHandle = atoi((char*)&st_EC20LinkVar.s_FileOpenInfo[0]);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_OK u16_FileHandle =%d\r\n",st_EC20LinkVar.u16_FileHandle); 
                (*status) = M_FTP_QFOPEN_OK;  //
                // ret = PROC_JUMP_EXIT;
            }
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileOpenInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileOpenInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileOpenInfo[0]);
                if(426 == st_EC20LinkVar.u16_FileErrCode)  //426   =  文件已经打开   file is already open
                {
                    // ret = PROC_JUMP_EXIT;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_OK file is already open\r\n"); 
                    (*status) = M_FTP_QFOPEN_OK;  //
                }
                else 
                {
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_ERR u16_FileErrCode = %d\r\n",st_EC20LinkVar.u16_FileErrCode);
                    (*status) = M_FTP_QFOPEN_ERR;  // 
                }
            }
        }
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFOPEN_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_ING timeout \r\n");                 
        }          
        break;

    case M_FTP_QFCLOSE_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;     

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_OK,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                // ret = PROC_JUMP_EXIT;
                (*status) = M_FTP_QFCLOSE_OK;  //                           
            }
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileCloseInfo[0]);
                // ret = PROC_JUMP_EXIT;
                (*status) = M_FTP_QFCLOSE_ERR;  //                
                DEBUG_printf(DEBUG_UART,"M_FTP_QFCLOSE_ING u16_FileErrCode %d \r\n",st_EC20LinkVar.u16_FileErrCode);    
            }
        } 
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFCLOSE_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFCLOSE_ERR timeout \r\n");                 
        }                   
        break;        

    case M_FTP_QFSEEK_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;    

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_OK,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                (*status) = M_FTP_QFSEEK_OK;  //  
                DEBUG_printf(DEBUG_UART,"M_FTP_QFSEEK_OK  \r\n");
                // ret = PROC_JUMP_EXIT;
            }
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileCloseInfo[0]);
                (*status) = M_FTP_QFSEEK_ERR;  //   
                DEBUG_printf(DEBUG_UART,"M_FTP_QFSEEK_ERR  \r\n");                               
            }
        }
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFSEEK_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFSEEK_ERR timeout \r\n");                 
        }            
        break;

    case M_FTP_QFREAD_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                       

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            if(0 == s_u16_recvFirstFlag)	
            {                
                retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_RW_ANS,
                                                &st_EC20LinkVar.s_FileReadInfo[0],
                                                sizeof(st_EC20LinkVar.s_FileReadInfo));
                if(NULL == retFunc)
                {
                    m_u8_EC20RecvLenth = 0;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING retFunc = NULL \r\n");   
                }
                else if(SUCC == retFunc)
                {
                    st_EC20LinkVar.u16_FileTransLen = atoi((char*)&st_EC20LinkVar.s_FileReadInfo[0]);

                    retHeader = (char*)&m_u8_EC20RecvBuff[0];
                    
                    retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FILE_RW_ANS);//GET

                    retStr = strstr(retStr,"\r\n");

                    retTail = retStr + strlen("\r\n");

                    u32FileLenth = retTail - retHeader;
                    
                    m_u8_EC20RecvLenth -=  u32FileLenth;
                    
                    s_u16_recvFirstFlag = 1;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING st_EC20LinkVar.u16_FileTransLen %d\r\n",st_EC20LinkVar.u16_FileTransLen); 
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING u32FileLenth %d\r\n",u32FileLenth);      
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING m_u8_EC20RecvLenth %d\r\n",m_u8_EC20RecvLenth);                                                                                    
                }				
            }
            
            if(m_u8_EC20RecvLenth >= (st_EC20LinkVar.u16_FileTransLen + 6 - s_u32_Revclenth))
            {
                s_u32_PutBufferlenth = st_EC20LinkVar.u16_FileTransLen - s_u32_Revclenth;
            }
            else
            {
                s_u32_PutBufferlenth = m_u8_EC20RecvLenth;
            }

            memcpy(&m_u8_FileRecvBuffer[s_u32_Revclenth],&m_u8_EC20RecvBuff[u32FileLenth],s_u32_PutBufferlenth);

            s_u32_Revclenth += s_u32_PutBufferlenth; 

            DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING s_u32_PutBufferlenth %d\r\n",s_u32_PutBufferlenth);  
            DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING s_u32_Revclenth %d\r\n",s_u32_Revclenth);              
            
            if(s_u32_Revclenth == st_EC20LinkVar.u16_FileTransLen)
            {
                retHeader = (char*)&m_u8_EC20RecvBuff[u32FileLenth] + s_u32_PutBufferlenth;
                retStr = strstr(retHeader,"\r\nOK\r\n");
                
                if(NULL != retStr)
                {
                    DEBUG_printf(DEBUG_UART,"BSP_FLASH_Write st_EC20LinkVar.u32_FilePosition  %d\r\n",st_EC20LinkVar.u32_FilePosition); 
                    
                    if(BSP_OK == EE_Write_CHECK((st_EC20LinkVar.u32_FilePosition + EE_OTAFileAddr),

                    
                                        (uint16_t*)m_u8_FileRecvBuffer,
                                        (st_EC20LinkVar.u16_FileTransLen )));

                    {
                        DEBUG_printf(DEBUG_UART,"EE_Write_CHECK over  %d\r\n",st_EC20LinkVar.u16_FileTransLen);                             
                        s_u16_recvFirstFlag	= 0;
                        s_u32_Revclenth		= 0;
                        s_u32_PutBufferlenth= 0;
                        memset(&m_u8_FileRecvBuffer[0],0,EC20_RECV_BUFF_SIZE);		
                        //ret = PROC_JUMP_NEXT;
                        (*status)   = M_FTP_QFREAD_ING1; 
                        (*cmd)      = M_FTP_QFREAD_ING1;                        
                    }



                    // if(BSP_OK == BSP_FLASH_Write((st_EC20LinkVar.u32_FilePosition + APP_ADDR),
                    //                     (uint16_t*)m_u8_FileRecvBuffer,
                    //                     (st_EC20LinkVar.u16_FileTransLen >> 1) + (st_EC20LinkVar.u16_FileTransLen % 2)));
                    // {					
                    //     DEBUG_printf(DEBUG_UART,"BSP_FLASH_Write over  %d\r\n",st_EC20LinkVar.u16_FileTransLen);                             
                    //     s_u16_recvFirstFlag	= 0;
                    //     s_u32_Revclenth		= 0;
                    //     s_u32_PutBufferlenth= 0;
                    //     memset(&m_u8_FileRecvBuffer[0],0,EC20_RECV_BUFF_SIZE);		
                    //     //ret = PROC_JUMP_NEXT;
                    //     (*status)   = M_FTP_QFREAD_ING1; 
                    //     (*cmd)      = M_FTP_QFREAD_ING1;
                    // }
                }
            }				
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileReadInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileReadInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileReadInfo[0]);
                s_u16_recvFirstFlag		= 0;
                s_u32_Revclenth			= 0;
                s_u32_PutBufferlenth	= 0;
                memset(&m_u8_FileRecvBuffer[0],0,EC20_RECV_BUFF_SIZE);
            }
        } //END if(TRUE == st_EC20RecvCmd)
        else if( g32_DiffSec > 13)
        {
            (*status) = M_FTP_QFSEEK_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING timeout \r\n");                 
        }            
        break;
        
    case M_FTP_QFREAD_ING1:        
        st_EC20LinkVar.u32_FilePosition += st_EC20LinkVar.u16_FileTransLen;
        st_EC20LinkVar.u32_FileSaveSize += st_EC20LinkVar.u16_FileTransLen;

        if(st_EC20LinkVar.u32_FtpFileDownloadSize <= st_EC20LinkVar.u32_FileSaveSize)
        {
            //ret = PROC_JUMP_EXIT;
            DEBUG_printf(DEBUG_UART,"PROC_JUMP_EXIT \r\n");
            DEBUG_printf(DEBUG_UART,"u32_FtpFileDownloadSize %d  u32_FileSaveSize  %d\r\n",
                st_EC20LinkVar.u32_FtpFileDownloadSize,st_EC20LinkVar.u32_FileSaveSize);      
            (*status)   = M_FTP_QFREAD_OK; 
            (*cmd)      = M_FTP_QFREAD_OK;                              
        }
        else
        {
            // tempProcParm.Flag = PROC_FLAG_BUSY0;
            (*status)   = M_FTP_QFREAD_START; 
            (*cmd)      = M_FTP_QFREAD_START;      
            DEBUG_printf(DEBUG_UART,"u32_FtpFileDownloadSize %d  u32_FileSaveSize  %d\r\n",
                st_EC20LinkVar.u32_FtpFileDownloadSize,st_EC20LinkVar.u32_FileSaveSize);                  
        }
    
        break;

        //static ValueState st_EC20RecvCmd;


    // case M_QIOPEN_ING:
    //     g32_NowSec = Sys_GetSec();
    //     g32_DiffSec = g32_NowSec - g32_LastSec;         
    //     pch = strstr(m_u8_EC20RecvBuff, EC20_SOCKET_OPEN_ANS);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;  //M_QIOPEN_OK
    //     }
    //     else if( g32_DiffSec > 30)
    //     {
    //         (*status) += 2;  //M_QIOPEN_ERR
    //     }  
    //     pch = strstr(m_u8_EC20RecvBuff, EC20_SOCKET_OPEN_ANS_ERR);      
	//     if (pch != NULL)
    //     {
    //         (*status) += 2;  //M_QIOPEN_ERR
    //     }
    //     break;    

        // g32_NowSec = Sys_GetSec();
        // g32_DiffSec = g32_NowSec - g32_LastSec;            
        // pch = strstr(ArryBuf, "RDY");        
	    // if (pch != NULL)
        // {
        //     (*status) += 1;
        // }
        // else if( g32_DiffSec > 6)
        // {
        //     (*status) += 2;
        // }      
        // break;          
        
    // case M_QICLOSE_ING:
    //     pch = strstr(m_u8_EC20RecvBuff, EC20_SOCKET_CLOSE_ANS);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }      
    //     break;     
        
    // case M_TCP_LOGIN_ING:
        
    //     if(M_TCP_COMM_PKTYPE_LOGIN_ACK  == gs_TCPRecvLocalInfo.u32PK_Type)
    //     {
    //         (*status) = M_TCP_LOGIN_OK;
    //     }
    //     else if( g_SysBaseTime.f6s == 1)
    //     {
    //         //(*status) += 2;
    //         (*status) = M_TCP_LOGIN_ERR;
    //     }         
    //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));
	//     //  if (pch != NULL)
    //     // {
    //     //     (*status) += 1;
    //     // }
    //     // else if( g_SysBaseTime.f2s == 1)
    //     // {
    //     //     (*status) += 2;
    //     // }      
    //     break;   

    // case M_TCP_DATAUP_ING:

    //     // pch = strstr(ArryBuf, EC20_SOCKET_CLOSE_ANS);    


	//     // if (pch != NULL)
    //     // {
    //     //     (*status) += 1;
    //     // }
    //     // else if( g_SysBaseTime.f2s == 1)
    //     // {
    //     //     (*status) += 2;
    //     // }   
        
    //     if(M_TCP_COMM_PKTYPE_DATAUP_ACK  == gs_TCPRecvLocalInfo.u32PK_Type)
    //     {
    //         (*status) = M_TCP_DATAUP_OK;
    //     }
    //     else if( g_SysBaseTime.f6s == 1)
    //     {
    //         //(*status) += 2;
    //         (*status) = M_TCP_DATAUP_ERR;
    //     }         
    //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));

    //     //临时调试:
    //     // (*status) = M_TCP_CIRCY_SEND_WAIT;
    //     // (*cmd) = M_TCP_CIRCY_SEND_WAIT;
    //     break; 
                
    // case M_QMTCFG_SETTING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }      
    //     break;      
           
    // case M_QMTOPEN_OPENING:
    //     g32_NowSec = Sys_GetSec();
    //     g32_DiffSec = g32_NowSec - g32_LastSec;        
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK); 
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g32_DiffSec > 6)
    //     {
    //         (*status) += 2;
    //     }       
    //     break;    

    // case M_QMTCONN_CONNING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;            
    //     }       
    //     break;                          

    // case  M_QMTPUBEX_PUBING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if(pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }       
    //     break;     
    
    // case M_QMTDISC_0_ING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }       
    //     break;  
        
    default:
        lu32_status = (uint32_t)(*status);         
        //DEBUG_printf(0,"EC200N status = %u NO CHANGE \r\n",lu32_status);
        goto JUMP_CMD_RES_HANDEL;
        break;
    }

    lu32_status = (uint32_t)(*status); 

    if(gLastSTA != lu32_status)
    {
        DEBUG_printf(DEBUG_UART,"EC200N status = %u \r\n",lu32_status);
    }

    gLastSTA = lu32_status;


JUMP_CMD_RES_HANDEL:
    
    lu32_status = (uint32_t)(*status);
    switch ( lu32_status )
    {
        
    case M_EC20_HARD_RESET_OK:
        HAL_Delay(1000);
        MX_FEED_IWDG(); 
        HAL_Delay(1000);
        MX_FEED_IWDG(); 
        HAL_Delay(1000);
        MX_FEED_IWDG(); 
        (*cmd) = M_SIM_CHECK_START;
        break;

    case M_EC20_HARD_RESET_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;

    case M_AT_TEST_OK:
        (*cmd) = M_SIM_CHECK_START;
        break;

    case M_SIM_CHECK_OK:
        (*cmd) = M_CSQ_CHECK_START;
        break;   

    case M_SIM_CHECK_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;           
        
    case M_CSQ_CHECK_OK:
        (*cmd) = M_CGATT_CHECK_START;
        break;    

    case M_CGATT_CHECK_OK:

        if(0)
        {
            (*cmd) = M_QMTCFG_SET_START;
        }
        else  //如果是TCP模式的话,
        {
            (*cmd) = M_QIACT1_SET_START;     
        }

        break;  

    case M_CGATT_CHECK_ERR:

        (*cmd) = M_SIM_CHECK_START;
        break;          

        

    case M_QIACT1_SET_OK:

        if(0)
        {
            (*cmd) = M_QMTCFG_SET_START;
        }
        else  //如果是TCP模式的话,
        {
            (*cmd) = M_QUERY_QIACT_START;     
        }
        break;   

    case M_QIACT1_SET_ERR:

        //如果设置不成功,直接查询  PDP场景
        (*cmd) = M_QUERY_QIACT_START;     
        break;                


    case M_QUERY_QIACT_OK:

        (*cmd) = M_FTP_CFG_CONTID_START;     
        break;   

    case M_QUERY_QIACT_ERR:

        (*cmd) = M_EC20_HARD_RESET_START;     
        break;           
            

    // case M_QIOPEN_OK:

    //     (*cmd) = M_TCP_LOGIN_START;     
    //     break;  
        
    // case M_QIOPEN_ERR:

    //     (*cmd) = M_SIM_CHECK_START;     
    //     break;          

    // case M_TCP_LOGIN_OK:
    //     gu16_LoginRetryCnt = 0;
    //     (*cmd) = M_TCP_DATAUP_START;     
    //     break;    

    // case M_TCP_LOGIN_ERR:
        
    //     if(gu8_debug)
    //     {
    //         //临时修改  如果登录不成功  直接继续 DATAUP
    //         (*cmd) = M_TCP_DATAUP_START;   
    //         (*status) = M_TCP_DATAUP_START;                       
    //     }
    //     else
    //     {
    //         gu16_LoginRetryCnt++;
    //         (*cmd)      = M_TCP_LOGIN_START;
    //         (*status)   = M_TCP_LOGIN_START;            
    //         if(gu16_LoginRetryCnt > 3 )
    //         {
    //             (*cmd) = M_EC20_HARD_RESET_START;  
    //         }            
    //     }     
    //     break; 

    // case M_TCP_DATAUP_OK:
    //     gu16_DataUpRetryCnt = 0;
    //     (*cmd)    = M_TCP_CIRCY_SEND_WAIT;
    //     (*status) = M_TCP_CIRCY_SEND_WAIT; 
    //     g32_LastSec = Sys_GetSec();
    //     break;   

    // case M_TCP_DATAUP_ERR:    
    //     if(gu8_debug)
    //     {
    //         //临时修改  如果登录不成功  直接继续 DATAUP
    //         (*cmd) = M_TCP_DATAUP_START;   
    //     }
    //     else
    //     {
    //         (*cmd)      = M_TCP_DATAUP_START;
    //         (*status)   = M_TCP_DATAUP_START;          
    //         if(gu16_DataUpRetryCnt > 3 )
    //         {
    //             (*cmd) = M_EC20_HARD_RESET_START;  
    //         }            
    //     }  
    //     break;     
    
    // case M_TCP_CIRCY_SEND_WAIT:
    //     //当前是循环发送模式
    //     g32_NowSec  =   Sys_GetSec();
    //     g32_DiffSec =   g32_NowSec - g32_LastSec; 
    //     if(g32_DiffSec > M_TCP_DATAUP_INTER_S) 
    //     {
    //         (*cmd)  =   M_TCP_DATAUP_START;            
    //     }        
    //     break;

    // case M_QMTCFG_SET_OK:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;   
    
    // case M_QMTCFG_SET_ERR:
    //     (*cmd) = M_QMTDISC_0_START;
    //     break;        

    // case M_QMTOPEN_OPEN_OK:
    //     (*cmd) = M_QMTCONN_CONN_START;
    //     break;     

    // case M_QMTOPEN_OPEN_ERR:
    //     (*cmd) = M_QMTDISC_0_START;
    //     break;   

    // case M_QMTCONN_CONN_OK:
    //     (*cmd) = M_QMTPUBEX_PUB_START;
    //     break; 
    
    // case M_QMTCONN_CONN_ERR:
    //     (*cmd) = M_QMTDISC_0_START;
    //     break;                                            

    // case M_QMTDISC_0_OK:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;        

    // case M_QMTDISC_0_ERR:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;    
        
    // //新修改的  
    // case M_QMTPUBEX_PUB_ERR:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;    

    // case M_QMTPUBEX_PUB_OK:
    //     //当前是循环发送模式
    //     (*cmd)    = M_CIRCY_SEND_WAIT;
    //     (*status) = M_CIRCY_SEND_WAIT; 
    //     g32_LastSec = Sys_GetSec();
    //     break;   

    // case M_CIRCY_SEND_WAIT:
    //     //当前是循环发送模式
    //     g32_NowSec  =   Sys_GetSec();
    //     g32_DiffSec =   g32_NowSec - g32_LastSec; 
    //     if(g32_DiffSec > 0) 
    //     {
    //         (*cmd)  =   M_QMTPUBEX_PUB_START;            
    //     }        
    //     break;          
                                
/*FTP*/

    case M_FTP_CFG_CONTID_OK:
        (*cmd) = M_FTP_CFG_ACC_START;
        break;   

    case M_FTP_CFG_CONTID_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;   

    case M_FTP_CFG_ACC_OK:
        (*cmd) = M_FTP_CFG_FT_START;
        break;   

    case M_FTP_CFG_ACC_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;    
            
    case M_FTP_CFG_FT_OK:
        (*cmd) = M_FTP_CFG_TM_START;
        break;   

    case M_FTP_CFG_FT_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;            

    case M_FTP_CFG_TM_OK:
        (*cmd) = M_FTP_CFG_RSPT_START;
        break;

    case M_FTP_CFG_TM_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;          
    
    case M_FTP_CFG_RSPT_OK:
        (*cmd) = M_FTP_QFTPOPEN_START;
        break;    

    case M_FTP_CFG_RSPT_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;             
        
    case M_FTP_QFTPOPEN_OK:
        (*cmd) = M_FTP_QFTPCWD_START;
        break;                                   

    case M_FTP_QFTPOPEN_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;   

    case M_FTP_QFTPCLOSE_OK:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;                                   

    case M_FTP_QFTPCLOSE_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;           
        
    case M_FTP_QFTPCWD_OK:
        (*cmd) = M_FTP_QFTPSIZE_START;
        break;                                   

    case M_FTP_QFTPCWD_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;    

    case M_FTP_QFTPSIZE_OK:
        (*cmd) = M_FTP_QFTPGET_START;
        break;                                   

    case M_FTP_QFTPSIZE_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;    

    case M_FTP_QFTPGET_OK:
        (*cmd) = M_FTP_QFOPEN_START;
        break;                                   
    
    case M_FTP_QFTPGET_ERR:
        if(  613 == st_EC20LinkVar.u16_FtpErrCode )  //文件错误
        {
            gSavedLastCMD = M_FTP_QFTPGET_ERR;
            gSavedLastSTA = M_FTP_QFTPGET_ERR;
            (*cmd) = M_FTP_QFDELUFSALL_START;  //删除4G模块内部的UFS系统内的所有文件
        }
        else
        {
            (*cmd) = M_FTP_QFTPCLOSE_START;  
        }
        break;     

    case M_FTP_QFDELUFSALL_OK:
        if(  M_FTP_QFTPGET_ERR == gSavedLastSTA )  
        {
            (*cmd) = M_FTP_QFTPGET_START;  
        }
        else
        {
            (*cmd) = M_FTP_QFTPCLOSE_START; 
        }    
        break;                                   
    
    case M_FTP_QFDELUFSALL_ERR:
        (*cmd) = M_FTP_QFCLOSE_START;  
        break;  

    case M_FTP_QFOPEN_OK:
        (*cmd) = M_FTP_QFSEEK_START;
        break;                                   

    case M_FTP_QFOPEN_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;    

    case M_FTP_QFCLOSE_OK:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;                                   

    case M_FTP_QFCLOSE_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;                  

    case M_FTP_QFSEEK_OK:
        (*cmd) = M_FTP_QFREAD_START;
        break;                                   

    case M_FTP_QFSEEK_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;                                      
    
    case M_FTP_QFREAD_OK:
        (*cmd) = M_FTP_QFREAD_OK;
        gs_DecCmd.SysCmd = M_OTA_JUMP;
        
        uint32_t lu32_filelen =  st_EC20LinkVar.u32_FtpFileDownloadSize;
        char str_md5[80];

        DEBUG_printf(DEBUG_UART,"MD5 cal start lu32_filelen= %d \r\n",lu32_filelen);
        //get_flash_md5("C",lu32_filelen,&str_md5[0]);
        get_EEPROM_md5("C",lu32_filelen,&str_md5[0]);        
        
        DEBUG_printf(DEBUG_UART,"MD5 = %s\r\n",str_md5);

        break;  

    case M_FTP_QFREAD_ERR:
        (*cmd) = M_FTP_QFSEEK_START;
        break;            

    default:
        lu32_cmd = (uint32_t)(*cmd);     
        //DEBUG_printf(DEBUG_UART,"EC200N CMD = %u  UNHANDLE\r\n",lu32_cmd);  
        //DEBUG_printf(0,"EC200N cmd = %u NO CHANGE \r\n",lu32_cmd);   
        //SEGGER_RTT_printf(0,"RTT cmd = %u NO CHANGE \r\n",lu32_cmd);   
        return ERROR;
        break;
    }
    
    lu32_cmd = (uint32_t)(*cmd); 
    if( lu32_cmd!= gLastCMD)
    {
        DEBUG_printf(DEBUG_UART,"EC200N cmd = %u \r\n",lu32_cmd);   
    }
    gLastCMD = lu32_cmd;    

}

// typedef enum 
// {
//     M_T_4G_IDLE = 0x0000, 
//     M_T_SETOTA, //1
//     M_T_LOGINACK,//2
//     M_T_DATAUPACK//2    
// } enum_TEST_4G; 

// uint16_t F_TEST_TCP_COMM(enum_TEST_4G *cmd)
// {
//     uint32_t lu32_cmd = 0;
//     ErrorStatus l_err = SUCCESS;
//     lu32_cmd = (*cmd);

//     switch (lu32_cmd)
//     {
//     case M_T_4G_IDLE:
//         /* code */
//         break;
    
//     case M_T_SETOTA: //1
//         /* code */
//         l_err = F_TCP_SETOTAPack();
//         if(SUCCESS == l_err)
//         {
//             gu16_SendLen = gs_TCP_DataPack.u32Length;
//             memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
//             HAL_UART_Transmit(&huart1, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);
//             (*cmd) =   M_T_4G_IDLE;                   
//         }             
//         break;

//     case M_T_LOGINACK: //3
//         /* code */
//         l_err = F_TCP_LoginAckPack();
//         if(SUCCESS == l_err)
//         {
//             gu16_SendLen = gs_TCP_DataPack.u32Length;
//             memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
//             HAL_UART_Transmit(&huart1, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);
//             (*cmd) =   M_T_4G_IDLE;                   
//         }             
//         break;

//     case M_T_DATAUPACK:
//         /* code */
//         break;        

//     default:
//         break;
//     }
// }

/******************************************************************************
* Name		: Alg_EC20Link_ParseInfo
* brief		: None.
* param		: None.
* retval	: BSP status
*******************************************************************************/
FuncState Alg_EC20Link_ParseInfo(char* pChar,char* pDstStr,uint16_t dstLenth)
{
	char *pTempStr;
	char *pTempStrHead;
	char *pTempStrTail;
	uint16_t tempLenth;
	FuncState ret = FAIL;
	
	// pTempStr = strstr((char*)&m_u8_EC20RecvBuff[0],pChar);
    pTempStr = strstr((char*)&m_u8_EC20RecvBuff[0],pChar);

	if(NULL != pTempStr)
	{
		pTempStrHead = pTempStr + strlen(pChar);
		pTempStrTail = strstr(pTempStrHead,"\r\n");
		
		if(pTempStrTail < pTempStrHead)
		{
			pTempStrHead = pTempStr;
		}
		
		tempLenth = pTempStrTail - pTempStrHead;
		tempLenth = MIN(tempLenth,dstLenth);
		memset(pDstStr,0x00,dstLenth);
		memcpy(pDstStr,pTempStrHead,tempLenth);
		ret = SUCC;
	}
	return ret;
}

void APP_EC20Link_Init(void)
{
	uint16_t i;

	char *retStr	    = NULL;
	char *retStr1    = NULL;    
	char *retStrHead = NULL;
	char *retStrTail = NULL;       
	uint16_t tempLenth;    

	// for(i = 0;i < EC20LINK_FUNC_OBJS_LENTH;i++)
	// {
	// 	memset(&st_ProcParm[i],0,sizeof(_ProcParmType_Def));
	// }
	
	// m_u16_TimeSliceIndex = 0;
	// st_TimeSliceState = FALSE;
	// st_EC20SendCmd = FALSE;
	st_EC20RecvCmd = FALSE;
	st_EC20RestCmd = FALSE;
	st_EC20DownloadCmd = FALSE;
	// st_EC20BurnCmd = FALSE;
	
	//memset(&m_u8_EC20SendBuff[0],0,EC20_SEND_BUFF_SIZE);
	memset(&m_u8_EC20RecvBuff[0],0,EC20_RECV_BUFF_SIZE);
	//m_u8_EC20SendLenth = 0;
	m_u8_EC20RecvLenth = 0;

	//memset(&st_PrcoStateAll,0,sizeof(_ProcStateAllType_Def));

	//m_u32_SignalQLTYCnt = 0;
	
	memset(&st_EC20LinkVar,0,sizeof(_ProcVariableAllType_Def));

	// for(i = 0;i < EC20LINK_FUNC_OBJS_LENTH;i++)
	// {
	// 	if(PROC_CLASS_REST == EC20LinkFuncObjs[i].ProcClass)
	// 	{
	// 		st_ProcParm[i].Ctl = PROC_CTL_ENBL;
	// 		break;
	// 	}
	// }
	
	st_EC20LinkVar.u16_FtpPortNum	= 21;
	st_EC20LinkVar.u8_FtpContextID	= 1;
	st_EC20LinkVar.u8_FtpFileType	= 0;
	st_EC20LinkVar.u8_FtpTransMode	= 1;
	st_EC20LinkVar.u8_FtpTimeOut1S	= 90;

	//GPIO_SetBits(GPIOE, GPIO_Pin_12);
	
    // if(gs_TCPRecInfoOTA.u16_FLG == )

    // gs_TCPRecInfoOTA.

    // retStr = strstr((char*)&m_u8_EC20RecvBuff[0],M_OTA_IPAITE);


    // retStrHead = retStr + sizeof(EC20_FTP_CWD_FOLDER_ANS) - 1;
    // retStrTail = strstr(retStrHead,"\r\n");
    // tempLenth = retStrTail - retStrHead;
    // tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFolderInfo));

    // retStr = strstr((char*)&gs_TCPRecInfoOTA.ucA_OTA_URL[0],M_OTA_IPAITE);
    // if(NULL != retStr)
    // {
    //      retStrHead = retStr + sizeof(M_OTA_IPAITE);
    //      retStrTail = strstr(retStrHead,"\\");
    //     tempLenth = retStrTail - retStrHead;
    //     tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpServerDMN));
    //     memcpy(&st_EC20LinkVar.s_FtpServerDMN[0],retStrHead,tempLenth);     
    // }    

    memcpy(&st_EC20LinkVar.s_FtpFilePath[0],&stBoot2.FilePath[0],STRING_FILE_PATH_LEN);    
    memcpy(&st_EC20LinkVar.s_FtpServerDMN[0],&stBoot2.ServerDMN[0],STRING_SERVER_DMN_LEN);        
    memcpy(&st_EC20LinkVar.s_FtpFileName[0],&stBoot2.FileName[0],STRING_FILE_NAME_LEN);    
    memcpy(&st_EC20LinkVar.s_FtpUserName[0],&stBoot2.UserName[0],STRING_USER_NAME_LEN);           
    memcpy(&st_EC20LinkVar.s_FtpUserPassword[0],&stBoot2.PassWord[0],STRING_PASSWORD_LEN);              
    
    
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpFilePath %s\r\n",st_EC20LinkVar.s_FtpFilePath);  
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpServerDMN %s\r\n",st_EC20LinkVar.s_FtpServerDMN);        
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpFileName %s\r\n",st_EC20LinkVar.s_FtpFileName);          
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpUserName %s\r\n",st_EC20LinkVar.s_FtpUserName);         
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpUserPassword %s\r\n",st_EC20LinkVar.s_FtpUserPassword);       

    
    
	// strcpy(&st_EC20LinkVar.s_FtpUserName[0],	"cartech");
	// strcpy(&st_EC20LinkVar.s_FtpUserPassword[0],"n13CF16thA");
	// strcpy(&st_EC20LinkVar.s_FtpServerDMN[0],	"39.98.76.17");
	// strcpy(&st_EC20LinkVar.s_FtpFilePath[0],	"/test");
	// strcpy(&st_EC20LinkVar.s_FtpFileName[0],	"SMP0100A00PRO.bin");

}

// {
//     "type":"variant_data",
//     "version":"1.0",
//     "time":1638766638000,
//     "params":
//     {
//         "UAV":0.1,
//         "UBV":0.1,
//         "UCV":0.1,
//         "IAA":0.1,
//         "IBA":0.1,
//         "ICA":0.1,
//         "PAW":0.0,
//         "PBW":0.0,
//         "PCW":10178313.0,
//         "PTW":10178313.0
//     }
// }

想要EEPROM芯片驱动的,STM32实现MD5算法的关注我,后面我会发布这些部分的教程。

容易踩的坑:

程序跳转前一定要关闭中断,不然会出一些让你摸不到头脑的问题。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/251603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端八股】系列之性能指标与评估工具

【前端八股】系列之性能指标与评估工具 前言性能指标的定义和特性性能指标的分类实验室指标真实指标用户感知指标评估工具 前言 这里是以前自己关于性能指标与评估工具的相关笔记&#xff0c;下面主要是关于性能指标的定义与特性以及相关的评估工具&#xff0c;并没有记录深入…

人工智能_机器学习065_SVM支持向量机KKT条件_深度理解KKT条件下的损失函数求解过程_公式详细推导---人工智能工作笔记0105

之前我们已经说了KKT条件,其实就是用来解决 如何实现对,不等式条件下的,目标函数的求解问题,之前我们说的拉格朗日乘数法,是用来对 等式条件下的目标函数进行求解. KKT条件是这样做的,添加了一个阿尔法平方对吧,这个阿尔法平方肯定是大于0的,那么 可以结合下面的文章去看,也…

mysql8支持远程访问

上面的localhost要改为%号就打开了远程访问 ALTER USER root% IDENTIFIED WITH mysql_native_password BY fengzi2141;

vite原理

一、依赖预构建 1、为什么需要依赖预构建 CommonJS和UMD兼容性 在开发阶段中&#xff0c;vite的开发服务器将所有的代码视为原生ES模块。因此&#xff0c;vite必须先将作为CommonJS或者UMD发布的依赖项转换为ESM。 这是vite的一个特色&#xff0c;也是为什么会相对于webpack比…

Android动画(一)——逐帧动画

目录 介绍 Android动画类型分类 逐帧动画 逐帧动画的使用 效果图 介绍 Android动画是一种用于创建视觉效果和交互体验的技术&#xff0c;可以增强用户界面的吸引力和响应性。Android提供了丰富的动画框架和API&#xff0c;使开发者可以轻松地添加动画效果到他们的应用程序中…

n维随机变量、n维随机变量的分布函数

设随机试验E的样本空间是&#xff0c;其中表示样本点。 设是定义在上的随机变量&#xff0c;由它们构成一个n维向量&#xff0c;叫做n维随机向量&#xff0c;也叫n维随机变量。 对于任意n个实数&#xff0c;n元函数 称为n维随机变量的分布函数&#xff0c;也叫联合分布函数。

springCloud项目打包如何把jar放到指定目录下

springCloud项目打包如何把jar发放到指定目录下 maven-antrun-plugin springCloud微服务打包jar&#xff0c;模块过多&#xff1b;我的项目模块结构如下&#xff1a; 我把实体类相关的单独抽离一个模块在service-api下服务单独写在service某块下&#xff0c; 每个模块的jar都…

【C++】 C++11 新特性探索:decltype 和 auto

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ decltype推导变量类型推导函数返回类型 2️⃣ auto自动推导变量类型迭代器和范围循环 3️⃣ decltype 和 auto 同时使用&#x1f6ec; 结论&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 C11 引入了一些强大的新特性&#xff…

【python】Debian安装miniconda、spyder、tushare

1. miniconda 安装 — 动手学深度学习 2.0.0 documentation中有安装Miniconda的一些说明。 Miniconda — miniconda documentation是Miniconda网站&#xff0c;里面也有安装说明。 Debian安装按照linux安装即可&#xff1a; mkdir -p ~/miniconda3 wget https://repo.anaco…

软实力篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、HR 最喜欢问程序员的 20 个问题二、面试中的礼仪与举止前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、HR 最喜欢…

机器学习---协同过滤

协同过滤&#xff08;Collaborative Filtering&#xff09;技术&#xff0c;是推荐系统中应用最为广泛的技术之一&#xff0c;协同过滤算法主要有两种&#xff0c;一种是基于用户的协同过滤算法(UserBaseCF)&#xff0c;另一种是基于物品的协同过滤算法(ItemBaseCF&#xff09;…

直接插入排序_希尔排序

文章目录 直接插入排序原理步骤视频演示代码实现特性 希尔排序原理步骤图像演示代码实现希尔排序的分析特性 直接插入排序和希尔排序的比较 直接插入排序 直接插入排序&#xff08;Straight InsertionSort&#xff09;是一种最简单的排序方法&#xff0c;其基本操作是将一条记录…

腾讯云:AI云探索之路

随着科技的飞速发展&#xff0c;人工智能(AI)云计算领域日益显现出其巨大的潜力和价值。在这个充满挑战和机遇的领域&#xff0c;腾讯云凭借其卓越的技术和创新能力&#xff0c;取得了令人瞩目的成果。本文将深入探讨腾讯云在AI云计算领域的优势&#xff0c;以及其为人工智能发…

Multi-sensor KIT-V3.0 多传感器开发板

Multi-sensor KIT-V3.0 多传感器开发板 1.前言1.1 特点 2. Multi-sensor KIT QMA8658A-EVB QMC5883评估板的扩展2.1 特点 3. Multi-sensor KIT &#xff08;QMA8658A-EVB QMC5883&#xff09; Ultrasonic-CH-X01-EVB评估板的扩展3.1 特点 4.资料资源Multi-sensor KIT-V3.0 …

基于Hadoop的农产品价格信息检测分析系统

基于Hadoop的农产品价格信息检测分析系统 前言数据处理模块1. 数据爬取2. 数据清洗与处理3. 数据存储 数据分析与检测模块1. 农产品价格趋势分析2. 农产品价格检索3. 不同市场价格对比 创新点 前言 为了更好地了解农产品市场价格趋势和不同市场之间的价格差异&#xff0c;我设…

swing快速入门(十五)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.文件对话框&#xff08;保存文件&#xff09; 2.文件对话框&#xff08;打开文件&#xff09; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class swing_tes…

飞天使-docker知识点4-harbor

文章目录 Harbor安装完成harbor 官方建议方式之后查看 images配置docker 使用harbor 仓库上传下载镜像docker 镜像结合harbor 运行 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 vmware 开源&#xff0c;其通过添加一些企业必需的功…

前后端开发鄙视链的真相,希望对从事前后端开发的小伙伴有些帮助

一、常规的工资对比 前后端的工资情况怎么样?过来人可以负责任的告诉大家:据我所知,至少在杭的网易、阿里,前端跟后端是一个批发价。

【PostgreSQL】从零开始:(二)PostgreSQL下载与安装

【PostgreSQL】从零开始:&#xff08;二&#xff09;PostgreSQL下载与安装 Winodws环境下载与安装PostgreSQL下载PostgreSQL安装PostgreSQL1.登录数据库2.查看下我们已有的数据库 Liunx环境下载与安装PostgreSQL使用YUM下载安装PostgreSQL1.下载PostgreSQL安装包2.安装PostgreS…

DCN神州数码WAF-P-2021命令行恢复出厂

注意&#xff1a;执行该命令将会清除设备的所有配置信息&#xff0c;包括网络配置、安全策略等&#xff0c;并将设备恢复到出厂设置时的默认配置。在执行该操作之前&#xff0c;请务必备份重要的设备配置信息。 Console接入波特率9600&#xff0c;输入帐号密码admin/yunke1234…