#include "EC20.h" extern uint32_t appRunTime ; extern Application app ; extern MonthUserStruct monthUserInfo ; extern NetParameter ec20NetParameter ; extern uint8_t ec20ReceBuffer[MAX_UART_BUFFER_LEN*2] ; extern uint8_t userDataReceBuffer[MAX_UART_BUFFER_LEN*4] ; extern void CleanUpBuffer(uint8_t *buf ,uint8_t len) ; extern uint8_t uart3RecBufferIndex ; extern uint8_t bleHasConfigFrame ; extern uint8_t ec20RecBufferIndex; extern volatile uint8_t userDataRecBufferIndex; extern uint8_t EC20HasSendData ; extern void SystemSoftReset( void ) ; extern void UserDataBufferReset(void) ; extern void EC20BufferReset(void) ; extern ErrorStatus UpDataToTcpSrver(enum UPDATATYPE updataType, const char* Title, uint8_t* loadBuf) ; extern volatile uint8_t serveReturnSucceedFlag ; /************************************************************************** EC20½ÓÊÕµ½Êý¾Ýºó£¬ÏÔʾÈçÏÂÊý¾Ý:/r/n +QIURC:"recv",0,5 /r/n payload +QIURC: "recv",0,5 Hello Ô¶³Ì·þÎñÆ÷¹Ø±Õºó£¬ÊÕµ½£º /r/n +QIURC: "closed",0 *********************************************************************************/ void EC20_GPIO_Init( void ) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EC20_POW_PIN; //ÎÈѹƬʹÄÜ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_ResetBits( EC20_POW_PORT, EC20_POW_PIN ) ; //³õʼ»¯EC20´¦Óڶϵç״̬£¬ºóÃæÔÙ¸øÄ£¿éÉϵç GPIO_InitStructure.GPIO_Pin = EC20_RST_PIN; //PERSTÉÏÀ­ = PE15À­µÍ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_ResetBits( EC20_RST_PORT, EC20_RST_PIN ) ; GPIO_InitStructure.GPIO_Pin = EC20_RFEN_PIN; //W_DISABLEÉÏÀ­Ê¹ÄÜRF = PB13À­µÍʹÄÜRF GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_ResetBits( EC20_RFEN_PORT, EC20_RFEN_PIN ) ; GPIO_InitStructure.GPIO_Pin = EC20_WAKEUPIN_PIN; //WAKEUP_INÐèÒªÀ­µÍ¼´PB12À­¸ß GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits( EC20_WAKEUPIN_PORT, EC20_WAKEUPIN_PIN ) ; GPIO_InitStructure.GPIO_Pin = EC20_UARTDTR_PIN; //UART_DTRÀ­µÍ½«»½ÐÑÄ£¿é == PE13À­¸ß»½ÐÑ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //UART_DTR×÷Ϊ»½ÐѵÄʱºò£¬WAKEUP_INÐèÒª±£³ÖµÍµçƽ¡£ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_ResetBits( EC20_UARTDTR_PORT, EC20_UARTDTR_PIN ) ; //³õʼ»¯ÏȲ»»½ÐÑ GPIO_InitStructure.GPIO_Pin = EC20_WAKEUPSTATE_PIN; //WAKEUP_OUTָʾģ¿éÐÝÃß״̬£»WAKEUP=0=×¢²áÍøÂç³É¹¦ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(EC20_WAKEUPSTATE_PORT, &GPIO_InitStructure); } /**************************************************************************** * Ãû ³Æ£ºvoid EC20_Module_SendCmd(char * cmd) * ¹¦ ÄÜ£ºEC20Ä£¿é·¢ËÍÃüÁî²¢²é¿´·µ»ØÖµ * ˵ Ã÷£ºÕâ¸öº¯Êý±¾ÖÊÉÏÊDZä²Îº¯Êýµ÷Óñä²Îº¯Êý£¬¹é¸ùµ½µ×ÊÇÈçºÎÄõ½¿É±äµÄ²ÎÊý¶øÒÑ * ÄÚ²¿µ÷EC20BufferReset()º¯Êý£¬½øÐнÓÊÕ»º³åÇøµÄÇå¿Õ²Ù×÷£» * ÄÚ²¿ÎªÁ˱£Ö¤·¢Ë͵ÄÃüÁîÄÜÕýÈ·Ö´ÐУ¬¶¼ÐèÒªÑÓʱ1ÃëÖÓ£»±£ÏÕÆð¼û£» * µ÷Ó÷½·¨£º ****************************************************************************/ void EC20_Module_SendCmd(uint8_t *format,...) { uint8_t temp[64] = {0}; va_list ap; va_start (ap, format); //vsprintf (temp, format, ap); //µ½´ËΪֹ£¬ËùÓеIJÎÊýÇé¿öÒѾ­»ã×ܵ½tempÁË vsnprintf(temp, 63, format, ap); EC20BufferReset() ; USART_OUT(EC20_UART,"%s",temp); va_end (ap); //WaitForNMilSeconds(4); //·¢ËÍÍêÖ¸Áîºó£¬ÐèÒªµÈ400ms Watchdog_Feed(); } ErrorStatus EC20_SendCmdAndWaitForResp(uint8_t *logTitle, const char *wantReturn, uint16_t timesout, uint8_t *cmd,... ) // uint8_t *wantReturn, { uint16_t times = 0 ; ErrorStatus status = TIMEOUT ; uint8_t temp[400] = {0}; va_list ap; va_start (ap, cmd); //vsprintf (temp, cmd, ap); //µ½´ËΪֹ£¬ËùÓеIJÎÊýÇé¿öÒѾ­»ã×ܵ½tempÁË vsnprintf(temp, 399, cmd, ap); //Uart_Print_Debug_Info(UART_LOG, logTitle) ; EC20BufferReset() ; USART_OUT(EC20_UART, "%s", temp); va_end (ap); while( times++ < timesout ) { WaitForNMilSeconds(1) ; if( strstr( (const char*)ec20ReceBuffer, wantReturn) > 0 ) { status = SUCCESS ; Uart_Print_Debug_Info( UART_LOG, "%s %s", logTitle, ec20ReceBuffer ) ; return (status) ; } else if( strstr( (const char*)ec20ReceBuffer, "ERROR" ) ) { status = ERROR ; Uart_Print_Debug_Info( UART_LOG, "%s %s", logTitle, ec20ReceBuffer ) ; return (status) ; } } Uart_Print_Debug_Info( UART_LOG, "%s %s", logTitle,(uint8_t*)"CMD Respond TimeOut!") ; return (status) ; } void EC20_POWON(void) { uint8_t findCount = 0 ; GPIO_SetBits( EC20_POW_PORT, EC20_POW_PIN ) ; while( findCount < 20) { findCount++ ; WaitForNSeconds(1) ; if(strstr(ec20ReceBuffer, "RDY")) { USART_OUT( USART1, "Power on wait:%d S\r\n", findCount ) ; break ; } } } void EC20_POWOFF(void) { GPIO_ResetBits( EC20_POW_PORT, EC20_POW_PIN ) ; WaitForNSeconds(2) ; } ErrorStatus EC20_ShutDown(void) { EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nClose Socket::", "OK", 100, (uint8_t*)EC20_CMD_CLOSESOCKET, ec20NetParameter.tcpConnectID0) ; EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nClose Socket::", "OK", 100, (uint8_t*)EC20_CMD_CLOSESOCKET, ec20NetParameter.tcpConnectID1) ; EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nDeactive TcpContext:", "OK", 20, (uint8_t*)EC20_CMD_DEACTCONTEXT, ec20NetParameter.tcpContextID ) ; EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nDeactive HttpContext:", "OK", 20, (uint8_t*)EC20_CMD_DEACTCONTEXT, ec20NetParameter.httpContextID ) ; EC20_POWOFF() ; } void EC20_WAKEUP(void) { GPIO_SetBits( EC20_UARTDTR_PORT, EC20_UARTDTR_PIN ) ; Wait_For_N_10ms(20) ; //UART_DTRÀ­µÍ200ms GPIO_ResetBits( EC20_UARTDTR_PORT, EC20_UARTDTR_PIN ) ; WaitForNSeconds(3) ; } void EC20_Net_Init(void) { ec20NetParameter.tcpContextID = 1 ; //ÓÃÓÚTCP ec20NetParameter.tcpConnectID0 = 0 ; //³öÈë¿Ú ec20NetParameter.tcpConnectID1 = 1 ; //ÓÕµ¼ÅÆ ec20NetParameter.tcpLocalPort = 0 ; ec20NetParameter.httpContextID = 2 ; //ÓÃÓÚHTTP } ErrorStatus EC20_Handshake( void ) { uint8_t waitTimes = 0, retryTimes = CMD_RETRY_TIMES ; ErrorStatus HandshakeStatus = ERROR ; while( 0 < retryTimes-- ) { EC20_Module_SendCmd(EC20_CMD_HANDSHAKE); Wait_For_N_10ms( 10+( CMD_RETRY_TIMES-retryTimes)*10 ); Watchdog_Feed() ; while( waitTimes++ < 4 ) { if( strstr( (const char*)ec20ReceBuffer,"OK") ) { Uart_Print_String( USART1, (uint8_t*)"EC20 Handshake OK!\r\n" ) ; HandshakeStatus = SUCCESS ; return (HandshakeStatus) ; } Wait_For_N_10ms( 10+( CMD_RETRY_TIMES-retryTimes)*10 ) ; Watchdog_Feed() ; } } Uart_Print_String(USART1, (uint8_t*)"\r\nEC20 Handshake error!\r\n") ; USART_OUT( UART_LOG, "Ä£¿éÎÕÊÖʧ°Ü£¬Çë¼ì²éÄ£¿é°²×°¡£") ; return (HandshakeStatus) ; } uint8_t* EC20_Voltage(void) { uint8_t *start ; uint8_t *end ; EC20_Module_SendCmd( EC20_QUERY_VOLTAGE ) ; WaitForNMilSeconds(3) ; if( strstr((const char*)ec20ReceBuffer, "+CBC") ) { start = strrchr( (const char*)ec20ReceBuffer, ',' ) ; end = strchr( (const char*)start, 0x0D ) ; *end = 0x00 ; //CopyValues(ec20ReceBuffer, start, 0x0D, 50) ; return (start+1) ; } return 0 ; } ErrorStatus EC20_CloseEcho(void) { uint8_t retryTimes = 3 ; //EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nOpen EC20 AtEcho:", "OK", 30, (uint8_t*)EC20_CMD_OPENECHO) ; //EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nSave Close AtEcho:", "OK", 30, (uint8_t*)EC20_SAVE_CONFIG) ; EC20_Module_SendCmd( EC20_QUERY_CONFIG ) ; WaitForNMilSeconds(3) ; if( kmp(ec20ReceBuffer,"E: 0") > 0) return (SUCCESS) ; else { while( 0 < retryTimes-- ) { if( (SUCCESS == EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nClose EC20 AtEcho:", "OK", 30, (uint8_t*)EC20_CMD_CLOSEECHO)) &&(SUCCESS == EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nQuery EC20 AtEcho:", "E: 0", 30, (uint8_t*)EC20_QUERY_CONFIG) )) { // EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nSave Close AtEcho:", "OK", 30, (uint8_t*)EC20_SAVE_CONFIG) ; //ΪÁ˼æÈÝÇ°Ãæ°æ±¾£¬²»±£´æ return (SUCCESS) ; } } } return (ERROR) ; } char* EC20_Query_NetInfo(void) { uint8_t *start, *end ; EC20_Module_SendCmd( EC20_QUERY_NETINFO ) ; WaitForNMilSeconds(3) ; if( strstr((const char*)ec20ReceBuffer, "+QNWINFO") ) { start = strchr( (const char*)ec20ReceBuffer, ':' ) ; end = strchr((const char*)start, 0x0D) ; *end = 0x00 ; //CopyValues(ec20ReceBuffer, start, 0x0D, 50) ; return (start+3) ; } return 0 ; } ErrorStatus EC20_ActivateTcpPDP(void) { ErrorStatus status = ERROR ; if( SUCCESS != EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nConfigure TCPContext:", "OK", 10, (uint8_t*)EC20_SET_CFGCONTEXT, ec20NetParameter.tcpContextID ) ) { return ERROR ; } status = EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nActivate TcpContext:", "OK", 1500, (uint8_t*)EC20_CMD_ACTCONTEXT, ec20NetParameter.tcpContextID ) ; if( SUCCESS == status ) { USART_OUT( UART_LOG, "Activate TcpContextt Success!") ; } else if( ERROR == status ) //1500*100ms { USART_OUT( UART_LOG, "Activate TcpContextt Fail!") ; return ERROR ; } else if( TIMEOUT == status ) { USART_OUT( UART_LOG, "Activate TcpContextt TimeOut!") ; return TIMEOUT ; } status = EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nActivate TcpContext STATE:", "+QIACT: 1,1", 10 ,(uint8_t*)EC20_QUERYSTATE_CONTEXE) ; return (status) ; } ErrorStatus EC20_ActivateHttpPDP(void) { ErrorStatus status = ERROR ; if( SUCCESS != EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nConfigure HttpContext:", "OK", 20, (uint8_t*)EC20_SET_CFGCONTEXT, ec20NetParameter.httpContextID ) ) { return ERROR ; } status = EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nActivate Context:", "OK", 1500, (uint8_t*)EC20_CMD_ACTCONTEXT, ec20NetParameter.httpContextID ) ; if( ERROR == status ) //1500*100ms { USART_OUT( UART_LOG, "Activate HttpContextt Fail!") ; return ERROR ; } else if( TIMEOUT == status ) { USART_OUT( UART_LOG, "Activate HttpContextt TimeOut!") ; return TIMEOUT ; } status = EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nQuery HttpContext STATE:", "+QIACT: 2,1", 10 ,(uint8_t*)EC20_QUERYSTATE_CONTEXE) ; return (status) ; } ErrorStatus EC20_OpenSocket( uint8_t *ipAddress, uint16_t portNum, uint8_t connectID) { uint8_t times = 0 ; uint16_t index = 0 ; ErrorStatus status = TIMEOUT ; /*´ÎÃüÁî»ØÂëÒѾ­³¬¹ý64×Ö½Úµ¼ÖÂÔÚstrstr±È¶ÔʱǰÃæ»á³öÏÖ0X00£¬ËùÒÔ½«ec20ReceBuffer¿Õ¼äÔö¼Óµ½128bytes*/ EC20_SendCmdAndWaitForResp((uint8_t*)"´ò¿ªSocket:", "+QIOPEN:", 200, (uint8_t*)EC20_CMD_OPENSOCKET, ec20NetParameter.tcpContextID, connectID, "TCP", ipAddress, portNum, ec20NetParameter.tcpLocalPort, 1 ) ; if(strstr((const char*)ec20ReceBuffer, "+QIOPEN: 0,0") > 0 ) { return (SUCCESS) ; } else { return (ERROR) ; } } void EC20_Query_CSQ(uint8_t* csq) { uint8_t times = 0 ; char* start ; memset(csq, 0, CSQ_LEN+1); EC20_Module_SendCmd( (uint8_t *)EC20_QUERY_CSQ ) ; Wait_For_N_10ms(5) ; ; while( times < 10 ) { WaitForNMilSeconds(1) ; if( strstr((const char*)ec20ReceBuffer, "+CSQ") ) { start = strchr( (const char*)ec20ReceBuffer, ':' ) ; //end = strcpy( ec20ReceBuffer,',' ) ; strncpy( (char*)csq, (start+1),CSQ_LEN ) ; break ; } times++ ; } csq[CSQ_LEN] = 0x00 ; } ErrorStatus EC20_Query_SimImsi(char* simIMSI) { uint8_t times = 0 ; ErrorStatus result = ERROR ; char* start ; memset(simIMSI, 0, SIMID_LEN+1); EC20_Module_SendCmd( (uint8_t *)EC20_QUERY_IMSI ) ; WaitForNMilSeconds(1) ; while( times++ < 20) { WaitForNMilSeconds(1) ; if( strstr((const char*)ec20ReceBuffer, "OK") ) { start = strrchr( (const char*)ec20ReceBuffer, 'I' ) ; strncpy( (char*)simIMSI, (start+4),SIMID_LEN ) ; simIMSI[SIMID_LEN] = 0x00 ; return SUCCESS ; } Watchdog_Feed(); } return result ; } ErrorStatus EC20_Query_SimIccid(char* simICCID) { uint8_t times = 0 ; ErrorStatus result = ERROR ; char* start ; memset(simICCID, 0, ICCID_LEN+1); EC20_Module_SendCmd( (uint8_t *)EC20_QUERY_ICCID ) ; WaitForNMilSeconds(1) ; while( times++ < 20) { WaitForNMilSeconds(1) ; if( strstr((const char*)ec20ReceBuffer, "OK") ) { start = strrchr( (const char*)ec20ReceBuffer, 'I' ) ; CopyValues((start+4), (char*)simICCID, 0x0D, 25) ; //strncpy( (char*)simICCID, (start+4),ICCID_LEN ) ; simICCID[ICCID_LEN] = 0x00 ; return SUCCESS ; } Watchdog_Feed(); } return result ; } ErrorStatus EC20_Query_SoftRelese(char* moduleSoftVer) { uint8_t times = 0 ; ErrorStatus result = ERROR ; char* start ; memset(moduleSoftVer, 0, EC20VERLEN+1); EC20_Module_SendCmd( (uint8_t *)EC20_QUERY_SOFTRELEASE ) ; WaitForNMilSeconds(1) ; while( times++ < 3) { WaitForNMilSeconds(1) ; if( strstr((const char*)ec20ReceBuffer, "OK") ) { start = strchr( (const char*)ec20ReceBuffer, 0x0D) ; CopyValues((start+2), (char*)moduleSoftVer, 0x0D, EC20VERLEN) ; moduleSoftVer[EC20VERLEN] = 0x00 ; return SUCCESS ; } } return result ; } ErrorStatus EC20_SendData( uint8_t connectID, uint8_t* sendDataBuf, uint16_t len) { uint8_t times = 0, enableSendData = 0; ErrorStatus status = ERROR; if( len > 260 ) //Ç¿ÖÆÊý¾Ý³¤¶ÈҪСÓÚ260bytes len = 260 ; EC20_Module_SendCmd((uint8_t*)EC20_CMD_QISEND, connectID, len); while( times++ < 70 ) { Wait_For_N_10ms(2) ; Watchdog_Feed(); if( strstr((const char*)ec20ReceBuffer, ">") ) { enableSendData = 1 ; break ; } } Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nTcp Start Send Data!\r\n") ; EC20BufferReset() ; if( enableSendData == 1 ) { EC20Uart_Send_Package(EC20_UART,sendDataBuf,len); times = 0 ; enableSendData = 0 ; while( times < 100 ) //80*40MS×óÓÒ { Watchdog_Feed() ; Wait_For_N_10ms(5) ; if( strstr( (const char*)ec20ReceBuffer, "SEND OK")) { status = SUCCESS ; app.tcpFailCounter = 0 ; Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nTcp Succeed Send Data!\r\n") ; break ; } else if( strstr( (const char*)ec20ReceBuffer, "ERROR")) { SaveLogToFlash( "EC20 ERROR Send Data!/" ) ; Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"Tcp ERROR Send Data!\r\n") ; break ; } times++ ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nTcp No \">\" Flag!\r\n") ; SaveLogToFlash( "EC20 No \">\" Flag!/" ) ; Uart_Print_Debug_Info(UART_LOG, (uint8_t *)"\r\nec20RecBufferIndex is %d\r\n",ec20RecBufferIndex); Uart_Print_Debug_Info(UART_LOG, ec20ReceBuffer); } if((status == ERROR)&&(connectID == 0)) //Ö»¶Ô³öÈë¿Ú¹¦ÄܵÄsocket½øÐÐά»¤£¬ÓÕµ¼ÅÆsocket²»Î¬»¤ { app.tcpFailCounter++ ; if( (app.tcpFailCounter != 0)&&(app.tcpFailCounter != 1 )) { app.tcpFailCounter = 0 ; SetTcpNetState(&app, DISCONNECT ); //±íʾÊý¾Ý·¢ËÍʧ°Ü£¬·þÎñÆ÷socket¹Ø±ÕÁË } Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nec20RecBufferIndex is %d 4G Fail Send Data!\r\n",ec20RecBufferIndex) ; Uart_Print_Debug_Info(UART_LOG,ec20ReceBuffer); } if( connectID == 0) { EC20HasSendData = 1 ;//±êÖ¾EC20ÒѾ­·¢Ë͹ýÊý¾ÝÁË£¬Ó°ÏìÐÄÌø°ü·¢ËÍ } return (status) ; } void EC20Uart_Send_Package(USART_TypeDef* USARTx, const uint8_t *Data, uint16_t len) { uint16_t index = 0; const uint8_t *pos = Data; for(index = 0; index < len; index++) { USART_SendData(USARTx, *(pos+index)); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET); } } ErrorStatus EC20_QueryCsServiceStatus(void) { uint8_t times = 0 ; int index = 0 ; ErrorStatus result = ERROR ; EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nSet CSsever:", "OK", 2, (uint8_t*)EC20_SET_CSSERVICE ); while( times < 30 ) { EC20_Module_SendCmd( (uint8_t *)EC20_QUERY_CSSERVICE ) ; WaitForNSeconds(3) ; index = kmp(ec20ReceBuffer,(const uint8_t *)"+CREG:") ; if( (index > 0)&&( (ec20ReceBuffer[index+9] == 0x31)||( ec20ReceBuffer[index+9] == 0x35) ) ) { result = SUCCESS ; USART_OUT(USART1,(uint8_t*)"\r\nReg CS Succeed!") ; return (result) ; } times++ ; } return (result) ; } ErrorStatus EC20_QueryPsServiceStatus(void) { uint8_t times = 0 ; ErrorStatus result = ERROR ; int index = 0 ; EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nSet PSsever:", "OK", 2, (uint8_t*)EC20_SET_PSSERVICE); while( times++ < 20 ) { EC20_Module_SendCmd( (uint8_t *)EC20_QUERY_PSSERVICE ) ; WaitForNSeconds(3) ; index = kmp(ec20ReceBuffer,(const uint8_t *)"+CGREG:") ; if( (index > 0)&&(( ec20ReceBuffer[index+10] == 0x31)||( ec20ReceBuffer[index+10] == 0x35) )) { result = SUCCESS ; USART_OUT(USART1,(uint8_t*)"\r\nReg PS Succeed!") ; return (result) ; } } Uart_Print_Debug_Info(USART1,(uint8_t*)"\r\nReg PS Fail!") ; return (result) ; } ErrorStatus EC20_Module_Init( void ) { ErrorStatus result = ERROR ; EC20_Net_Init() ; #if defined APP0_CODE uint8_t screenBufICCID[ICCID_LEN+11] = {0}; EC20_GPIO_Init() ; EC20_POWON() ; DisplaySystemInfo("ÎÕÊÖÖÐ:") ; if( SUCCESS != EC20_Handshake() ) { DisplaySystemStatus("Çë¼ì²éÄ£¿é°²×°") ; return ERROR ; } if( SUCCESS == EC20_Query_SimIccid((char*)app.simICCID) ) //»ñÈ¡SIMID { snprintf(screenBufICCID, ICCID_LEN+10, "SIM ICCID:%s", app.simICCID) ; DisplaySystemStatus(screenBufICCID) ; USART_OUT(UART_LOG, screenBufICCID ) ; } else { USART_OUT( UART_LOG, "»ñÈ¡SIM¿¨ºÅʧ°Ü!") ; } USART_OUT(UART_LOG, "\r\n") ; #endif if( SUCCESS != EC20_CloseEcho()) { DisplaySystemStatus("¹Ø±Õ»ØÏÔ´íÎó") ; WaitForNSeconds(3) ; EC20_POWOFF() ; SystemSoftReset() ; } if( SUCCESS == EC20_Query_SoftRelese((char *)app.ec20SoftVer) ) { USART_OUT(UART_LOG, (uint8_t *)"EC20 Module SoftVersion:%s", app.ec20SoftVer ) ; } else { USART_OUT(UART_LOG, (uint8_t *)"EC20 Query Module SoftVersion Failed" ) ; } return (SUCCESS) ; } ErrorStatus EC20_TCPInit( void ) { ErrorStatus result = SUCCESS ; uint8_t times = 0 , screenBufCsq[13] = {0}; #if defined APP0_CODE DisplaySystemInfo("ÈëÍøÖÐ:") ; EC20_QueryCsServiceStatus() ; EC20_QueryPsServiceStatus() ; if( SUCCESS != EC20_ActivateTcpPDP() ) { if( SUCCESS == EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nDeactive TcpContext:", "OK", 20, (uint8_t*)EC20_CMD_DEACTCONTEXT, ec20NetParameter.tcpContextID ) ) { WaitForNSeconds(1) ; if( SUCCESS != EC20_ActivateTcpPDP() ) { SaveLogToFlash("TCP Restart ActPDP Failed!/") ; EC20_POWOFF() ; SystemSoftReset() ; return ERROR ; } } else { SaveLogToFlash("TCP Restart DeactPDP Failed!/") ; DisplaySystemStatus("Çë¼ì²éSIM¿¨×Ê·Ñ£¬ÌìÏß°²×°") ; EC20_POWOFF() ; SystemSoftReset() ; return ERROR ; } } DisplaySystemStatus("SIM¿¨OK") ; #endif DisplaySystemInfo("Á¬½ÓÖÐ:") ; for( int i = 0; i= 0 ) //EC20¸Ã°æ±¾ÐèÒªÔö¼ÓÏÂÃæÖ¸Áî { if( SUCCESS != EC20_SendCmdAndWaitForResp( (uint8_t*)"\r\nSet Http WaitTime:", "OK", 2, (uint8_t*)EC20_SET_HTTPCLOSETIME) ) continue ; } if( failTimes >= 2 ) return ERROR ; else break ; } //EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nDeactive HttpContext:", "OK", 10, (uint8_t*)EC20_CMD_DEACTCONTEXT, ec20NetParameter.httpContextID ) ; if( SUCCESS != EC20_ActivateHttpPDP() ) { if( SUCCESS == EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nDeactive HttpContext:", "OK", 10, (uint8_t*)EC20_CMD_DEACTCONTEXT, ec20NetParameter.httpContextID ) ) { WaitForNSeconds(1) ; if( SUCCESS != EC20_ActivateHttpPDP() ) { SaveLogToFlash("HTTP ActPDP Failed!/") ; EC20_ShutDown() ; SystemSoftReset() ; return ERROR ; } } else { SaveLogToFlash("HTTP DeactPDP Failed!/") ; DisplaySystemStatus("Çë¼ì²éSIM¿¨×Ê·Ñ£¬ÌìÏß°²×°") ; EC20_ShutDown() ; SystemSoftReset() ; return ERROR ; } } failTimes = 0 ; while( failTimes++ < 2 ) { status = EC20_SendCmdAndWaitForResp((uint8_t *)"\r\nSet Post Url:", "CONNECT", 80, (uint8_t*)EC20_CMD_HTTPURL,32 ) ; if( SUCCESS == status ) { status = EC20_SendCmdAndWaitForResp((uint8_t*)"\r\nHttpURL:", "OK", 50, (uint8_t*)CARNUM_HTTPPOST_URL) ; if( SUCCESS == status ) { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nSet Post Url Succeed!") ; break ; } } WaitForNSeconds(1) ; } return status ; } ErrorStatus EC20_CarNumPostRequest( bool lacalCar, const uint8_t *carNum, const uint8_t carNumType ) { uint8_t timeOut = 0, carType[6] = {0} ; char *postPos ; ErrorStatus status = ERROR ; uint16_t requestLen = 238 ; //Heard+BodyµÄ×ܳ¤¶È£¬0X0D 0X0AÒ²ËãÔÚÄÚ uint8_t bodyLen = 62, addLen = 0 ; uint8_t macAddress24Bytes[25] = {0} ; if( carNumType == 0x02 ) strncpy( carType, "true" , 4) ; //Ãæ°ü³µ else strncpy( carType, "false" , 5) ; //ÆäÓà³µÁ¾×÷ΪС³µ´¦Àí GetDeviceMacAddress(macAddress24Bytes, 24) ; macAddress24Bytes[24] = 0x00 ; addLen = strlen(carNum) + strlen(carType) ; requestLen = requestLen + addLen ; bodyLen = bodyLen + addLen ; if( lacalCar == true ) //±¾µØ°üÔ³µÇëÇó { requestLen += 9 ; } status = EC20_SendCmdAndWaitForResp((uint8_t *)"\r\n Start Send PostReq:", "CONNECT", 40, (uint8_t*)EC20_CMD_HTTPPOSTLEN, requestLen) ; if( SUCCESS == status) { if( lacalCar == false ) //·Ç±¾µØ°üÔ³µÇëÇó { status = EC20_SendCmdAndWaitForResp((uint8_t *)"\r\nSend Post Json:", "+QHTTPPOST: 0,200", 80, (uint8_t*)CARNUM_HTTPPOST_HEADERBODY, bodyLen, carNum, macAddress24Bytes, carType ) ; } else //±¾µØ°üÔ³µÇëÇó { status = EC20_SendCmdAndWaitForResp((uint8_t *)"\r\nSend Post Json:", "+QHTTPPOST: 0,200", 80, (uint8_t*)LOCALCARNUM_HTTPPOST_HEADERBODY, bodyLen, carNum, macAddress24Bytes, carType ) ; } if( SUCCESS == status ) { return SUCCESS ; } else { return (status) ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nFailed Send PostReq!") ; return (status) ; } } ErrorStatus EC20_MonthUserPostRequest(void) { uint8_t timeOut = 0 ; char *postPos ; ErrorStatus status = ERROR ; uint8_t n = 0 ; uint8_t groupCounter[2] = {0} ; monthUserInfo.carNumAddr = VIP_FLASH_CARNUM_ADDR ; monthUserInfo.flashOffset = 0 ; memset(monthUserInfo.carNumBuf, 0, CARNUMBUFLEN*20) ; uint8_t macAddress24Bytes[25] = {0} ; GetDeviceMacAddress(macAddress24Bytes, 24) ; macAddress24Bytes[24] = 0x00 ; if( SUCCESS == EC20_SendCmdAndWaitForResp((uint8_t *)"\r\n Start Send PostReq:", "CONNECT", 40, (uint8_t*)EC20_CMD_HTTPPOSTLEN, 215)) { status = EC20_SendCmdAndWaitForResp((uint8_t *)"\r\nSend Post Json:", "+QHTTPPOST: 0,200", 80, (uint8_t*)MONTHUSERSUM_HTTPPOST_HEADERBODY, macAddress24Bytes ) ; if( SUCCESS == status ) { WaitForNSeconds(1) ; if( SUCCESS == EC20_PostReadData()) { postPos = strstr(userDataReceBuffer, "body") ; CopyValues((postPos+6), groupCounter,'.', 2); monthUserInfo.groupSum = atoi(groupCounter) ; if( monthUserInfo.groupSum > 20) //×î¶à20*200=4000bytes ¶Ñ´óСÐèÒª´óÓÚ4K { monthUserInfo.groupSum = 20 ; UpDataToTcpSrver(WARNINGFRAME, (const char*)"MonthUser:", (uint8_t *)"Sum Overflow!") ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nReq MonthUser Sum Failed!") ; SaveLogToFlash("Req MonthUser Sum Failed!!/") ; return (ERROR) ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nnRead MonthUser Sum Failed!") ; SaveLogToFlash("nRead MonthUser Sum Failed!!/") ; return (status) ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nReq MonthUser Sum Failed!") ; SaveLogToFlash("Req MonthUser Sum Failed!!/") ; return ERROR ; } for( n = 0; n<=monthUserInfo.groupSum; n++) { if( SUCCESS == EC20_SendCmdAndWaitForResp((uint8_t *)"\r\n Start Send PostReq:", "CONNECT", 40, (uint8_t*)EC20_CMD_HTTPPOSTLEN, 223)) { status = EC20_SendCmdAndWaitForResp((uint8_t *)"\r\nSend Post Json:", "+QHTTPPOST: 0,200", 60, (uint8_t*)MONTHUSERLIST_HTTPPOST_HEADERBODY, macAddress24Bytes, n ) ; if( SUCCESS == status ) { WaitForNSeconds(1) ; if( SUCCESS == EC20_PostReadData()) { postPos = strstr(userDataReceBuffer, "body") ; CopyValues((postPos+7), monthUserInfo.carNumBuf+monthUserInfo.flashOffset,',', CARNUMBUFLEN-1); monthUserInfo.flashOffset = strlen( monthUserInfo.carNumBuf) ; //monthUserInfo.flashOffset = monthUserInfo.flashOffset+strlen( monthUserInfo.carNumBuf ) ; } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nRead MonthUser CarNum Failed!") ; SaveLogToFlash("Read MonthUser CarNum Failed!!/") ; return (ERROR) ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nReq MonthUser CarNum Failed!") ; SaveLogToFlash("Req MonthUser CarNum Failed!!/") ; return (status) ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nReq MonthUser CarNum Failed!") ; SaveLogToFlash("Req MonthUser CarNum Failed!!/") ; return (ERROR) ; } } FLASH_ErasePage( monthUserInfo.carNumAddr ) ; FLASH_ErasePage( monthUserInfo.carNumAddr + 2048) ; //²Á³ýÏàÁÚÁ½Ò³ Ò»¹²4K´æ´¢°üÔ³µÅÆ¿Õ¼ä Save_to_Flash( monthUserInfo.carNumAddr, monthUserInfo.carNumBuf, monthUserInfo.flashOffset) ; FLASH_Lock() ; UpDataToTcpSrver( LOGFRAME, "MonthUser:", (uint8_t*)"±¾µØ°üÔ³µÍ¬²½³É¹¦" ) ; return (SUCCESS) ; } ErrorStatus EC20_RegPostRequest(void) { uint8_t times = 0, timeOut = 0 ; ErrorStatus status = ERROR ; uint16_t requestLen = 191 ; //Heard+BodyµÄ×ܳ¤¶È£¬0X0D 0X0AÒ²ËãÔÚÄÚ uint8_t bodyLen = 10, addlen = 0 ; uint8_t macAddress24Bytes[25] = {0} ; char *postPos ; GetDeviceMacAddress(macAddress24Bytes, 24) ; macAddress24Bytes[24] = 0x00 ; addlen = strlen(macAddress24Bytes) ; requestLen = requestLen + addlen ; bodyLen = bodyLen + addlen ; status = EC20_SendCmdAndWaitForResp("\r\n Start Send PostReq:", "CONNECT", 40, (uint8_t*)EC20_CMD_HTTPPOSTLEN, requestLen) ; if( SUCCESS == status ) { status = EC20_SendCmdAndWaitForResp("\r\nSend Post Req:", "+QHTTPPOST: 0,200", 70, (uint8_t*)REG_HTTPPOST_HEADERBODY, bodyLen, macAddress24Bytes ) ; if( SUCCESS == status) { return SUCCESS ; } else { return (status) ; } } else { Uart_Print_Debug_Info( UART_LOG, (uint8_t *)"\r\nFailed Send PostReq!") ; return (status) ; } } ErrorStatus EC20_PostReadData( void ) { uint8_t timeOut = 0 ; ErrorStatus status = TIMEOUT ; SetEC20WorkMode( &app, USER_MODE ) ; UserDataBufferReset() ; serveReturnSucceedFlag = 0x00 ; EC20_Module_SendCmd((uint8_t*)EC20_QUERY_HTTPPOSTDATA); for( timeOut = 0; timeOut < 70; timeOut++ ) //Èë¿Úʵ¼Ê160MS--720MSÖ®¼ä;³ö¿Ú1920ms£¬¸ù¾ÝÍø·Çé¿ö { if( serveReturnSucceedFlag == 0x01 ) { serveReturnSucceedFlag = 0x00 ; status = SUCCESS ; break ; } Wait_For_N_10ms(2) ; Watchdog_Feed(); } SetEC20WorkMode( &app, AT_MODE ) ; return status ; } /************************************************************************** EC20³õʼ»¯Á÷³Ì£º 1¡¢IO³õʼ»¯¡£ 2¡¢4GÄ£¿éÉϵ硣µÈ´ýÉϵçÍê³É£¬Í³¼ÆÉϵçʱ¼ä¡£ ×î¶à20S ¡£ 3¡¢ÍøÂç²ÎÊý³õʼ»¯¡£ 4¡¢ÏÔʾÆÁÏÔʾ¡°É豸ÈëÍøÖС ¡±¡£ 5¡¢MCUÓë4GÄ£¿é ATÎÕÊÖ£¬·µ»ØÊÇ·ñ³É¹¦¡£ 6¡¢»ñÈ¡SIM¿¨×´Ì¬£¬·µ»Ø½á¹û¡£ 7¡¢»ñÈ¡ÍøÂç״̬¡£ 8¡¢¿ªÆôRF ¡£ 9¡¢»ñÈ¡CS Sever״̬£¬·µ»Ø½á¹û¡£ 10¡¢»ñÈ¡PS Sever״̬£¬·µ»Ø½á¹û¡£ *********************************************************************************/