/**************************************************************************** * * 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" //全局变量输出区 UINT32 TcpService = 0; //全局变量输入区 extern UINT32 Timer_count; extern volatile bool Sleep_flag; extern UartReadMsgType UartReadMsg; extern osMutexId_t UartMutex; extern osMutexId_t GpsMutex; extern UINT8 GpsData[16]; extern AppNVMDataType AppNVMData; extern AppDataBody AppDataInfo; extern QueueHandle_t UartWriteCmdHandle; //局部变量申请 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) { INT32 connectionId = -1; 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); } 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(connectionId < 0) { connectionId = tcpipConnectionCreate(TCPIP_CONNECTION_PROTOCOL_TCP, PNULL, 0, QX_TCP_IPADRRES, QX_TCP_PORT, socketAppConnectionCallBack); } if(connectionId >= 0) { socContext.id = connectionId; 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: 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; BattMsgtoTcpType BattToTcpInfo; GPSMsgtoTcpType GpsToTcpInfo; VersionMsgtoTcpType VerMsgToTcpInfo; OsaUtcTimeTValue TimeStracture; UINT8 csq=0; INT8 snr=0; INT8 rsnr=0; INT16 Batt_current; UINT16 BattU; UINT8 temp=0; UINT16 DataLen; UINT8 BattSendFreq; UINT8 GpsSendFreq; UINT8 WorkState; static UINT8 WorkFlag; osMutexAcquire(UartMutex, osWaitForever); WorkState = (UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03); osMutexRelease(UartMutex); if(WorkState==0x00 && WorkFlag==0x01) { if(send_counter%20==0) { WorkFlag=0x00; } } else if(WorkState==0x00 && WorkFlag==0x02) { if(send_counter%60==0) { WorkFlag=0x00; } } else { WorkFlag=WorkState; } switch(WorkFlag) { case 0x00: BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5; break; case 0x01: BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsDisChrgInfoSendFreq/5; break; case 0x02: BattSendFreq = AppDataInfo.BmsChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5; break; default: BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5; GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5; break; } #ifdef USING_PRINTF printf("send_counter= %x,BattSendFreq= %x,GpsSendFreq= %x,UartReadMsg:%x\n",send_counter,BattSendFreq,GpsSendFreq,UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]); #endif if(send_counter%BattSendFreq==0) { osStatus_t result = osMutexAcquire(UartMutex, osWaitForever); appGetSystemTimeUtcSync(&TimeStracture); 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; BattToTcpInfo.battInfo.sendTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year BattToTcpInfo.battInfo.sendTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month BattToTcpInfo.battInfo.sendTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day BattToTcpInfo.battInfo.sendTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour BattToTcpInfo.battInfo.sendTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins BattToTcpInfo.battInfo.sendTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec BattToTcpInfo.battInfo.msgMark = BATTMSG; BattToTcpInfo.battInfo.msgCollectionTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year BattToTcpInfo.battInfo.msgCollectionTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month BattToTcpInfo.battInfo.msgCollectionTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day BattToTcpInfo.battInfo.msgCollectionTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour BattToTcpInfo.battInfo.msgCollectionTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins BattToTcpInfo.battInfo.msgCollectionTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec BattToTcpInfo.battInfo.signalStrength = csq ; //故障等级故障代码未定义 BattToTcpInfo.battInfo.errClass = 0x00; BattToTcpInfo.battInfo.errCode[0] = 0x00; BattToTcpInfo.battInfo.errCode[1] = 0x00; Batt_current = (UartReadMsg.data[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(UartReadMsg.data[(0x02+BATT_CELL_VOL_NUM)*2+1]); if (Batt_current>0x8000)//放电为正,充电为负 { Batt_current = Batt_current|0x7fff; Batt_current = Batt_current/10; Batt_current = 0x2710 + Batt_current; Batt_current = Batt_current; } else { Batt_current = Batt_current/10; Batt_current = 0x2710 - Batt_current; Batt_current = Batt_current; } BattToTcpInfo.battInfo.battI[0] = Batt_current>>8; BattToTcpInfo.battInfo.battI[1] = Batt_current & 0xFF; BattU =( (UartReadMsg.data[(0x18+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])<<8|(UartReadMsg.data[(0x18+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]))/10; //电池内外电压保持一致 BattToTcpInfo.battInfo.battLinkVol[0] = BattU >> 8; BattToTcpInfo.battInfo.battLinkVol[1] = BattU & 0xFF; BattToTcpInfo.battInfo.battPackVol[0] = BattU >> 8; BattToTcpInfo.battInfo.battPackVol[1] = BattU & 0xFF; temp = ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])>>1)&0x03; if(AppNVMData.isBattLocked==TRUE) { BattToTcpInfo.battInfo.switchState = ((temp&0x01)<<1)|((temp&0x02)>>1)|0x01<<2; } else { BattToTcpInfo.battInfo.switchState = ((temp&0x01)<<1)|((temp&0x02)>>1)|0x00<<2; } BattToTcpInfo.battInfo.battSOC = UartReadMsg.data[(0x0B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]; BattToTcpInfo.battInfo.battSOH = UartReadMsg.data[(0x0C+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]; memcpy(BattToTcpInfo.battInfo.batCellBalenceState,&UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2],4); BattToTcpInfo.battInfo.battCellNum= BATT_CELL_VOL_NUM ; memcpy(BattToTcpInfo.battInfo.battCellU,&UartReadMsg.data[0x04],BATT_CELL_VOL_NUM_2); BattToTcpInfo.battInfo.battTempNum = BATT_TEMP_NUM; for(int i=0; i>8) & 0xFF; GpsToTcpInfo.dataLength[1] = DataLen & 0xFF; GpsToTcpInfo.gpsInfo.sendTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year GpsToTcpInfo.gpsInfo.sendTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month GpsToTcpInfo.gpsInfo.sendTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day GpsToTcpInfo.gpsInfo.sendTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour GpsToTcpInfo.gpsInfo.sendTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins GpsToTcpInfo.gpsInfo.sendTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec GpsToTcpInfo.gpsInfo.msgMark = GPSMSG; GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 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) { tcpipConnectionSend(socContext.id, (UINT8 *)&GpsToTcpInfo, sizeof(GpsToTcpInfo), 0, 0, 0); } } if(send_counter==0) { CHAR iccid[20]; CHAR imei[15]; appGetIccidNumSync(iccid); appGetImeiNumSync(imei); appGetSystemTimeUtcSync(&TimeStracture); 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] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year VerMsgToTcpInfo.VerInfo.sendTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month VerMsgToTcpInfo.VerInfo.sendTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day VerMsgToTcpInfo.VerInfo.sendTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour VerMsgToTcpInfo.VerInfo.sendTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins VerMsgToTcpInfo.VerInfo.sendTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec VerMsgToTcpInfo.VerInfo.msgMark = VERSIONMSG; VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; memcpy(VerMsgToTcpInfo.VerInfo.ICCID,iccid,20); memcpy(VerMsgToTcpInfo.VerInfo.IMEI,imei,15); osMutexAcquire(UartMutex, osWaitForever);//Bms版本号上传2021-03-24修改 VerMsgToTcpInfo.VerInfo.BMSHwVersion[0] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]/10; VerMsgToTcpInfo.VerInfo.BMSHwVersion[1] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]%10; VerMsgToTcpInfo.VerInfo.BMSSwVersion[0] = 0; VerMsgToTcpInfo.VerInfo.BMSSwVersion[1] = 0; VerMsgToTcpInfo.VerInfo.BMSSwVersion[2] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]/10; VerMsgToTcpInfo.VerInfo.BMSSwVersion[3] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]%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(UartReadMsg.UartFlag) { tcpipConnectionSend(socContext.id, (UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo), 0, 0, 0); } else { send_counter = 0; } } if(send_counter>0xffff) { 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((UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03)==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; } }