/**************************************************************************** * * Copy right: Qx.Chen jie * File name: TcpTask.c * Description: 网络发送接收任务 * History: 2021-03-07 * ****************************************************************************/ #include "bsp.h" #include "bsp_custom.h" #include "osasys.h" #include "ostask.h" #include "queue.h" #include "ps_event_callback.h" #include "app.h" #include "cmisim.h" #include "cmimm.h" #include "cmips.h" #include "sockets.h" #include "psifevent.h" #include "ps_lib_api.h" #include "lwip/netdb.h" //#include #include "debug_log.h" #include "slpman_ec616.h" #include "plat_config.h" #include "ec_tcpip_api.h" #include "MainTask.h" #include "TcpTask.h" #include "UartTask.h" #include "GpsTask.h" #include "Fota.h" #include "Signal.h" //全局变量输出区 UINT32 TcpService = 0; UINT8 WorkFlag=0; //全局变量输入区 extern UINT32 Timer_count; extern volatile BOOL Sleep_flag; extern osMutexId_t GpsMutex; extern UINT8 GpsData[20]; extern AppNVMDataType AppNVMData; extern AppDataBody AppDataInfo; extern QueueHandle_t UartWriteCmdHandle; extern BOOL UartBattInfoRecvFlag; //局部变量申请 AppSocketConnectionContext socContext = {-1, APP_SOCKET_CONNECTION_CLOSED}; static StaticTask_t gProcess_Tcp_Task_t; static UINT8 gProcess_Tcp_TaskStack[PROC_TCP_TASK_STACK_SIZE]; static QueueHandle_t psEventQueueHandle;//状态转换队列句柄 static osThreadId_t TcpTaskId = NULL; static process_TCP gProcess_Tcp_Task = PROCESS_TCP_STATE_IDLE; #define PROC_TCP_STATE_SWITCH(a) (gProcess_Tcp_Task = a) static eventCallbackMessage_t *queueItem = NULL; static UINT8 gImsi[16] = {0}; static UINT32 gCellID = 0; static QueueHandle_t TcpRecvHandle = NULL; static UINT8 TcpRecvEnd = 0; //Tcp线程堆栈申请区 //函数声明区 static void sendQueueMsg(UINT32 msgId, UINT32 xTickstoWait); static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen); static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEvent); static void TcpDataInfoAssembleSend(); static void TcpDataInfoRecvHandle(); UINT8 bcc_chk(UINT8* data, UINT8 length); //线程任务区 static void TcpTask(void* arg) { appSetEDRXSettingSync(0,5,1800000); appSetPSMSettingSync(1,3*60*60,10); appSetCFUN(1); psEventQueueHandle = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(eventCallbackMessage_t*)); PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE); if (psEventQueueHandle == NULL) { return; } if(TcpRecvHandle == NULL) { TcpRecvHandle = osMessageQueueNew(1,sizeof(TcpipConnectionRecvDataInd*), NULL); } if(Error_Mutex == NULL) { Error_Mutex = osMutexNew(NULL); } osDelay(5000);//等待驻网延时5s while (true) { osDelay(100); if(Sleep_flag) { sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0); sendQueueMsg(QMSG_ID_SOCK_EXIT, 0); } else if(Timer_count%50==0 && TcpService==0x00 && AppNVMData.EOLState==1) { sendQueueMsg(QMSG_ID_SOCK_SENDPKG, 0); } else if(Timer_count%10==0) { TcpRecvEnd++; } if(TcpRecvEnd>=20) { TcpService = 0x00; TcpRecvEnd=0; } if (xQueueReceive(psEventQueueHandle, &queueItem, 0)) { switch(queueItem->messageId) { case QMSG_ID_NW_IP_READY: if(socContext.id < 0) { struct addrinfo hints; struct addrinfo *servinfo = NULL; char *Tcp_ip_des; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; getaddrinfo(QX_TCP_ADD, NULL, &hints, &servinfo); Tcp_ip_des = ip4addr_ntoa((const ip4_addr_t *)(&(servinfo->ai_addr->sa_data[2]))); #ifdef USING_PRINTF1 printf("\nservinfo-%d:\n",servinfo->ai_addr->sa_len); for(int i=0;i<4;i++) printf("%d ",servinfo->ai_addr->sa_data[2+i]); printf("\nTcp_ip_des-%d:\n",sizeof(Tcp_ip_des)); for(int i=0;i<16;i++) printf("%c",*(Tcp_ip_des+i)); #endif socContext.id = tcpipConnectionCreate(TCPIP_CONNECTION_PROTOCOL_TCP, PNULL, 0, Tcp_ip_des, QX_TCP_PORT, socketAppConnectionCallBack); if (NULL != servinfo) { freeaddrinfo(servinfo); } } if(socContext.id >= 0) { socContext.status = APP_SOCKET_CONNECTION_CONNECTED; #ifdef USING_PRINTF printf("create connection %u success", socContext.id); #endif ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_2, P_INFO, 1, "create connection %u success", socContext.id); } else { sendQueueMsg(QMSG_ID_NW_IP_NOREACHABLE, 0); #ifdef USING_PRINTF printf("create connection fail\n"); #endif ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_3, P_ERROR, 0, "create connection fail"); } break; case QMSG_ID_NW_IP_NOREACHABLE: { Error_count++; appSetCFUN(0); osDelay(5000); appSetCFUN(1); osDelay(5000); } break; case QMSG_ID_SOCK_SENDPKG: if (socContext.id >= 0 && socContext.status == APP_SOCKET_CONNECTION_CONNECTED) { TcpDataInfoAssembleSend(); } else { sendQueueMsg(QMSG_ID_NW_IP_READY, 0); #ifdef USING_PRINTF printf("connection %u or status invalid", socContext.id, socContext.status); #endif ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_9, P_ERROR, 2, "connection %u or status invalid", socContext.id, socContext.status); } break; case QMSG_ID_SOCK_RECVPKG: TcpDataInfoRecvHandle(); osDelay(100); TcpRecvEnd = 0; break; case QMSG_ID_NW_IP_SUSPEND: if (socContext.id >= 0 && socContext.status != APP_SOCKET_CONNECTION_CLOSED) { if(tcpipConnectionClose(socContext.id) < 0) { socContext.id = -1; socContext.status = APP_SOCKET_CONNECTION_CLOSED; #ifdef USING_PRINTF printf("close connection %u success", socContext.id); #endif ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_4, P_INFO, 1, "close connection %u success", socContext.id); } else { #ifdef USING_PRINTF printf("close connection %u fail", socContext.id); #endif ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_5, P_ERROR, 1, "close connection %u fail", socContext.id); } } else { #ifdef USING_PRINTF printf("connection %u or status invalid", socContext.id, socContext.status); #endif ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_6, P_ERROR, 2, "connection %u or status invalid", socContext.id, socContext.status); } break; case QMSG_ID_SOCK_EXIT: #ifdef USING_PRINTF printf("QMSG_ID_SOCK_EXIT queueItem->messageId:%x\n",queueItem->messageId); #endif #ifdef USING_PRINTF printf("socket exit\n"); #endif appSetCFUN(0); free(queueItem); osDelay(1000); TcpTaskDeInit(arg); break; } free(queueItem); } }//while 循环 } //Tcp线程初始化 void TcpTaskInit(void *arg) { osThreadAttr_t task_attr; registerPSEventCallback(NB_GROUP_ALL_MASK, socketRegisterPSUrcCallback); memset(&task_attr,0,sizeof(task_attr)); memset(gProcess_Tcp_TaskStack, 0xA5, PROC_TCP_TASK_STACK_SIZE); task_attr.name = "Tcp_Task"; task_attr.stack_mem = gProcess_Tcp_TaskStack; task_attr.stack_size = PROC_TCP_TASK_STACK_SIZE; task_attr.priority = osPriorityBelowNormal7; task_attr.cb_mem = &gProcess_Tcp_Task_t; task_attr.cb_size = sizeof(StaticTask_t); TcpTaskId = osThreadNew(TcpTask, NULL, &task_attr); } void TcpTaskDeInit(void *arg) { osThreadTerminate(TcpTaskId); TcpTaskId = NULL; } /*------------------------------函数区域----------------------------------------------------------------------------------------------*/ static void TcpDataInfoAssembleSend() { static UINT32 send_counter = 0; OsaUtcTimeTValue TimeStracture; UINT8 csq=0; INT8 snr=0; INT8 rsnr=0; INT16 Batt_current=0; UINT16 BattU=0; UINT8 temp=0; UINT16 DataLen=0; UINT8 BattSendFreq=6; UINT8 GpsSendFreq=1; UINT8 WorkState=0; UINT16 year; UINT8 month,day,hour,minute,sec; UINT16 ErrorTemp; UTC8TimeType UTC8TimeTcp; int i = 0; INT8 len = -1; WorkState = battWorkState; if(WorkState==0x00 && WorkFlag==0x01) { if(send_counter%(RUN_END_DELAY/5)==0) { WorkFlag=0x00; } } else if(WorkState==0x00 && WorkFlag==0x02) { if(send_counter%(CHRG_END_DELAY/5)==0) { WorkFlag=0x00; } } else { WorkFlag=WorkState; } switch(WorkFlag) { case 0x00: BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5; break; case 0x01: GpsSendFreq = AppDataInfo.GpsDisChrgInfoSendFreq/5; BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5; break; case 0x02: BattSendFreq = AppDataInfo.BmsChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5; break; default: BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5; break; } if(send_counter%BattSendFreq==0) { BattMsgtoTcpType BattToTcpInfo; //osStatus_t result = osMutexAcquire(UartMutex, osWaitForever); appGetSystemTimeUtcSync(&TimeStracture); year=(TimeStracture.UTCtimer1&0xffff0000)>>16; month=(TimeStracture.UTCtimer1&0xff00)>>8; day=TimeStracture.UTCtimer1&0xff; hour=(TimeStracture.UTCtimer2&0xff000000)>>24; minute=(TimeStracture.UTCtimer2&0xff0000)>>16; sec=(TimeStracture.UTCtimer2&0xff00)>>8; UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec); appGetSignalInfoSync(&csq,&snr,&rsnr); DataLen= (UINT16)sizeof(BattToTcpInfo.battInfo); BattToTcpInfo.startSymbol[0] = TCP_START_SYM1; BattToTcpInfo.startSymbol[1] = TCP_START_SYM2; BattToTcpInfo.cmdSymbol = TCP_CMD_SYM; BattToTcpInfo.ansSymbol = TCP_ANS_SYM; memcpy(BattToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN); BattToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt BattToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF; BattToTcpInfo.dataLength[1] = DataLen & 0xFF; #ifdef USING_PRINTF1 printf("year:%x,month:%d,day:%d,hour:%d,minute:%d,second:%d\n",UTC8TimeTcp.year,UTC8TimeTcp.month,UTC8TimeTcp.day,UTC8TimeTcp.hour,UTC8TimeTcp.minute,UTC8TimeTcp.second); #endif BattToTcpInfo.battInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year BattToTcpInfo.battInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month BattToTcpInfo.battInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day BattToTcpInfo.battInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour BattToTcpInfo.battInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins BattToTcpInfo.battInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec BattToTcpInfo.battInfo.msgMark = BATTMSG; BattToTcpInfo.battInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year BattToTcpInfo.battInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month BattToTcpInfo.battInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day BattToTcpInfo.battInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour BattToTcpInfo.battInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins BattToTcpInfo.battInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec BattToTcpInfo.battInfo.signalStrength = csq ; //故障等级故障代码上传 if(osOK==osMutexAcquire(Error_Mutex, 100)) { UINT16 ErrorTemp=0x00; ErrorTemp = GetErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum)); #ifdef USING_PRINTF1 printf("Temp-Error:%d\n",ErrorTemp); #endif BattToTcpInfo.battInfo.errClass = 0x00; BattToTcpInfo.battInfo.errCode[0] = ErrorTemp>>8; BattToTcpInfo.battInfo.errCode[1] = ErrorTemp; } else { #ifdef USING_PRINTF1 printf("Temp-Error:%d\n",ErrorTemp); #endif BattToTcpInfo.battInfo.errClass = 0x00; BattToTcpInfo.battInfo.errCode[0] = 0x00; BattToTcpInfo.battInfo.errCode[1] = 0x00; } osMutexRelease(Error_Mutex); BattToTcpInfo.battInfo.battI[0] = battI>>8; BattToTcpInfo.battInfo.battI[1] = battI & 0xFF; //电池内外电压保持一致 BattToTcpInfo.battInfo.battLinkVol[0] = battPackVol >> 8; BattToTcpInfo.battInfo.battLinkVol[1] = battPackVol & 0xFF; BattToTcpInfo.battInfo.battPackVol[0] = battPackVol >> 8; BattToTcpInfo.battInfo.battPackVol[1] = battPackVol & 0xFF; BattToTcpInfo.battInfo.switchState = battMOSSwitchState; BattToTcpInfo.battInfo.battSOC = battSOC; BattToTcpInfo.battInfo.battSOH = battSOH; memcpy(BattToTcpInfo.battInfo.batCellBalenceState,&battBalanceoInfo,4); BattToTcpInfo.battInfo.battCellNum= BATT_CELL_VOL_NUM ; for(i=0;i>8) & 0xFF; BattToTcpInfo.battInfo.battCellU[i*2+1] = battCellU[i] & 0xFF; } BattToTcpInfo.battInfo.battTempNum = BATT_TEMP_NUM; for(i=0; i0) { TcpSendLen = 0x02 | TcpSendLen; } else { TcpSendLen = 0xFD & TcpSendLen; sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0); } } } if(send_counter%GpsSendFreq==0) { GPSMsgtoTcpType GpsToTcpInfo; osStatus_t result = osMutexAcquire(GpsMutex, osWaitForever); appGetSystemTimeUtcSync(&TimeStracture); year=(TimeStracture.UTCtimer1&0xffff0000)>>16; month=(TimeStracture.UTCtimer1&0xff00)>>8; day=TimeStracture.UTCtimer1&0xff; hour=(TimeStracture.UTCtimer2&0xff000000)>>24; minute=(TimeStracture.UTCtimer2&0xff0000)>>16; sec=(TimeStracture.UTCtimer2&0xff00)>>8; UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec); DataLen= (UINT16)sizeof(GpsToTcpInfo.gpsInfo); GpsToTcpInfo.startSymbol[0] = TCP_START_SYM1; GpsToTcpInfo.startSymbol[1] = TCP_START_SYM2; GpsToTcpInfo.cmdSymbol = TCP_CMD_SYM; GpsToTcpInfo.ansSymbol = TCP_ANS_SYM; memcpy(GpsToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN); GpsToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt GpsToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF; GpsToTcpInfo.dataLength[1] = DataLen & 0xFF; GpsToTcpInfo.gpsInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year GpsToTcpInfo.gpsInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month GpsToTcpInfo.gpsInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day GpsToTcpInfo.gpsInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour GpsToTcpInfo.gpsInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins GpsToTcpInfo.gpsInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec GpsToTcpInfo.gpsInfo.msgMark = GPSMSG; GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; memcpy((UINT8 *)&GpsToTcpInfo.gpsInfo.locateMark, GpsData,sizeof(GpsData)); GpsToTcpInfo.CRC = bcc_chk((UINT8 *)&GpsToTcpInfo, sizeof(GPSMsgtoTcpType)-1 ); osMutexRelease(GpsMutex); //if(GpsToTcpInfo.gpsInfo.locateMark==0x01) if(1) { len = tcpipConnectionSend(socContext.id, (UINT8 *)&GpsToTcpInfo, sizeof(GpsToTcpInfo), 0, 0, 0); if(len>0) { TcpSendLen = 0x04 | TcpSendLen; } else { TcpSendLen = 0xFB & TcpSendLen; sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0); } } #ifdef USING_PRINTF1 printf("GpsMsg:\n"); UINT8* p = (UINT8 *)&GpsToTcpInfo; for(int i =0 ;i>16; month=(TimeStracture.UTCtimer1&0xff00)>>8; day=TimeStracture.UTCtimer1&0xff; hour=(TimeStracture.UTCtimer2&0xff000000)>>24; minute=(TimeStracture.UTCtimer2&0xff0000)>>16; sec=(TimeStracture.UTCtimer2&0xff00)>>8; UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec); DataLen= (UINT16)sizeof(VerMsgToTcpInfo.VerInfo); VerMsgToTcpInfo.startSymbol[0] = TCP_START_SYM1; VerMsgToTcpInfo.startSymbol[1] = TCP_START_SYM2; VerMsgToTcpInfo.cmdSymbol = TCP_CMD_SYM; VerMsgToTcpInfo.ansSymbol = TCP_ANS_SYM; memcpy(VerMsgToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN); VerMsgToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt VerMsgToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF; VerMsgToTcpInfo.dataLength[1] = DataLen & 0xFF; VerMsgToTcpInfo.VerInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year VerMsgToTcpInfo.VerInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month VerMsgToTcpInfo.VerInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day VerMsgToTcpInfo.VerInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour VerMsgToTcpInfo.VerInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins VerMsgToTcpInfo.VerInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec VerMsgToTcpInfo.VerInfo.msgMark = VERSIONMSG; VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; memcpy(VerMsgToTcpInfo.VerInfo.ICCID,iccid,20); memcpy(VerMsgToTcpInfo.VerInfo.IMEI,imei,15); //osMutexAcquire(UartMutex, osWaitForever);//Bms版本号上传2021-03-24修改 VerMsgToTcpInfo.VerInfo.BMSHwVersion[0] = bmsHwVersion /10; VerMsgToTcpInfo.VerInfo.BMSHwVersion[1] = bmsHwVersion%10; VerMsgToTcpInfo.VerInfo.BMSSwVersion[0] = 0; VerMsgToTcpInfo.VerInfo.BMSSwVersion[1] = 0; VerMsgToTcpInfo.VerInfo.BMSSwVersion[2] = bmsSwVersion/10; VerMsgToTcpInfo.VerInfo.BMSSwVersion[3] = bmsSwVersion%10; //osMutexRelease(UartMutex); VerMsgToTcpInfo.VerInfo.NBHwVersion[0] = (HWVERSION>>8)& 0xFF; VerMsgToTcpInfo.VerInfo.NBHwVersion[1] = (HWVERSION)& 0xFF; VerMsgToTcpInfo.VerInfo.BLVersion[0] = (BLSWVERSION>>24)& 0xFF; VerMsgToTcpInfo.VerInfo.BLVersion[1] = (BLSWVERSION>>16)& 0xFF; VerMsgToTcpInfo.VerInfo.BLVersion[2] = (BLSWVERSION>>8)& 0xFF; VerMsgToTcpInfo.VerInfo.BLVersion[3] = (BLSWVERSION)& 0xFF; VerMsgToTcpInfo.VerInfo.DRVVersion[0] = (DRVSWVERSION>>24)& 0xFF; VerMsgToTcpInfo.VerInfo.DRVVersion[1] = (DRVSWVERSION>>16)& 0xFF; VerMsgToTcpInfo.VerInfo.DRVVersion[2] = (DRVSWVERSION>>8)& 0xFF; VerMsgToTcpInfo.VerInfo.DRVVersion[3] = (DRVSWVERSION)& 0xFF; VerMsgToTcpInfo.VerInfo.APPVersion[0] = (APPSWVERSION>>24)& 0xFF; VerMsgToTcpInfo.VerInfo.APPVersion[1] = (APPSWVERSION>>16)& 0xFF; VerMsgToTcpInfo.VerInfo.APPVersion[2] = (APPSWVERSION>>8)& 0xFF; VerMsgToTcpInfo.VerInfo.APPVersion[3] = (APPSWVERSION)& 0xFF; VerMsgToTcpInfo.VerInfo.BmsType = BMS_MANUFACTURE; VerMsgToTcpInfo.VerInfo.BmsInfo = BMS_INFO; VerMsgToTcpInfo.VerInfo.DataModuleType = DATA_MODULE_TYPE; VerMsgToTcpInfo.CRC = bcc_chk((UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo)-1 ); if(UartBattInfoRecvFlag==TRUE&&NB_Fota_update_flag==FALSE) { len = tcpipConnectionSend(socContext.id, (UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo), 0, 0, 0); if(len>0) { TcpSendLen = 0x01 | TcpSendLen; } else { TcpSendLen = 0xFE & TcpSendLen; sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0); } } else { send_counter = 1; return; } } if(send_counter==0)//发送本次文件中的调试信息 { DebugMsgtoTcpType DebugMsgInfo; UINT8 *SendBuffer = PNULL; UINT16 BufferLen = 0; BufferLen = Debug_GetSize(); if(BufferLen>200) { Debug_Del_Logfile(); #ifdef DEBUGLOG Debug_printf("Sys:%d\n",AppDataInfo.SysReStart); #endif BufferLen = Debug_GetSize(); } UINT8 rbuf[BufferLen]; Debug_Read_Logfile(rbuf,BufferLen); SendBuffer = malloc(BufferLen+sizeof(DebugMsgInfo)); memcpy(SendBuffer+sizeof(DebugMsgInfo)-1, rbuf,BufferLen); appGetSystemTimeUtcSync(&TimeStracture); year=(TimeStracture.UTCtimer1&0xffff0000)>>16; month=(TimeStracture.UTCtimer1&0xff00)>>8; day=TimeStracture.UTCtimer1&0xff; hour=(TimeStracture.UTCtimer2&0xff000000)>>24; minute=(TimeStracture.UTCtimer2&0xff0000)>>16; sec=(TimeStracture.UTCtimer2&0xff00)>>8; UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec); DataLen=sizeof(DebugMsgInfo.DebugInfo) + BufferLen; DebugMsgInfo.startSymbol[0] = TCP_START_SYM1; DebugMsgInfo.startSymbol[1] = TCP_START_SYM2; DebugMsgInfo.cmdSymbol = TCP_CMD_SYM; DebugMsgInfo.ansSymbol = TCP_ANS_SYM; memcpy(DebugMsgInfo.SN, AppNVMData.battSN,BATT_SN_LEN); DebugMsgInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt DebugMsgInfo.dataLength[0] = (DataLen>>8) & 0xFF; DebugMsgInfo.dataLength[1] = DataLen & 0xFF; DebugMsgInfo.DebugInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year DebugMsgInfo.DebugInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month DebugMsgInfo.DebugInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day DebugMsgInfo.DebugInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour DebugMsgInfo.DebugInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins DebugMsgInfo.DebugInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec DebugMsgInfo.DebugInfo.msgMark = DEBUGMSG; DebugMsgInfo.DebugInfo.DebugLen[0] = BufferLen>>8; DebugMsgInfo.DebugInfo.DebugLen[1] = BufferLen; memcpy(SendBuffer,(UINT8 *)&DebugMsgInfo,sizeof(DebugMsgInfo)-1); DebugMsgInfo.CRC = bcc_chk(SendBuffer, BufferLen+sizeof(DebugMsgInfo)-1); memcpy(SendBuffer+BufferLen+sizeof(DebugMsgInfo)-1,&DebugMsgInfo.CRC,1); len = tcpipConnectionSend(socContext.id, SendBuffer, BufferLen+sizeof(DebugMsgInfo), 0, 0, 0); #ifdef USING_PRINTF1 printf("DebugMsgInfo!\n"); UINT8* p = SendBuffer; for(i =0 ;i0xffff) { send_counter = 0; } else { send_counter++; } } //Tcp数据接收处理函数 static void TcpDataInfoRecvHandle() { TcpipConnectionRecvDataInd *TcpRecvData; osMessageQueueGet(TcpRecvHandle,&TcpRecvData,0,0); osDelay(100); Uart_Write_Data_Type UartWriteCmd; OsaUtcTimeTValue TimeStracture; UINT8 DataLen; UINT8 Tcp_Cmd; UINT8 Control_Cmd; UINT8 *Ptr; UINT8 TcpCmdAnswer[31]; TcpCmdAnswer[0] = TCP_START_SYM1; TcpCmdAnswer[1] = TCP_START_SYM1; if(TcpRecvData != PNULL) { Ptr = TcpRecvData->data; if((*(Ptr+0)==TCP_START_SYM1)&&(*(Ptr+1)==TCP_START_SYM2))//服务器起始信息 { Tcp_Cmd = *(Ptr+2);//命令标志 if(*(Ptr+3)==0xFE) { TcpService=0x01; } switch (Tcp_Cmd) { case TCP_QUERY_SYM: break; case TCP_SETCMD_SYM: break; case TCP_CONCMD_SYM: { TcpCmdAnswer[2] = TCP_CONCMD_SYM; if(*(Ptr+30)==0x01)//远程升级命令 { Fota_Func(Ptr,socContext.id); } else if(*(Ptr+30)==0x88)//BMS远程升级数据传输命令 { Fota_Func(Ptr,socContext.id); } else if(*(Ptr+30)==0x80)//远程锁定命令 { //osMutexAcquire(UartMutex, osWaitForever); TcpCmdAnswer[3] = 0x01; memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN); TcpCmdAnswer[21] = TCP_ENCPT_DISABLE; TcpCmdAnswer[22] = 0x00; TcpCmdAnswer[23] = 0x06; memcpy(&TcpCmdAnswer[24],(Ptr+24),6); TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30); if(*(Ptr+31)==0x01)//0x01代表锁定 { AppNVMData.appDataModify = TRUE; AppNVMData.isBattLocked = TRUE; UartWriteCmd.WriteCmd = 0x01; UartWriteCmd.Data[0] = 0x00; UartWriteCmd.Data[1] = 0x00; if(battWorkState ==0x00) { osMessageQueuePut(UartWriteCmdHandle,&UartWriteCmd,0,1000); } tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0); } else //0x02代表解锁 { AppNVMData.appDataModify = TRUE; AppNVMData.isBattLocked = FALSE; UartWriteCmd.WriteCmd = 0x01; UartWriteCmd.Data[0] = 0x00; UartWriteCmd.Data[1] = 0x03; osMessageQueuePut(UartWriteCmdHandle,&UartWriteCmd,0,1000); tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0); } //osMutexRelease(UartMutex); TcpService=0x00; } else { TcpCmdAnswer[3] = 0x0f; memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN); TcpCmdAnswer[21] = TCP_ENCPT_DISABLE; TcpCmdAnswer[22] = 0x00; TcpCmdAnswer[23] = 0x06; memcpy(&TcpCmdAnswer[24],(Ptr+24),6); TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30); tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0); } break; } default: { break; } } } free(TcpRecvData); } } //TCP发送校验函数 UINT8 bcc_chk(UINT8* data, UINT8 length) { UINT8 bcc_chk_return = 0x00; UINT8 count = 0; while (countmessageId = msgId; if (psEventQueueHandle) { if (pdTRUE != xQueueSend(psEventQueueHandle, &queueMsg, xTickstoWait)) { ECOMM_TRACE(UNILOG_PLA_APP, sendQueueMsg_1, P_ERROR, 0, "xQueueSend error"); } } } //Tcp状态注册函数 static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen) { CmiSimImsiStr *imsi = NULL; CmiPsCeregInd *cereg = NULL; UINT8 rssi = 0, index = 0; NmAtiNetifInfo *netif = NULL; switch(eventID) { case NB_URC_ID_SIM_READY: { imsi = (CmiSimImsiStr *)param; memcpy(gImsi, imsi->contents, imsi->length); #ifdef USING_PRINTF printf("SIM ready(imsi=%s)\n",(UINT8 *)imsi->contents); #endif break; } case NB_URC_ID_MM_SIGQ: { rssi = *(UINT8 *)param; #ifdef USING_PRINTF printf("RSSI signal=%d\n",rssi); #endif break; } case NB_URC_ID_PS_BEARER_ACTED: { #ifdef USING_PRINTF printf("Default bearer activated\n"); #endif break; } case NB_URC_ID_PS_BEARER_DEACTED: { #ifdef USING_PRINTF printf("Default bearer Deactivated\n"); #endif break; } case NB_URC_ID_PS_CEREG_CHANGED: { cereg = (CmiPsCeregInd *)param; gCellID = cereg->celId; #ifdef USING_PRINTF printf("URCCallBack:CEREG changed act:%d celId:%d locPresent:%d tac:%d\n", cereg->act, cereg->celId, cereg->locPresent, cereg->tac); #endif break; } case NB_URC_ID_PS_NETINFO: { netif = (NmAtiNetifInfo *)param; if (netif->netStatus == NM_NETIF_ACTIVATED) sendQueueMsg(QMSG_ID_NW_IP_READY, 0); break; } } return 0; } //Tcpz连接状态回调函数 static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEvent) { switch(connectionEventType) { case TCPIP_CONNECTION_STATUS_EVENT: { TcpipConnectionStatusInd *statusInd; statusInd = (TcpipConnectionStatusInd *)bodyEvent; if(statusInd != PNULL) { if(statusInd->status == TCPIP_CONNECTION_STATUS_CLOSED) { #ifdef USING_PRINTF printf("socketAppConnectionCallBack socket connection %u closed,cause %u", statusInd->connectionId, statusInd->cause); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_1, P_ERROR, 2, "socketAppConnectionCallBack socket connection %u closed,cause %u", statusInd->connectionId, statusInd->cause); if(statusInd->connectionId == socContext.id) { socContext.id = -1; socContext.status = APP_SOCKET_CONNECTION_CLOSED; } } else if(statusInd->status == TCPIP_CONNECTION_STATUS_CONNECTING) { #ifdef USING_PRINTF printf("socketAppConnectionCallBack socket connection %u is connecting", statusInd->connectionId); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_2, P_INFO, 1, "socketAppConnectionCallBack socket connection %u is connecting", statusInd->connectionId); if(statusInd->connectionId == socContext.id) { socContext.status = APP_SOCKET_CONNECTION_CONNECTING; } } else if(statusInd->status == TCPIP_CONNECTION_STATUS_CONNECTED) { #ifdef USING_PRINTF printf("socketAppConnectionCallBack socket connection %u is connected", statusInd->connectionId); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_3, P_ERROR, 1, "socketAppConnectionCallBack socket connection %u is connected", statusInd->connectionId); if(statusInd->connectionId == socContext.id) { socContext.status = APP_SOCKET_CONNECTION_CONNECTED; } } } else { #ifdef USING_PRINTF printf("socketAppConnectionCallBack invalid connection status event"); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_4, P_ERROR, 0, "socketAppConnectionCallBack invalid connection status event"); } break; } case TCPIP_CONNECTION_RECEIVE_EVENT: { TcpipConnectionRecvDataInd *rcvInd; TcpipConnectionRecvDataInd *rcvbuffer = NULL; rcvInd = (TcpipConnectionRecvDataInd *)bodyEvent; if(rcvInd != PNULL) { rcvbuffer = malloc(sizeof(TcpipConnectionRecvDataInd)); memcpy(rcvbuffer,rcvInd,sizeof(TcpipConnectionRecvDataInd)); osMessageQueuePut(TcpRecvHandle,&rcvbuffer,0,1000); sendQueueMsg(QMSG_ID_SOCK_RECVPKG, 0); #ifdef USING_PRINTF uint8_t* Ptr; Ptr=rcvInd->data; printf("socket connection %u receive length %u data:", rcvInd->connectionId, rcvInd->length); for(int i = 0;ilength;i++) printf("%x ",*(Ptr+i)); printf("\n"); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_5, P_INFO, 2, "socketAppConnectionCallBack socket connection %u receive length %u data", rcvInd->connectionId, rcvInd->length); } else { #ifdef USING_PRINTF printf( "socketAppConnectionCallBack invalid connection rcv event"); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_6, P_ERROR, 0, "socketAppConnectionCallBack invalid connection rcv event"); } break; } case TCPIP_CONNECTION_UL_STATUS_EVENT: { TcpipConnectionUlDataStatusInd *ulStatusInd; ulStatusInd = (TcpipConnectionUlDataStatusInd *)bodyEvent; if(ulStatusInd != PNULL) { if(ulStatusInd->status == Tcpip_Connection_UL_DATA_SUCCESS) { #ifdef USING_PRINTF printf( "socketAppConnectionCallBack socket connection %u sequence %u data has sent success", ulStatusInd->connectionId, ulStatusInd->sequence); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_7, P_INFO, 2, "socketAppConnectionCallBack socket connection %u sequence %u data has sent success", ulStatusInd->connectionId, ulStatusInd->sequence); } else if(ulStatusInd->status == Tcpip_Connection_UL_DATA_FAIL) { #ifdef USING_PRINTF printf("socketAppConnectionCallBack socket connection %u sequence %u data has sent fail", ulStatusInd->connectionId, ulStatusInd->sequence); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_8, P_WARNING, 2, "socketAppConnectionCallBack socket connection %u sequence %u data has sent fail", ulStatusInd->connectionId, ulStatusInd->sequence); } } else { #ifdef USING_PRINTF printf("socketAppConnectionCallBack invalid connection ul status event"); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_9, P_ERROR, 0, "socketAppConnectionCallBack invalid connection ul status event"); } break; } default: #ifdef USING_PRINTF printf("socketAppConnectionCallBack invalid event type %u", connectionEventType); #endif ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_10, P_ERROR, 1, "socketAppConnectionCallBack invalid event type %u", connectionEventType); break; } }