TcpTask.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. /****************************************************************************
  2. *
  3. * Copy right: Qx.Chen jie
  4. * File name: TcpTask.c
  5. * Description: 网络发送接收任务
  6. * History: 2021-03-07
  7. *
  8. ****************************************************************************/
  9. #include "bsp.h"
  10. #include "bsp_custom.h"
  11. #include "osasys.h"
  12. #include "ostask.h"
  13. #include "queue.h"
  14. #include "ps_event_callback.h"
  15. #include "app.h"
  16. #include "cmisim.h"
  17. #include "cmimm.h"
  18. #include "cmips.h"
  19. #include "sockets.h"
  20. #include "psifevent.h"
  21. #include "ps_lib_api.h"
  22. #include "lwip/netdb.h"
  23. //#include <cis_def.h>
  24. #include "debug_log.h"
  25. #include "slpman_ec616.h"
  26. #include "plat_config.h"
  27. #include "ec_tcpip_api.h"
  28. #include "MainTask.h"
  29. #include "TcpTask.h"
  30. #include "UartTask.h"
  31. #include "GpsTask.h"
  32. #include "Fota.h"
  33. //全局变量输出区
  34. UINT32 TcpService = 0;
  35. //全局变量输入区
  36. extern UINT32 Timer_count;
  37. extern volatile bool Sleep_flag;
  38. extern UartReadMsgType UartReadMsg;
  39. extern osMutexId_t UartMutex;
  40. extern osMutexId_t GpsMutex;
  41. extern UINT8 GpsData[16];
  42. extern AppNVMDataType AppNVMData;
  43. extern AppDataBody AppDataInfo;
  44. extern QueueHandle_t UartWriteCmdHandle;
  45. //局部变量申请
  46. AppSocketConnectionContext socContext = {-1, APP_SOCKET_CONNECTION_CLOSED};
  47. static StaticTask_t gProcess_Tcp_Task_t;
  48. static UINT8 gProcess_Tcp_TaskStack[PROC_TCP_TASK_STACK_SIZE];
  49. static QueueHandle_t psEventQueueHandle;//状态转换队列句柄
  50. static osThreadId_t TcpTaskId = NULL;
  51. static process_TCP gProcess_Tcp_Task = PROCESS_TCP_STATE_IDLE;
  52. #define PROC_TCP_STATE_SWITCH(a) (gProcess_Tcp_Task = a)
  53. static eventCallbackMessage_t *queueItem = NULL;
  54. static UINT8 gImsi[16] = {0};
  55. static UINT32 gCellID = 0;
  56. static QueueHandle_t TcpRecvHandle = NULL;
  57. static UINT8 TcpRecvEnd = 0;
  58. //Tcp线程堆栈申请区
  59. //函数声明区
  60. static void sendQueueMsg(UINT32 msgId, UINT32 xTickstoWait);
  61. static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen);
  62. static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEvent);
  63. static void TcpDataInfoAssembleSend();
  64. static void TcpDataInfoRecvHandle();
  65. UINT8 bcc_chk(UINT8* data, UINT8 length);
  66. //线程任务区
  67. static void TcpTask(void* arg)
  68. {
  69. INT32 connectionId = -1;
  70. appSetEDRXSettingSync(0,5,1800000);
  71. appSetPSMSettingSync(1,3*60*60,10);
  72. appSetCFUN(1);
  73. psEventQueueHandle = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(eventCallbackMessage_t*));
  74. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
  75. if (psEventQueueHandle == NULL)
  76. {
  77. return;
  78. }
  79. if(TcpRecvHandle == NULL)
  80. {
  81. TcpRecvHandle = osMessageQueueNew(1,sizeof(TcpipConnectionRecvDataInd*), NULL);
  82. }
  83. while (true)
  84. {
  85. osDelay(100);
  86. if(Sleep_flag)
  87. {
  88. sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0);
  89. sendQueueMsg(QMSG_ID_SOCK_EXIT, 0);
  90. }
  91. else if(Timer_count%50==0 && TcpService==0x00 && AppNVMData.EOLState==1)
  92. {
  93. sendQueueMsg(QMSG_ID_SOCK_SENDPKG, 0);
  94. }
  95. else if(Timer_count%10==0)
  96. {
  97. TcpRecvEnd++;
  98. }
  99. if(TcpRecvEnd>=20)
  100. {
  101. TcpService = 0x00;
  102. TcpRecvEnd=0;
  103. }
  104. if (xQueueReceive(psEventQueueHandle, &queueItem, 0))
  105. {
  106. switch(queueItem->messageId)
  107. {
  108. case QMSG_ID_NW_IP_READY:
  109. if(connectionId < 0)
  110. {
  111. connectionId = tcpipConnectionCreate(TCPIP_CONNECTION_PROTOCOL_TCP, PNULL, 0, QX_TCP_IPADRRES, QX_TCP_PORT, socketAppConnectionCallBack);
  112. }
  113. if(connectionId >= 0)
  114. {
  115. socContext.id = connectionId;
  116. socContext.status = APP_SOCKET_CONNECTION_CONNECTED;
  117. #ifdef USING_PRINTF
  118. printf("create connection %u success", socContext.id);
  119. #endif
  120. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_2, P_INFO, 1, "create connection %u success", socContext.id);
  121. }
  122. else
  123. {
  124. sendQueueMsg(QMSG_ID_NW_IP_NOREACHABLE, 0);
  125. #ifdef USING_PRINTF
  126. printf("create connection fail\n");
  127. #endif
  128. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_3, P_ERROR, 0, "create connection fail");
  129. }
  130. break;
  131. case QMSG_ID_NW_IP_NOREACHABLE:
  132. break;
  133. case QMSG_ID_SOCK_SENDPKG:
  134. if (socContext.id >= 0 && socContext.status == APP_SOCKET_CONNECTION_CONNECTED)
  135. {
  136. TcpDataInfoAssembleSend();
  137. }
  138. else
  139. {
  140. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  141. #ifdef USING_PRINTF
  142. printf("connection %u or status invalid", socContext.id, socContext.status);
  143. #endif
  144. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_9, P_ERROR, 2, "connection %u or status invalid", socContext.id, socContext.status);
  145. }
  146. break;
  147. case QMSG_ID_SOCK_RECVPKG:
  148. TcpDataInfoRecvHandle();
  149. osDelay(100);
  150. TcpRecvEnd = 0;
  151. break;
  152. case QMSG_ID_NW_IP_SUSPEND:
  153. if (socContext.id >= 0 && socContext.status != APP_SOCKET_CONNECTION_CLOSED)
  154. {
  155. if(tcpipConnectionClose(socContext.id) < 0)
  156. {
  157. socContext.id = -1;
  158. socContext.status = APP_SOCKET_CONNECTION_CLOSED;
  159. #ifdef USING_PRINTF
  160. printf("close connection %u success", socContext.id);
  161. #endif
  162. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_4, P_INFO, 1, "close connection %u success", socContext.id);
  163. }
  164. else
  165. {
  166. #ifdef USING_PRINTF
  167. printf("close connection %u fail", socContext.id);
  168. #endif
  169. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_5, P_ERROR, 1, "close connection %u fail", socContext.id);
  170. }
  171. }
  172. else
  173. {
  174. #ifdef USING_PRINTF
  175. printf("connection %u or status invalid", socContext.id, socContext.status);
  176. #endif
  177. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_6, P_ERROR, 2, "connection %u or status invalid", socContext.id, socContext.status);
  178. }
  179. break;
  180. case QMSG_ID_SOCK_EXIT:
  181. #ifdef USING_PRINTF
  182. printf("QMSG_ID_SOCK_EXIT queueItem->messageId:%x\n",queueItem->messageId);
  183. #endif
  184. #ifdef USING_PRINTF
  185. printf("socket exit\n");
  186. #endif
  187. appSetCFUN(0);
  188. free(queueItem);
  189. osDelay(1000);
  190. TcpTaskDeInit(arg);
  191. break;
  192. }
  193. free(queueItem);
  194. }
  195. }//while 循环
  196. }
  197. //Tcp线程初始化
  198. void TcpTaskInit(void *arg)
  199. {
  200. osThreadAttr_t task_attr;
  201. registerPSEventCallback(NB_GROUP_ALL_MASK, socketRegisterPSUrcCallback);
  202. memset(&task_attr,0,sizeof(task_attr));
  203. memset(gProcess_Tcp_TaskStack, 0xA5, PROC_TCP_TASK_STACK_SIZE);
  204. task_attr.name = "Tcp_Task";
  205. task_attr.stack_mem = gProcess_Tcp_TaskStack;
  206. task_attr.stack_size = PROC_TCP_TASK_STACK_SIZE;
  207. task_attr.priority = osPriorityBelowNormal7;
  208. task_attr.cb_mem = &gProcess_Tcp_Task_t;
  209. task_attr.cb_size = sizeof(StaticTask_t);
  210. TcpTaskId = osThreadNew(TcpTask, NULL, &task_attr);
  211. }
  212. void TcpTaskDeInit(void *arg)
  213. {
  214. osThreadTerminate(TcpTaskId);
  215. TcpTaskId = NULL;
  216. }
  217. /*------------------------------函数区域----------------------------------------------------------------------------------------------*/
  218. static void TcpDataInfoAssembleSend()
  219. { static UINT32 send_counter = 0;
  220. BattMsgtoTcpType BattToTcpInfo;
  221. GPSMsgtoTcpType GpsToTcpInfo;
  222. VersionMsgtoTcpType VerMsgToTcpInfo;
  223. OsaUtcTimeTValue TimeStracture;
  224. UINT8 csq=0;
  225. INT8 snr=0;
  226. INT8 rsnr=0;
  227. INT16 Batt_current;
  228. UINT16 BattU;
  229. UINT8 temp=0;
  230. UINT16 DataLen;
  231. UINT8 BattSendFreq;
  232. UINT8 GpsSendFreq;
  233. UINT8 WorkState;
  234. static UINT8 WorkFlag;
  235. osMutexAcquire(UartMutex, osWaitForever);
  236. WorkState = (UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03);
  237. osMutexRelease(UartMutex);
  238. if(WorkState==0x00 && WorkFlag==0x01)
  239. {
  240. if(send_counter%20==0)
  241. {
  242. WorkFlag=0x00;
  243. }
  244. }
  245. else if(WorkState==0x00 && WorkFlag==0x02)
  246. {
  247. if(send_counter%60==0)
  248. {
  249. WorkFlag=0x00;
  250. }
  251. }
  252. else
  253. {
  254. WorkFlag=WorkState;
  255. }
  256. switch(WorkFlag)
  257. {
  258. case 0x00:
  259. BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5;
  260. GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5;
  261. break;
  262. case 0x01:
  263. BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5;
  264. GpsSendFreq = AppDataInfo.GpsDisChrgInfoSendFreq/5;
  265. break;
  266. case 0x02:
  267. BattSendFreq = AppDataInfo.BmsChrgInfoSendFreq/5;
  268. GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5;
  269. break;
  270. default:
  271. BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5;
  272. GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5;
  273. break;
  274. }
  275. #ifdef USING_PRINTF
  276. printf("send_counter= %x,BattSendFreq= %x,GpsSendFreq= %x,UartReadMsg:%x\n",send_counter,BattSendFreq,GpsSendFreq,UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]);
  277. #endif
  278. if(send_counter%BattSendFreq==0)
  279. {
  280. osStatus_t result = osMutexAcquire(UartMutex, osWaitForever);
  281. appGetSystemTimeUtcSync(&TimeStracture);
  282. appGetSignalInfoSync(&csq,&snr,&rsnr);
  283. DataLen= (UINT16)sizeof(BattToTcpInfo.battInfo);
  284. BattToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  285. BattToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  286. BattToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  287. BattToTcpInfo.ansSymbol = TCP_ANS_SYM;
  288. memcpy(BattToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  289. BattToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  290. BattToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  291. BattToTcpInfo.dataLength[1] = DataLen & 0xFF;
  292. BattToTcpInfo.battInfo.sendTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year
  293. BattToTcpInfo.battInfo.sendTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month
  294. BattToTcpInfo.battInfo.sendTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day
  295. BattToTcpInfo.battInfo.sendTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour
  296. BattToTcpInfo.battInfo.sendTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins
  297. BattToTcpInfo.battInfo.sendTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec
  298. BattToTcpInfo.battInfo.msgMark = BATTMSG;
  299. BattToTcpInfo.battInfo.msgCollectionTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year
  300. BattToTcpInfo.battInfo.msgCollectionTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month
  301. BattToTcpInfo.battInfo.msgCollectionTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day
  302. BattToTcpInfo.battInfo.msgCollectionTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour
  303. BattToTcpInfo.battInfo.msgCollectionTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins
  304. BattToTcpInfo.battInfo.msgCollectionTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec
  305. BattToTcpInfo.battInfo.signalStrength = csq ;
  306. //故障等级故障代码未定义
  307. BattToTcpInfo.battInfo.errClass = 0x00;
  308. BattToTcpInfo.battInfo.errCode[0] = 0x00;
  309. BattToTcpInfo.battInfo.errCode[1] = 0x00;
  310. Batt_current = (UartReadMsg.data[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(UartReadMsg.data[(0x02+BATT_CELL_VOL_NUM)*2+1]);
  311. if (Batt_current>0x8000)//放电为正,充电为负
  312. {
  313. Batt_current = Batt_current|0x7fff;
  314. Batt_current = Batt_current/10;
  315. Batt_current = 0x2710 + Batt_current;
  316. Batt_current = Batt_current;
  317. }
  318. else
  319. {
  320. Batt_current = Batt_current/10;
  321. Batt_current = 0x2710 - Batt_current;
  322. Batt_current = Batt_current;
  323. }
  324. BattToTcpInfo.battInfo.battI[0] = Batt_current>>8;
  325. BattToTcpInfo.battInfo.battI[1] = Batt_current & 0xFF;
  326. 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;
  327. //电池内外电压保持一致
  328. BattToTcpInfo.battInfo.battLinkVol[0] = BattU >> 8;
  329. BattToTcpInfo.battInfo.battLinkVol[1] = BattU & 0xFF;
  330. BattToTcpInfo.battInfo.battPackVol[0] = BattU >> 8;
  331. BattToTcpInfo.battInfo.battPackVol[1] = BattU & 0xFF;
  332. temp = ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])>>1)&0x03;
  333. if(AppNVMData.isBattLocked==TRUE)
  334. {
  335. BattToTcpInfo.battInfo.switchState = ((temp&0x01)<<1)|((temp&0x02)>>1)|0x01<<2;
  336. }
  337. else
  338. {
  339. BattToTcpInfo.battInfo.switchState = ((temp&0x01)<<1)|((temp&0x02)>>1)|0x00<<2;
  340. }
  341. BattToTcpInfo.battInfo.battSOC = UartReadMsg.data[(0x0B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1];
  342. BattToTcpInfo.battInfo.battSOH = UartReadMsg.data[(0x0C+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1];
  343. memcpy(BattToTcpInfo.battInfo.batCellBalenceState,&UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2],4);
  344. BattToTcpInfo.battInfo.battCellNum= BATT_CELL_VOL_NUM ;
  345. memcpy(BattToTcpInfo.battInfo.battCellU,&UartReadMsg.data[0x04],BATT_CELL_VOL_NUM_2);
  346. BattToTcpInfo.battInfo.battTempNum = BATT_TEMP_NUM;
  347. for(int i=0; i<BATT_TEMP_NUM; i++)
  348. {
  349. BattToTcpInfo.battInfo.battCellTemp[i] = UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+i)*2+1];
  350. }
  351. BattToTcpInfo.battInfo.battWorkState =UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03;//电池状态,0表示静置,1表示放电,2表示充电
  352. BattToTcpInfo.battInfo.battHeatState = UartReadMsg.data[(0x1C+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1];
  353. BattToTcpInfo.battInfo.battotherTempNum = BATT_OTHER_TEMP_NUM;//其他温度编号(包含环境温度mos温度以及接插件温度)2021-03-24其他温度修改
  354. BattToTcpInfo.battInfo.battotherTemp[0] = UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM)*2+1];
  355. BattToTcpInfo.battInfo.battotherTemp[1] = UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+1)*2+1];
  356. BattToTcpInfo.CRC = bcc_chk((UINT8 *)&BattToTcpInfo, sizeof(BattMsgtoTcpType)-1 );
  357. osMutexRelease(UartMutex);
  358. UINT8 len;
  359. if(UartReadMsg.UartFlag)
  360. {
  361. len = tcpipConnectionSend(socContext.id, (UINT8 *)&BattToTcpInfo, sizeof(BattToTcpInfo), 0, 0, 0);
  362. }
  363. #ifdef USING_PRINTF1
  364. printf("Len = %d\n",len);
  365. for(int i=0;i<sizeof(BattToTcpInfo);i++)
  366. printf("%x ",*((UINT8 *)&BattToTcpInfo+i));
  367. printf("end V4! \n",len);
  368. #endif
  369. }
  370. if(send_counter%GpsSendFreq==0)
  371. {
  372. osStatus_t result = osMutexAcquire(GpsMutex, osWaitForever);
  373. appGetSystemTimeUtcSync(&TimeStracture);
  374. DataLen= (UINT16)sizeof(GpsToTcpInfo.gpsInfo);
  375. GpsToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  376. GpsToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  377. GpsToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  378. GpsToTcpInfo.ansSymbol = TCP_ANS_SYM;
  379. memcpy(GpsToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  380. GpsToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  381. GpsToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  382. GpsToTcpInfo.dataLength[1] = DataLen & 0xFF;
  383. GpsToTcpInfo.gpsInfo.sendTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year
  384. GpsToTcpInfo.gpsInfo.sendTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month
  385. GpsToTcpInfo.gpsInfo.sendTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day
  386. GpsToTcpInfo.gpsInfo.sendTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour
  387. GpsToTcpInfo.gpsInfo.sendTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins
  388. GpsToTcpInfo.gpsInfo.sendTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec
  389. GpsToTcpInfo.gpsInfo.msgMark = GPSMSG;
  390. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year
  391. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month
  392. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day
  393. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour
  394. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins
  395. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF;
  396. memcpy((UINT8 *)&GpsToTcpInfo.gpsInfo.locateMark, GpsData,sizeof(GpsData));
  397. GpsToTcpInfo.CRC = bcc_chk((UINT8 *)&GpsToTcpInfo, sizeof(GPSMsgtoTcpType)-1 );
  398. osMutexRelease(GpsMutex);
  399. if(GpsToTcpInfo.gpsInfo.locateMark==0x01)
  400. {
  401. tcpipConnectionSend(socContext.id, (UINT8 *)&GpsToTcpInfo, sizeof(GpsToTcpInfo), 0, 0, 0);
  402. }
  403. }
  404. if(send_counter==0)
  405. {
  406. CHAR iccid[20];
  407. CHAR imei[15];
  408. appGetIccidNumSync(iccid);
  409. appGetImeiNumSync(imei);
  410. appGetSystemTimeUtcSync(&TimeStracture);
  411. DataLen= (UINT16)sizeof(VerMsgToTcpInfo.VerInfo);
  412. VerMsgToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  413. VerMsgToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  414. VerMsgToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  415. VerMsgToTcpInfo.ansSymbol = TCP_ANS_SYM;
  416. memcpy(VerMsgToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  417. VerMsgToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  418. VerMsgToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  419. VerMsgToTcpInfo.dataLength[1] = DataLen & 0xFF;
  420. VerMsgToTcpInfo.VerInfo.sendTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year
  421. VerMsgToTcpInfo.VerInfo.sendTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month
  422. VerMsgToTcpInfo.VerInfo.sendTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day
  423. VerMsgToTcpInfo.VerInfo.sendTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour
  424. VerMsgToTcpInfo.VerInfo.sendTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins
  425. VerMsgToTcpInfo.VerInfo.sendTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF; //sec
  426. VerMsgToTcpInfo.VerInfo.msgMark = VERSIONMSG;
  427. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[0] = ((((TimeStracture.UTCtimer1) >> 16) & 0xFFFF) - 0x07D0) & 0xFF; //year
  428. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[1] = ((TimeStracture.UTCtimer1) >> 8 ) & 0xFF; //month
  429. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[2] = (TimeStracture.UTCtimer1) & 0xFF; //day
  430. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[3] = ((TimeStracture.UTCtimer2) >> 24 ) & 0xFF; //hour
  431. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[4] = ((TimeStracture.UTCtimer2) >> 16 ) & 0xFF; //mins
  432. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[5] = ((TimeStracture.UTCtimer2) >> 8 ) & 0xFF;
  433. memcpy(VerMsgToTcpInfo.VerInfo.ICCID,iccid,20);
  434. memcpy(VerMsgToTcpInfo.VerInfo.IMEI,imei,15);
  435. osMutexAcquire(UartMutex, osWaitForever);//Bms版本号上传2021-03-24修改
  436. VerMsgToTcpInfo.VerInfo.BMSHwVersion[0] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]/10;
  437. VerMsgToTcpInfo.VerInfo.BMSHwVersion[1] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]%10;
  438. VerMsgToTcpInfo.VerInfo.BMSSwVersion[0] = 0;
  439. VerMsgToTcpInfo.VerInfo.BMSSwVersion[1] = 0;
  440. VerMsgToTcpInfo.VerInfo.BMSSwVersion[2] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]/10;
  441. VerMsgToTcpInfo.VerInfo.BMSSwVersion[3] = UartReadMsg.data[(0x08+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]%10;
  442. osMutexRelease(UartMutex);
  443. VerMsgToTcpInfo.VerInfo.NBHwVersion[0] = (HWVERSION>>8)& 0xFF;
  444. VerMsgToTcpInfo.VerInfo.NBHwVersion[1] = (HWVERSION)& 0xFF;
  445. VerMsgToTcpInfo.VerInfo.BLVersion[0] = (BLSWVERSION>>24)& 0xFF;
  446. VerMsgToTcpInfo.VerInfo.BLVersion[1] = (BLSWVERSION>>16)& 0xFF;
  447. VerMsgToTcpInfo.VerInfo.BLVersion[2] = (BLSWVERSION>>8)& 0xFF;
  448. VerMsgToTcpInfo.VerInfo.BLVersion[3] = (BLSWVERSION)& 0xFF;
  449. VerMsgToTcpInfo.VerInfo.DRVVersion[0] = (DRVSWVERSION>>24)& 0xFF;
  450. VerMsgToTcpInfo.VerInfo.DRVVersion[1] = (DRVSWVERSION>>16)& 0xFF;
  451. VerMsgToTcpInfo.VerInfo.DRVVersion[2] = (DRVSWVERSION>>8)& 0xFF;
  452. VerMsgToTcpInfo.VerInfo.DRVVersion[3] = (DRVSWVERSION)& 0xFF;
  453. VerMsgToTcpInfo.VerInfo.APPVersion[0] = (APPSWVERSION>>24)& 0xFF;
  454. VerMsgToTcpInfo.VerInfo.APPVersion[1] = (APPSWVERSION>>16)& 0xFF;
  455. VerMsgToTcpInfo.VerInfo.APPVersion[2] = (APPSWVERSION>>8)& 0xFF;
  456. VerMsgToTcpInfo.VerInfo.APPVersion[3] = (APPSWVERSION)& 0xFF;
  457. VerMsgToTcpInfo.VerInfo.BmsType = BMS_MANUFACTURE;
  458. VerMsgToTcpInfo.VerInfo.BmsInfo = BMS_INFO;
  459. VerMsgToTcpInfo.VerInfo.DataModuleType = DATA_MODULE_TYPE;
  460. VerMsgToTcpInfo.CRC = bcc_chk((UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo)-1 );
  461. if(UartReadMsg.UartFlag)
  462. {
  463. tcpipConnectionSend(socContext.id, (UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo), 0, 0, 0);
  464. }
  465. else
  466. {
  467. send_counter = 0;
  468. }
  469. }
  470. if(send_counter>0xffff)
  471. {
  472. send_counter = 0;
  473. }
  474. else
  475. {
  476. send_counter++;
  477. }
  478. }
  479. //Tcp数据接收处理函数
  480. static void TcpDataInfoRecvHandle()
  481. {
  482. TcpipConnectionRecvDataInd *TcpRecvData;
  483. osMessageQueueGet(TcpRecvHandle,&TcpRecvData,0,0);
  484. osDelay(100);
  485. Uart_Write_Data_Type UartWriteCmd;
  486. OsaUtcTimeTValue TimeStracture;
  487. UINT8 DataLen;
  488. UINT8 Tcp_Cmd;
  489. UINT8 Control_Cmd;
  490. UINT8 *Ptr;
  491. UINT8 TcpCmdAnswer[31];
  492. TcpCmdAnswer[0] = TCP_START_SYM1;
  493. TcpCmdAnswer[1] = TCP_START_SYM1;
  494. if(TcpRecvData != PNULL)
  495. {
  496. Ptr = TcpRecvData->data;
  497. if((*(Ptr+0)==TCP_START_SYM1)&&(*(Ptr+1)==TCP_START_SYM2))//服务器起始信息
  498. {
  499. Tcp_Cmd = *(Ptr+2);//命令标志
  500. if(*(Ptr+3)==0xFE)
  501. {
  502. TcpService=0x01;
  503. }
  504. switch (Tcp_Cmd)
  505. {
  506. case TCP_QUERY_SYM:
  507. break;
  508. case TCP_SETCMD_SYM:
  509. break;
  510. case TCP_CONCMD_SYM:
  511. {
  512. TcpCmdAnswer[2] = TCP_CONCMD_SYM;
  513. if(*(Ptr+30)==0x01)//远程升级命令
  514. {
  515. Fota_Func(Ptr,socContext.id);
  516. }
  517. else if(*(Ptr+30)==0x88)//BMS远程升级数据传输命令
  518. {
  519. Fota_Func(Ptr,socContext.id);
  520. }
  521. else if(*(Ptr+30)==0x80)//远程锁定命令
  522. {
  523. osMutexAcquire(UartMutex, osWaitForever);
  524. TcpCmdAnswer[3] = 0x01;
  525. memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
  526. TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
  527. TcpCmdAnswer[22] = 0x00;
  528. TcpCmdAnswer[23] = 0x06;
  529. memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
  530. TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
  531. if(*(Ptr+31)==0x01)//0x01代表锁定
  532. {
  533. AppNVMData.appDataModify = TRUE;
  534. AppNVMData.isBattLocked = TRUE;
  535. UartWriteCmd.WriteCmd = 0x01;
  536. UartWriteCmd.Data[0] = 0x00;
  537. UartWriteCmd.Data[1] = 0x00;
  538. if((UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03)==0x00)
  539. {
  540. osMessageQueuePut(UartWriteCmdHandle,&UartWriteCmd,0,1000);
  541. }
  542. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  543. }
  544. else //0x02代表解锁
  545. {
  546. AppNVMData.appDataModify = TRUE;
  547. AppNVMData.isBattLocked = FALSE;
  548. UartWriteCmd.WriteCmd = 0x01;
  549. UartWriteCmd.Data[0] = 0x00;
  550. UartWriteCmd.Data[1] = 0x03;
  551. osMessageQueuePut(UartWriteCmdHandle,&UartWriteCmd,0,1000);
  552. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  553. }
  554. osMutexRelease(UartMutex);
  555. TcpService=0x00;
  556. }
  557. else
  558. {
  559. TcpCmdAnswer[3] = 0x0f;
  560. memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
  561. TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
  562. TcpCmdAnswer[22] = 0x00;
  563. TcpCmdAnswer[23] = 0x06;
  564. memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
  565. TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
  566. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  567. }
  568. break;
  569. }
  570. default:
  571. break;
  572. }
  573. }
  574. free(TcpRecvData);
  575. }
  576. }
  577. //TCP发送校验函数
  578. UINT8 bcc_chk(UINT8* data, UINT8 length)
  579. {
  580. UINT8 bcc_chk_return = 0x00;
  581. UINT8 count = 0;
  582. while (count<length)
  583. {
  584. bcc_chk_return^=data[count];
  585. count++;
  586. }
  587. return bcc_chk_return;
  588. }
  589. //Tcp 状态转换函数
  590. static void sendQueueMsg(UINT32 msgId, UINT32 xTickstoWait)
  591. {
  592. eventCallbackMessage_t *queueMsg = NULL;
  593. queueMsg = malloc(sizeof(eventCallbackMessage_t));
  594. queueMsg->messageId = msgId;
  595. if (psEventQueueHandle)
  596. {
  597. if (pdTRUE != xQueueSend(psEventQueueHandle, &queueMsg, xTickstoWait))
  598. {
  599. ECOMM_TRACE(UNILOG_PLA_APP, sendQueueMsg_1, P_ERROR, 0, "xQueueSend error");
  600. }
  601. }
  602. }
  603. //Tcp状态注册函数
  604. static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen)
  605. {
  606. CmiSimImsiStr *imsi = NULL;
  607. CmiPsCeregInd *cereg = NULL;
  608. UINT8 rssi = 0, index = 0;
  609. NmAtiNetifInfo *netif = NULL;
  610. switch(eventID)
  611. {
  612. case NB_URC_ID_SIM_READY:
  613. {
  614. imsi = (CmiSimImsiStr *)param;
  615. memcpy(gImsi, imsi->contents, imsi->length);
  616. #ifdef USING_PRINTF
  617. printf("SIM ready(imsi=%s)\n",(UINT8 *)imsi->contents);
  618. #endif
  619. break;
  620. }
  621. case NB_URC_ID_MM_SIGQ:
  622. {
  623. rssi = *(UINT8 *)param;
  624. #ifdef USING_PRINTF
  625. printf("RSSI signal=%d\n",rssi);
  626. #endif
  627. break;
  628. }
  629. case NB_URC_ID_PS_BEARER_ACTED:
  630. {
  631. #ifdef USING_PRINTF
  632. printf("Default bearer activated\n");
  633. #endif
  634. break;
  635. }
  636. case NB_URC_ID_PS_BEARER_DEACTED:
  637. {
  638. #ifdef USING_PRINTF
  639. printf("Default bearer Deactivated\n");
  640. #endif
  641. break;
  642. }
  643. case NB_URC_ID_PS_CEREG_CHANGED:
  644. {
  645. cereg = (CmiPsCeregInd *)param;
  646. gCellID = cereg->celId;
  647. #ifdef USING_PRINTF
  648. printf("URCCallBack:CEREG changed act:%d celId:%d locPresent:%d tac:%d\n", cereg->act, cereg->celId, cereg->locPresent, cereg->tac);
  649. #endif
  650. break;
  651. }
  652. case NB_URC_ID_PS_NETINFO:
  653. {
  654. netif = (NmAtiNetifInfo *)param;
  655. if (netif->netStatus == NM_NETIF_ACTIVATED)
  656. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  657. break;
  658. }
  659. }
  660. return 0;
  661. }
  662. //Tcpz连接状态回调函数
  663. static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEvent)
  664. {
  665. switch(connectionEventType)
  666. {
  667. case TCPIP_CONNECTION_STATUS_EVENT:
  668. {
  669. TcpipConnectionStatusInd *statusInd;
  670. statusInd = (TcpipConnectionStatusInd *)bodyEvent;
  671. if(statusInd != PNULL)
  672. {
  673. if(statusInd->status == TCPIP_CONNECTION_STATUS_CLOSED)
  674. {
  675. #ifdef USING_PRINTF
  676. printf("socketAppConnectionCallBack socket connection %u closed,cause %u", statusInd->connectionId, statusInd->cause);
  677. #endif
  678. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_1, P_ERROR, 2, "socketAppConnectionCallBack socket connection %u closed,cause %u", statusInd->connectionId, statusInd->cause);
  679. if(statusInd->connectionId == socContext.id)
  680. {
  681. socContext.id = -1;
  682. socContext.status = APP_SOCKET_CONNECTION_CLOSED;
  683. }
  684. }
  685. else if(statusInd->status == TCPIP_CONNECTION_STATUS_CONNECTING)
  686. {
  687. #ifdef USING_PRINTF
  688. printf("socketAppConnectionCallBack socket connection %u is connecting", statusInd->connectionId);
  689. #endif
  690. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_2, P_INFO, 1, "socketAppConnectionCallBack socket connection %u is connecting", statusInd->connectionId);
  691. if(statusInd->connectionId == socContext.id)
  692. {
  693. socContext.status = APP_SOCKET_CONNECTION_CONNECTING;
  694. }
  695. }
  696. else if(statusInd->status == TCPIP_CONNECTION_STATUS_CONNECTED)
  697. {
  698. #ifdef USING_PRINTF
  699. printf("socketAppConnectionCallBack socket connection %u is connected", statusInd->connectionId);
  700. #endif
  701. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_3, P_ERROR, 1, "socketAppConnectionCallBack socket connection %u is connected", statusInd->connectionId);
  702. if(statusInd->connectionId == socContext.id)
  703. {
  704. socContext.status = APP_SOCKET_CONNECTION_CONNECTED;
  705. }
  706. }
  707. }
  708. else
  709. {
  710. #ifdef USING_PRINTF
  711. printf("socketAppConnectionCallBack invalid connection status event");
  712. #endif
  713. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_4, P_ERROR, 0, "socketAppConnectionCallBack invalid connection status event");
  714. }
  715. break;
  716. }
  717. case TCPIP_CONNECTION_RECEIVE_EVENT:
  718. {
  719. TcpipConnectionRecvDataInd *rcvInd;
  720. TcpipConnectionRecvDataInd *rcvbuffer = NULL;
  721. rcvInd = (TcpipConnectionRecvDataInd *)bodyEvent;
  722. if(rcvInd != PNULL)
  723. {
  724. rcvbuffer = malloc(sizeof(TcpipConnectionRecvDataInd));
  725. memcpy(rcvbuffer,rcvInd,sizeof(TcpipConnectionRecvDataInd));
  726. osMessageQueuePut(TcpRecvHandle,&rcvbuffer,0,1000);
  727. sendQueueMsg(QMSG_ID_SOCK_RECVPKG, 0);
  728. #ifdef USING_PRINTF
  729. uint8_t* Ptr;
  730. Ptr=rcvInd->data;
  731. printf("socket connection %u receive length %u data:", rcvInd->connectionId, rcvInd->length);
  732. for(int i = 0;i<rcvInd->length;i++)
  733. printf("%x ",*(Ptr+i));
  734. printf("\n");
  735. #endif
  736. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_5, P_INFO, 2, "socketAppConnectionCallBack socket connection %u receive length %u data", rcvInd->connectionId, rcvInd->length);
  737. }
  738. else
  739. {
  740. #ifdef USING_PRINTF
  741. printf( "socketAppConnectionCallBack invalid connection rcv event");
  742. #endif
  743. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_6, P_ERROR, 0, "socketAppConnectionCallBack invalid connection rcv event");
  744. }
  745. break;
  746. }
  747. case TCPIP_CONNECTION_UL_STATUS_EVENT:
  748. {
  749. TcpipConnectionUlDataStatusInd *ulStatusInd;
  750. ulStatusInd = (TcpipConnectionUlDataStatusInd *)bodyEvent;
  751. if(ulStatusInd != PNULL)
  752. {
  753. if(ulStatusInd->status == Tcpip_Connection_UL_DATA_SUCCESS)
  754. {
  755. #ifdef USING_PRINTF
  756. printf( "socketAppConnectionCallBack socket connection %u sequence %u data has sent success", ulStatusInd->connectionId, ulStatusInd->sequence);
  757. #endif
  758. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_7, P_INFO, 2, "socketAppConnectionCallBack socket connection %u sequence %u data has sent success", ulStatusInd->connectionId, ulStatusInd->sequence);
  759. }
  760. else if(ulStatusInd->status == Tcpip_Connection_UL_DATA_FAIL)
  761. {
  762. #ifdef USING_PRINTF
  763. printf("socketAppConnectionCallBack socket connection %u sequence %u data has sent fail", ulStatusInd->connectionId, ulStatusInd->sequence);
  764. #endif
  765. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_8, P_WARNING, 2, "socketAppConnectionCallBack socket connection %u sequence %u data has sent fail", ulStatusInd->connectionId, ulStatusInd->sequence);
  766. }
  767. }
  768. else
  769. {
  770. #ifdef USING_PRINTF
  771. printf("socketAppConnectionCallBack invalid connection ul status event");
  772. #endif
  773. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_9, P_ERROR, 0, "socketAppConnectionCallBack invalid connection ul status event");
  774. }
  775. break;
  776. }
  777. default:
  778. #ifdef USING_PRINTF
  779. printf("socketAppConnectionCallBack invalid event type %u", connectionEventType);
  780. #endif
  781. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_10, P_ERROR, 1, "socketAppConnectionCallBack invalid event type %u", connectionEventType);
  782. break;
  783. }
  784. }