TcpTask.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  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. #include "Signal.h"
  34. //全局变量输出区
  35. UINT32 TcpService = 0;
  36. //全局变量输入区
  37. extern UINT32 Timer_count;
  38. extern volatile BOOL Sleep_flag;
  39. extern osMutexId_t GpsMutex;
  40. extern UINT8 GpsData[20];
  41. extern AppNVMDataType AppNVMData;
  42. extern AppDataBody AppDataInfo;
  43. extern QueueHandle_t UartWriteCmdHandle;
  44. extern BOOL UartBattInfoRecvFlag;
  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. appSetEDRXSettingSync(0,5,1800000);
  70. appSetPSMSettingSync(1,3*60*60,10);
  71. appSetCFUN(1);
  72. psEventQueueHandle = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(eventCallbackMessage_t*));
  73. PROC_TCP_STATE_SWITCH(PROCESS_TCP_STATE_IDLE);
  74. if (psEventQueueHandle == NULL)
  75. {
  76. return;
  77. }
  78. if(TcpRecvHandle == NULL)
  79. {
  80. TcpRecvHandle = osMessageQueueNew(2,sizeof(TcpipConnectionRecvDataInd*), NULL);
  81. }
  82. osDelay(5000);//等待驻网延时5s
  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(socContext.id < 0)
  110. {
  111. struct addrinfo hints;
  112. struct addrinfo *servinfo = NULL;
  113. char *Tcp_ip_des;
  114. memset(&hints, 0, sizeof(hints));
  115. hints.ai_family = AF_INET;
  116. hints.ai_socktype = SOCK_STREAM;
  117. getaddrinfo(QX_TCP_ADD, NULL, &hints, &servinfo);
  118. Tcp_ip_des = ip4addr_ntoa((const ip4_addr_t *)(&(servinfo->ai_addr->sa_data[2])));
  119. #ifdef USING_PRINTF1
  120. printf("\nservinfo-%d:\n",servinfo->ai_addr->sa_len);
  121. for(int i=0;i<4;i++)
  122. printf("%d ",servinfo->ai_addr->sa_data[2+i]);
  123. printf("\nTcp_ip_des-%d:\n",sizeof(Tcp_ip_des));
  124. for(int i=0;i<16;i++)
  125. printf("%c",*(Tcp_ip_des+i));
  126. #endif
  127. socContext.id = tcpipConnectionCreate(TCPIP_CONNECTION_PROTOCOL_TCP, PNULL, 0, Tcp_ip_des, QX_TCP_PORT, socketAppConnectionCallBack);
  128. if (NULL != servinfo) {
  129. freeaddrinfo(servinfo);
  130. }
  131. }
  132. if(socContext.id >= 0)
  133. {
  134. socContext.status = APP_SOCKET_CONNECTION_CONNECTED;
  135. #ifdef USING_PRINTF
  136. printf("create connection %u success", socContext.id);
  137. #endif
  138. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_2, P_INFO, 1, "create connection %u success", socContext.id);
  139. }
  140. else
  141. {
  142. sendQueueMsg(QMSG_ID_NW_IP_NOREACHABLE, 0);
  143. #ifdef USING_PRINTF
  144. printf("create connection fail\n");
  145. #endif
  146. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_3, P_ERROR, 0, "create connection fail");
  147. }
  148. break;
  149. case QMSG_ID_NW_IP_NOREACHABLE:
  150. {
  151. Error_count++;
  152. appSetCFUN(0);
  153. osDelay(5000);
  154. appSetCFUN(1);
  155. osDelay(5000);
  156. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  157. }
  158. break;
  159. case QMSG_ID_SOCK_SENDPKG:
  160. if (socContext.id >= 0 && socContext.status == APP_SOCKET_CONNECTION_CONNECTED)
  161. {
  162. TcpDataInfoAssembleSend();
  163. }
  164. else
  165. {
  166. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  167. #ifdef USING_PRINTF
  168. printf("connection %u or status invalid", socContext.id, socContext.status);
  169. #endif
  170. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_9, P_ERROR, 2, "connection %u or status invalid", socContext.id, socContext.status);
  171. }
  172. break;
  173. case QMSG_ID_SOCK_RECVPKG:
  174. TcpDataInfoRecvHandle();
  175. osDelay(100);
  176. TcpRecvEnd = 0;
  177. break;
  178. case QMSG_ID_NW_IP_SUSPEND:
  179. if (socContext.id >= 0 && socContext.status != APP_SOCKET_CONNECTION_CLOSED)
  180. {
  181. if(tcpipConnectionClose(socContext.id) < 0)
  182. {
  183. socContext.id = -1;
  184. socContext.status = APP_SOCKET_CONNECTION_CLOSED;
  185. #ifdef USING_PRINTF
  186. printf("close connection %u success", socContext.id);
  187. #endif
  188. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_4, P_INFO, 1, "close connection %u success", socContext.id);
  189. }
  190. else
  191. {
  192. #ifdef USING_PRINTF
  193. printf("close connection %u fail", socContext.id);
  194. #endif
  195. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_5, P_ERROR, 1, "close connection %u fail", socContext.id);
  196. }
  197. }
  198. else
  199. {
  200. #ifdef USING_PRINTF
  201. printf("connection %u or status invalid", socContext.id, socContext.status);
  202. #endif
  203. ECOMM_TRACE(UNILOG_PLA_APP, ecTestCaseTcpClient_6, P_ERROR, 2, "connection %u or status invalid", socContext.id, socContext.status);
  204. }
  205. break;
  206. case QMSG_ID_SOCK_EXIT:
  207. #ifdef USING_PRINTF
  208. printf("QMSG_ID_SOCK_EXIT queueItem->messageId:%x\n",queueItem->messageId);
  209. #endif
  210. #ifdef USING_PRINTF
  211. printf("socket exit\n");
  212. #endif
  213. appSetCFUN(0);
  214. free(queueItem);
  215. osDelay(1000);
  216. TcpTaskDeInit(arg);
  217. break;
  218. }
  219. free(queueItem);
  220. }
  221. }//while 循环
  222. }
  223. //Tcp线程初始化
  224. void TcpTaskInit(void *arg)
  225. {
  226. osThreadAttr_t task_attr;
  227. registerPSEventCallback(NB_GROUP_ALL_MASK, socketRegisterPSUrcCallback);
  228. memset(&task_attr,0,sizeof(task_attr));
  229. memset(gProcess_Tcp_TaskStack, 0xA5, PROC_TCP_TASK_STACK_SIZE);
  230. task_attr.name = "Tcp_Task";
  231. task_attr.stack_mem = gProcess_Tcp_TaskStack;
  232. task_attr.stack_size = PROC_TCP_TASK_STACK_SIZE;
  233. task_attr.priority = osPriorityBelowNormal7;
  234. task_attr.cb_mem = &gProcess_Tcp_Task_t;
  235. task_attr.cb_size = sizeof(StaticTask_t);
  236. TcpTaskId = osThreadNew(TcpTask, NULL, &task_attr);
  237. }
  238. void TcpTaskDeInit(void *arg)
  239. {
  240. osThreadTerminate(TcpTaskId);
  241. TcpTaskId = NULL;
  242. }
  243. /*------------------------------函数区域----------------------------------------------------------------------------------------------*/
  244. static void TcpDataInfoAssembleSend()
  245. { static UINT32 send_counter = 0;
  246. OsaUtcTimeTValue TimeStracture;
  247. UINT8 csq=0;
  248. INT8 snr=0;
  249. INT8 rsnr=0;
  250. INT16 Batt_current=0;
  251. UINT16 BattU=0;
  252. UINT8 temp=0;
  253. UINT16 DataLen=0;
  254. UINT8 BattSendFreq=6;
  255. UINT8 GpsSendFreq=1;
  256. UINT16 year;
  257. UINT8 month,day,hour,minute,sec;
  258. UINT16 ErrorTemp;
  259. UTC8TimeType UTC8TimeTcp;
  260. int i = 0;
  261. INT8 len = -1;
  262. switch(BattWorkStateDelay)
  263. {
  264. case BATT_IDLE_SYM:
  265. BattSendFreq = 30/5;
  266. GpsSendFreq = 30/5;
  267. break;
  268. case BATT_DISCHARGE_SYM:
  269. GpsSendFreq = 10/5;
  270. BattSendFreq = 30/5;
  271. break;
  272. case BATT_CHARGE_SYM:
  273. BattSendFreq = 10/5;
  274. GpsSendFreq = 30/5;
  275. break;
  276. default:
  277. BattSendFreq = 30/5;
  278. GpsSendFreq = 30/5;
  279. break;
  280. }
  281. if(VibrationStatus)
  282. {
  283. GpsSendFreq = 10/5;
  284. VibrationStatus=0x00;
  285. }
  286. if(send_counter%BattSendFreq==0)
  287. {
  288. BattMsgtoTcpType BattToTcpInfo;
  289. //osStatus_t result = osMutexAcquire(UartMutex, osWaitForever);
  290. appGetSystemTimeUtcSync(&TimeStracture);
  291. year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
  292. month=(TimeStracture.UTCtimer1&0xff00)>>8;
  293. day=TimeStracture.UTCtimer1&0xff;
  294. hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
  295. minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
  296. sec=(TimeStracture.UTCtimer2&0xff00)>>8;
  297. UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
  298. appGetSignalInfoSync(&csq,&snr,&rsnr);
  299. DataLen= (UINT16)sizeof(BattToTcpInfo.battInfo);
  300. BattToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  301. BattToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  302. BattToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  303. BattToTcpInfo.ansSymbol = TCP_ANS_SYM;
  304. memcpy(BattToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  305. BattToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  306. BattToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  307. BattToTcpInfo.dataLength[1] = DataLen & 0xFF;
  308. #ifdef USING_PRINTF1
  309. 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);
  310. #endif
  311. BattToTcpInfo.battInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  312. BattToTcpInfo.battInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  313. BattToTcpInfo.battInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  314. BattToTcpInfo.battInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  315. BattToTcpInfo.battInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  316. BattToTcpInfo.battInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec
  317. BattToTcpInfo.battInfo.msgMark = BATTMSG;
  318. BattToTcpInfo.battInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  319. BattToTcpInfo.battInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  320. BattToTcpInfo.battInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  321. BattToTcpInfo.battInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  322. BattToTcpInfo.battInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  323. BattToTcpInfo.battInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec
  324. BattToTcpInfo.battInfo.signalStrength = csq ;
  325. //故障等级故障代码上传
  326. if(osOK==osMutexAcquire(Error_Mutex, 100))
  327. {
  328. UINT16 ErrorTemp=0x00;
  329. ErrorTemp = GetErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum));
  330. #ifdef USING_PRINTF1
  331. printf("Temp-Error:%d\n",ErrorTemp);
  332. #endif
  333. BattToTcpInfo.battInfo.errClass = 0x00;
  334. BattToTcpInfo.battInfo.errCode[0] = ErrorTemp>>8;
  335. BattToTcpInfo.battInfo.errCode[1] = ErrorTemp;
  336. }
  337. else
  338. {
  339. #ifdef USING_PRINTF1
  340. printf("Temp-Error:%d\n",ErrorTemp);
  341. #endif
  342. BattToTcpInfo.battInfo.errClass = 0x00;
  343. BattToTcpInfo.battInfo.errCode[0] = 0x00;
  344. BattToTcpInfo.battInfo.errCode[1] = 0x00;
  345. }
  346. osMutexRelease(Error_Mutex);
  347. BattToTcpInfo.battInfo.battI[0] = battI>>8;
  348. BattToTcpInfo.battInfo.battI[1] = battI & 0xFF;
  349. //电池内外电压保持一致
  350. BattToTcpInfo.battInfo.battLinkVol[0] = battPackVol >> 8;
  351. BattToTcpInfo.battInfo.battLinkVol[1] = battPackVol & 0xFF;
  352. BattToTcpInfo.battInfo.battPackVol[0] = battPackVol >> 8;
  353. BattToTcpInfo.battInfo.battPackVol[1] = battPackVol & 0xFF;
  354. BattToTcpInfo.battInfo.switchState = battMOSSwitchState;
  355. BattToTcpInfo.battInfo.battSOC = battSOC;
  356. BattToTcpInfo.battInfo.battSOH = battSOH;
  357. BattToTcpInfo.battInfo.batCellBalenceState[0] = (battBalanceoInfo>>24)&0xFF;
  358. BattToTcpInfo.battInfo.batCellBalenceState[1] = (battBalanceoInfo>>16)&0xFF;
  359. BattToTcpInfo.battInfo.batCellBalenceState[2] = (battBalanceoInfo>>8)&0xFF;
  360. BattToTcpInfo.battInfo.batCellBalenceState[3] = battBalanceoInfo&0xFF;
  361. BattToTcpInfo.battInfo.battCellNum= BATT_CELL_VOL_NUM ;
  362. for(i=0;i<BATT_CELL_VOL_NUM;i++)
  363. {
  364. BattToTcpInfo.battInfo.battCellU[i*2] = (battCellU[i]>>8) & 0xFF;
  365. BattToTcpInfo.battInfo.battCellU[i*2+1] = battCellU[i] & 0xFF;
  366. }
  367. BattToTcpInfo.battInfo.battTempNum = BATT_TEMP_NUM;
  368. for(i=0; i<BATT_TEMP_NUM; i++)
  369. {
  370. BattToTcpInfo.battInfo.battCellTemp[i] = battCellTemp[i];
  371. }
  372. BattToTcpInfo.battInfo.battWorkState = battWorkState;//电池状态,0表示静置,1表示放电,2表示充电
  373. BattToTcpInfo.battInfo.battHeatEnableState = battHeatEnableState;
  374. BattToTcpInfo.battInfo.battotherTempNum = BATT_OTHER_TEMP_NUM+NB_OTHER_TEMP_NUM;//其他温度编号(包含环境温度mos温度以及接插件温度)2021-03-24其他温度修改
  375. BattToTcpInfo.battInfo.battotherTemp[0] = MOSTemp;
  376. BattToTcpInfo.battInfo.battotherTemp[1] = packTemp;
  377. BattToTcpInfo.battInfo.battotherTemp[2] = fastChargeTemp;
  378. BattToTcpInfo.battInfo.battotherTemp[3] = normalChargeTemp;
  379. BattToTcpInfo.battInfo.battotherTemp[4] = heatTemp1;
  380. BattToTcpInfo.battInfo.battotherTemp[5] = heatTemp2;
  381. BattToTcpInfo.CRC = bcc_chk((UINT8 *)&BattToTcpInfo, sizeof(BattMsgtoTcpType)-1 );
  382. //osMutexRelease(UartMutex);
  383. if(UartBattInfoRecvFlag)
  384. {
  385. len = tcpipConnectionSend(socContext.id, (UINT8 *)&BattToTcpInfo, sizeof(BattToTcpInfo), 0, 0, 0);
  386. if(len>0)
  387. {
  388. TcpSendLen = 0x02 | TcpSendLen;
  389. }
  390. else
  391. {
  392. TcpSendLen = 0xFD & TcpSendLen;
  393. sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0);
  394. }
  395. }
  396. }
  397. if(send_counter%GpsSendFreq==0)
  398. {
  399. GPSMsgtoTcpType GpsToTcpInfo;
  400. UINT16 Tac = 0;
  401. UINT32 CellId = 0;
  402. appGetLocationInfoSync(&Tac,&CellId);
  403. osStatus_t result = osMutexAcquire(GpsMutex, osWaitForever);
  404. appGetSystemTimeUtcSync(&TimeStracture);
  405. year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
  406. month=(TimeStracture.UTCtimer1&0xff00)>>8;
  407. day=TimeStracture.UTCtimer1&0xff;
  408. hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
  409. minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
  410. sec=(TimeStracture.UTCtimer2&0xff00)>>8;
  411. UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
  412. DataLen= (UINT16)sizeof(GpsToTcpInfo.gpsInfo);
  413. GpsToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  414. GpsToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  415. GpsToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  416. GpsToTcpInfo.ansSymbol = TCP_ANS_SYM;
  417. memcpy(GpsToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  418. GpsToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  419. GpsToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  420. GpsToTcpInfo.dataLength[1] = DataLen & 0xFF;
  421. GpsToTcpInfo.gpsInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  422. GpsToTcpInfo.gpsInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  423. GpsToTcpInfo.gpsInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  424. GpsToTcpInfo.gpsInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  425. GpsToTcpInfo.gpsInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  426. GpsToTcpInfo.gpsInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec
  427. GpsToTcpInfo.gpsInfo.msgMark = GPSMSG;
  428. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  429. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  430. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  431. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  432. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  433. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
  434. memcpy((UINT8 *)&GpsToTcpInfo.gpsInfo.locateMark, GpsData,sizeof(GpsData));
  435. GpsToTcpInfo.gpsInfo.Tac[0] = Tac>>8;
  436. GpsToTcpInfo.gpsInfo.Tac[1] = Tac;
  437. GpsToTcpInfo.gpsInfo.CellId[0] = CellId>>24;
  438. GpsToTcpInfo.gpsInfo.CellId[1] = CellId>>16;
  439. GpsToTcpInfo.gpsInfo.CellId[2] = CellId>>8;
  440. GpsToTcpInfo.gpsInfo.CellId[3] = CellId;
  441. UINT16 xyzDatacahce[3] = {0};
  442. memcpy(xyzDatacahce,xzyDataSend,sizeof(xzyDataSend));
  443. for (UINT8 i = 0; i < 3; i++)
  444. {
  445. if(xyzDatacahce[i]>0x8000)// 数据为负
  446. {
  447. xyzDatacahce[i] = (UINT16)((UINT16)(~(xyzDatacahce[i]))+1);
  448. xyzDatacahce[i] = 20000U - xyzDatacahce[i];
  449. }
  450. else
  451. {
  452. xyzDatacahce[i] = xyzDatacahce[i] + 20000U;
  453. }
  454. }
  455. GpsToTcpInfo.gpsInfo.xData[0] = xyzDatacahce[0]>>8;
  456. GpsToTcpInfo.gpsInfo.xData[1] = xyzDatacahce[0];
  457. GpsToTcpInfo.gpsInfo.yData[0] = xyzDatacahce[1]>>8;
  458. GpsToTcpInfo.gpsInfo.yData[1] = xyzDatacahce[1];
  459. GpsToTcpInfo.gpsInfo.zData[0] = xyzDatacahce[2]>>8;
  460. GpsToTcpInfo.gpsInfo.zData[1] = xyzDatacahce[2];
  461. GpsToTcpInfo.CRC = bcc_chk((UINT8 *)&GpsToTcpInfo, sizeof(GPSMsgtoTcpType)-1 );
  462. osMutexRelease(GpsMutex);
  463. //if(GpsToTcpInfo.gpsInfo.locateMark==0x01)
  464. if(1)
  465. {
  466. len = tcpipConnectionSend(socContext.id, (UINT8 *)&GpsToTcpInfo, sizeof(GpsToTcpInfo), 0, 0, 0);
  467. if(len>0)
  468. {
  469. TcpSendLen = 0x04 | TcpSendLen;
  470. }
  471. else
  472. {
  473. TcpSendLen = 0xFB & TcpSendLen;
  474. sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0);
  475. }
  476. }
  477. #ifdef USING_PRINTF1
  478. printf("GpsMsg:\n");
  479. UINT8* p = (UINT8 *)&GpsToTcpInfo;
  480. for(int i =0 ;i<sizeof(GpsToTcpInfo);i++)
  481. printf("%x ",*(p+i));
  482. #endif
  483. }
  484. if(send_counter==1)//版本信息上报
  485. {
  486. VersionMsgtoTcpType VerMsgToTcpInfo;
  487. CHAR iccid[20];
  488. CHAR imei[15];
  489. appGetIccidNumSync(iccid);
  490. appGetImeiNumSync(imei);
  491. appGetSystemTimeUtcSync(&TimeStracture);
  492. year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
  493. month=(TimeStracture.UTCtimer1&0xff00)>>8;
  494. day=TimeStracture.UTCtimer1&0xff;
  495. hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
  496. minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
  497. sec=(TimeStracture.UTCtimer2&0xff00)>>8;
  498. UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
  499. DataLen= (UINT16)sizeof(VerMsgToTcpInfo.VerInfo);
  500. VerMsgToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  501. VerMsgToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  502. VerMsgToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  503. VerMsgToTcpInfo.ansSymbol = TCP_ANS_SYM;
  504. memcpy(VerMsgToTcpInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  505. VerMsgToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  506. VerMsgToTcpInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  507. VerMsgToTcpInfo.dataLength[1] = DataLen & 0xFF;
  508. VerMsgToTcpInfo.VerInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  509. VerMsgToTcpInfo.VerInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  510. VerMsgToTcpInfo.VerInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  511. VerMsgToTcpInfo.VerInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  512. VerMsgToTcpInfo.VerInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  513. VerMsgToTcpInfo.VerInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec
  514. VerMsgToTcpInfo.VerInfo.msgMark = VERSIONMSG;
  515. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  516. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  517. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  518. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  519. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  520. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
  521. memcpy(VerMsgToTcpInfo.VerInfo.ICCID,iccid,20);
  522. memcpy(VerMsgToTcpInfo.VerInfo.IMEI,imei,15);
  523. //osMutexAcquire(UartMutex, osWaitForever);//Bms版本号上传2021-03-24修改
  524. VerMsgToTcpInfo.VerInfo.BMSHwVersion[0] = bmsHwVersion /10;
  525. VerMsgToTcpInfo.VerInfo.BMSHwVersion[1] = bmsHwVersion %10;
  526. VerMsgToTcpInfo.VerInfo.BMSSwVersion[0] = 0;
  527. VerMsgToTcpInfo.VerInfo.BMSSwVersion[1] = 0;
  528. VerMsgToTcpInfo.VerInfo.BMSSwVersion[2] = bmsSwVersion/10;
  529. VerMsgToTcpInfo.VerInfo.BMSSwVersion[3] = bmsSwVersion%10;
  530. //osMutexRelease(UartMutex);
  531. VerMsgToTcpInfo.VerInfo.NBHwVersion[0] = (HWVERSION>>8)& 0xFF;
  532. VerMsgToTcpInfo.VerInfo.NBHwVersion[1] = (HWVERSION)& 0xFF;
  533. VerMsgToTcpInfo.VerInfo.BLVersion[0] = (BLSWVERSION>>24)& 0xFF;
  534. VerMsgToTcpInfo.VerInfo.BLVersion[1] = (BLSWVERSION>>16)& 0xFF;
  535. VerMsgToTcpInfo.VerInfo.BLVersion[2] = (BLSWVERSION>>8)& 0xFF;
  536. VerMsgToTcpInfo.VerInfo.BLVersion[3] = (BLSWVERSION)& 0xFF;
  537. VerMsgToTcpInfo.VerInfo.DRVVersion[0] = (DRVSWVERSION>>24)& 0xFF;
  538. VerMsgToTcpInfo.VerInfo.DRVVersion[1] = (DRVSWVERSION>>16)& 0xFF;
  539. VerMsgToTcpInfo.VerInfo.DRVVersion[2] = (DRVSWVERSION>>8)& 0xFF;
  540. VerMsgToTcpInfo.VerInfo.DRVVersion[3] = (DRVSWVERSION)& 0xFF;
  541. VerMsgToTcpInfo.VerInfo.APPVersion[0] = (APPSWVERSION>>24)& 0xFF;
  542. VerMsgToTcpInfo.VerInfo.APPVersion[1] = (APPSWVERSION>>16)& 0xFF;
  543. VerMsgToTcpInfo.VerInfo.APPVersion[2] = (APPSWVERSION>>8)& 0xFF;
  544. VerMsgToTcpInfo.VerInfo.APPVersion[3] = (APPSWVERSION)& 0xFF;
  545. VerMsgToTcpInfo.VerInfo.BmsType = BMS_MANUFACTURE;
  546. VerMsgToTcpInfo.VerInfo.BmsInfo = BMS_INFO;
  547. VerMsgToTcpInfo.VerInfo.DataModuleType = DATA_MODULE_TYPE;
  548. VerMsgToTcpInfo.CRC = bcc_chk((UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo)-1 );
  549. if(NB_Fota_update_flag==FALSE)
  550. {
  551. len = tcpipConnectionSend(socContext.id, (UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo), 0, 0, 0);
  552. if(len>0)
  553. {
  554. TcpSendLen = 0x01 | TcpSendLen;
  555. }
  556. else
  557. {
  558. send_counter = 0;
  559. TcpSendLen = 0xFE & TcpSendLen;
  560. sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0);
  561. }
  562. }
  563. }
  564. if(send_counter%12==0 && send_counter!=0)//发送调试信息,此处发送参数信息/60s一次
  565. {
  566. DebugMsgtoTcpType DebugMsgInfo;
  567. UINT8 *SendBuffer = NULL;
  568. UINT8 BufferLen = 0;
  569. UINT8 rbuf[100];
  570. sprintf((char *)rbuf,"%d,%x,%x,%d,%d,%d,%d,%d,,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x",
  571. Data_Current,BattRemainCap,battProtectState,SOC2,SOC1,battSOC,AppDataInfo.RelayControl,chargerConnectState,
  572. Data_33,Data_34,Data_35,Data_37,Data_38,Data_39,Data_3A,Data_3B,Data_3C,Data_3D,Data_3E,Data_3F,Data_40,Data_41,Data_42,Data_43);//累计里程,剩余容量,保护状态,BMS-SOC,acc_soc,disp-soc,relay,
  573. BufferLen = strlen(rbuf);
  574. SendBuffer = malloc(BufferLen+sizeof(DebugMsgInfo));
  575. memcpy(SendBuffer+sizeof(DebugMsgInfo)-1, rbuf,BufferLen);
  576. appGetSystemTimeUtcSync(&TimeStracture);
  577. year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
  578. month=(TimeStracture.UTCtimer1&0xff00)>>8;
  579. day=TimeStracture.UTCtimer1&0xff;
  580. hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
  581. minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
  582. sec=(TimeStracture.UTCtimer2&0xff00)>>8;
  583. UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
  584. DataLen=sizeof(DebugMsgInfo.DebugInfo) + BufferLen;
  585. DebugMsgInfo.startSymbol[0] = TCP_START_SYM1;
  586. DebugMsgInfo.startSymbol[1] = TCP_START_SYM2;
  587. DebugMsgInfo.cmdSymbol = TCP_CMD_SYM;
  588. DebugMsgInfo.ansSymbol = TCP_ANS_SYM;
  589. memcpy(DebugMsgInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  590. DebugMsgInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  591. DebugMsgInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  592. DebugMsgInfo.dataLength[1] = DataLen & 0xFF;
  593. DebugMsgInfo.DebugInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  594. DebugMsgInfo.DebugInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  595. DebugMsgInfo.DebugInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  596. DebugMsgInfo.DebugInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  597. DebugMsgInfo.DebugInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  598. DebugMsgInfo.DebugInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec
  599. DebugMsgInfo.DebugInfo.msgMark = DEBUGMSG;
  600. DebugMsgInfo.DebugInfo.DebugLen[0] = BufferLen>>8;
  601. DebugMsgInfo.DebugInfo.DebugLen[1] = BufferLen;
  602. memcpy(SendBuffer,(UINT8 *)&DebugMsgInfo,sizeof(DebugMsgInfo)-1);
  603. DebugMsgInfo.CRC = bcc_chk(SendBuffer, BufferLen+sizeof(DebugMsgInfo)-1);
  604. memcpy(SendBuffer+BufferLen+sizeof(DebugMsgInfo)-1,&DebugMsgInfo.CRC,1);
  605. len = tcpipConnectionSend(socContext.id, SendBuffer, BufferLen+sizeof(DebugMsgInfo), 0, 0, 0);
  606. #ifdef USING_PRINTF1
  607. printf("\nDebugData!-%d-%s\n",len,rbuf);
  608. UINT8* p = SendBuffer;
  609. for(i =0 ;i<BufferLen+sizeof(DebugMsgInfo);i++)
  610. printf("%x ",*(p+i));
  611. #endif
  612. free(SendBuffer);
  613. }
  614. if(send_counter==0)//发送本次文件中的调试信息,此处发送文件信息
  615. {
  616. DebugMsgtoTcpType DebugMsgInfo;
  617. UINT8 *SendBuffer = NULL;
  618. UINT16 BufferLen = 0;
  619. BufferLen = Debug_GetSize();
  620. if(BufferLen>200)
  621. {
  622. Debug_Del_Logfile();
  623. #ifdef DEBUGLOG
  624. Debug_printf("Sys:%d\n",AppDataInfo.SysReStart);
  625. #endif
  626. BufferLen = Debug_GetSize();
  627. }
  628. UINT8 rbuf[BufferLen];
  629. Debug_Read_Logfile(rbuf,BufferLen);
  630. SendBuffer = malloc(BufferLen+sizeof(DebugMsgInfo));
  631. memcpy(SendBuffer+sizeof(DebugMsgInfo)-1, rbuf,BufferLen);
  632. appGetSystemTimeUtcSync(&TimeStracture);
  633. year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
  634. month=(TimeStracture.UTCtimer1&0xff00)>>8;
  635. day=TimeStracture.UTCtimer1&0xff;
  636. hour=(TimeStracture.UTCtimer2&0xff000000)>>24;
  637. minute=(TimeStracture.UTCtimer2&0xff0000)>>16;
  638. sec=(TimeStracture.UTCtimer2&0xff00)>>8;
  639. UTCToBeijing((UTC8TimeType *)&UTC8TimeTcp,year,month,day,hour,minute,sec);
  640. DataLen=sizeof(DebugMsgInfo.DebugInfo) + BufferLen;
  641. DebugMsgInfo.startSymbol[0] = TCP_START_SYM1;
  642. DebugMsgInfo.startSymbol[1] = TCP_START_SYM2;
  643. DebugMsgInfo.cmdSymbol = TCP_CMD_SYM;
  644. DebugMsgInfo.ansSymbol = TCP_ANS_SYM;
  645. memcpy(DebugMsgInfo.SN, AppNVMData.battSN,BATT_SN_LEN);
  646. DebugMsgInfo.encryptMethod = TCP_ENCPT_DISABLE; //not encrypt
  647. DebugMsgInfo.dataLength[0] = (DataLen>>8) & 0xFF;
  648. DebugMsgInfo.dataLength[1] = DataLen & 0xFF;
  649. DebugMsgInfo.DebugInfo.sendTimeUTC[0] = (UTC8TimeTcp.year - 0x07D0) & 0xFF; //year
  650. DebugMsgInfo.DebugInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; //month
  651. DebugMsgInfo.DebugInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; //day
  652. DebugMsgInfo.DebugInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; //hour
  653. DebugMsgInfo.DebugInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; //mins
  654. DebugMsgInfo.DebugInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; //sec
  655. DebugMsgInfo.DebugInfo.msgMark = DEBUGMSG;
  656. DebugMsgInfo.DebugInfo.DebugLen[0] = BufferLen>>8;
  657. DebugMsgInfo.DebugInfo.DebugLen[1] = BufferLen;
  658. memcpy(SendBuffer,(UINT8 *)&DebugMsgInfo,sizeof(DebugMsgInfo)-1);
  659. DebugMsgInfo.CRC = bcc_chk(SendBuffer, BufferLen+sizeof(DebugMsgInfo)-1);
  660. memcpy(SendBuffer+BufferLen+sizeof(DebugMsgInfo)-1,&DebugMsgInfo.CRC,1);
  661. len = tcpipConnectionSend(socContext.id, SendBuffer, BufferLen+sizeof(DebugMsgInfo), 0, 0, 0);
  662. #ifdef USING_PRINTF1
  663. printf("DebugMsgInfo!\n");
  664. UINT8* p = SendBuffer;
  665. for(i =0 ;i<BufferLen+sizeof(DebugMsgInfo);i++)
  666. printf("%x",*(p+i));
  667. #endif
  668. Debug_Del_Logfile();
  669. free(SendBuffer);
  670. }
  671. if(send_counter>0xffff)
  672. {
  673. send_counter = 0;
  674. }
  675. else
  676. {
  677. send_counter++;
  678. }
  679. }
  680. //Tcp数据接收处理函数
  681. static void TcpDataInfoRecvHandle()
  682. {
  683. TcpipConnectionRecvDataInd *TcpRecvData=NULL;
  684. osMessageQueueGet(TcpRecvHandle,&TcpRecvData,0,0);
  685. osDelay(100);
  686. Uart_Write_Data_Type UartWriteCmd;
  687. OsaUtcTimeTValue TimeStracture;
  688. UINT8 DataLen;
  689. UINT8 Tcp_Cmd;
  690. UINT8 Control_Cmd;
  691. UINT8 *Ptr;
  692. UINT8 TcpCmdAnswer[31];
  693. TcpCmdAnswer[0] = TCP_START_SYM1;
  694. TcpCmdAnswer[1] = TCP_START_SYM1;
  695. if(TcpRecvData!=NULL&&TcpRecvData->length!=0)
  696. {
  697. Ptr = TcpRecvData->data;
  698. if((*(Ptr+0)==TCP_START_SYM1)&&(*(Ptr+1)==TCP_START_SYM2))//服务器起始信息
  699. {
  700. Tcp_Cmd = *(Ptr+2);//命令标志
  701. if(*(Ptr+3)==0xFE)
  702. {
  703. TcpService=0x01;
  704. }
  705. switch (Tcp_Cmd)
  706. {
  707. case TCP_QUERY_SYM:
  708. break;
  709. case TCP_SETCMD_SYM:
  710. break;
  711. case TCP_CONCMD_SYM:
  712. {
  713. TcpCmdAnswer[2] = TCP_CONCMD_SYM;
  714. if(*(Ptr+30)==0x01)//远程升级命令
  715. {
  716. Fota_Func(Ptr,socContext.id);
  717. }
  718. else if(*(Ptr+30)==0x88)//BMS远程升级数据传输命令
  719. {
  720. Fota_Func(Ptr,socContext.id);
  721. }
  722. else if(*(Ptr+30)==0x80)//远程锁定命令
  723. {
  724. TcpCmdAnswer[3] = 0x01;
  725. memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
  726. TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
  727. TcpCmdAnswer[22] = 0x00;
  728. TcpCmdAnswer[23] = 0x06;
  729. memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
  730. TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
  731. if(*(Ptr+31)==0x01)//0x01代表锁定
  732. {
  733. AppNVMData.appDataModify = TRUE;
  734. AppNVMData.isBattLocked = TRUE;
  735. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  736. }
  737. else if(*(Ptr+31)==0x02) //0x02代表解锁
  738. {
  739. AppNVMData.appDataModify = TRUE;
  740. AppNVMData.isBattLocked = FALSE;
  741. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  742. }
  743. TcpService=0x00;
  744. }
  745. else if(*(Ptr+30)==0x8A)//继电器控制
  746. {
  747. TcpCmdAnswer[3] = 0x01;
  748. memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
  749. TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
  750. TcpCmdAnswer[22] = 0x00;
  751. TcpCmdAnswer[23] = 0x06;
  752. memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
  753. TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
  754. if(*(Ptr+31)==0x01)//0x01代表断开
  755. {
  756. AppDataInfo.appDataModify = TRUE;
  757. AppDataInfo.RelayControl = TRUE;
  758. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  759. }
  760. else if(*(Ptr+31)==0x00) //0x00代表关闭
  761. {
  762. AppDataInfo.appDataModify = TRUE;
  763. AppDataInfo.RelayControl = FALSE;
  764. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  765. }
  766. TcpService=0x00;
  767. }
  768. else if(*(Ptr+30)==0x89)//蜂鸣器控制
  769. {
  770. TcpCmdAnswer[3] = 0x01;
  771. memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
  772. TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
  773. TcpCmdAnswer[22] = 0x00;
  774. TcpCmdAnswer[23] = 0x06;
  775. memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
  776. TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
  777. if(*(Ptr+31)==0x01)//0x01代表断开
  778. {
  779. BuzzerControl = TRUE;
  780. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  781. }
  782. else if(*(Ptr+31)==0x00) //0x00代表关闭
  783. {
  784. BuzzerControl = FALSE;
  785. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  786. }
  787. TcpService=0x00;
  788. }
  789. else
  790. {
  791. TcpCmdAnswer[3] = 0x0f;
  792. memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
  793. TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
  794. TcpCmdAnswer[22] = 0x00;
  795. TcpCmdAnswer[23] = 0x06;
  796. memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
  797. TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
  798. tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
  799. }
  800. break;
  801. }
  802. default:
  803. {
  804. break;
  805. }
  806. }
  807. }
  808. }
  809. if(TcpRecvData!=NULL)
  810. {
  811. free(TcpRecvData);
  812. }
  813. TcpRecvData = NULL;
  814. }
  815. //TCP发送校验函数
  816. UINT8 bcc_chk(UINT8* data, UINT8 length)
  817. {
  818. UINT8 bcc_chk_return = 0x00;
  819. UINT8 count = 0;
  820. while (count<length)
  821. {
  822. bcc_chk_return^=data[count];
  823. count++;
  824. }
  825. return bcc_chk_return;
  826. }
  827. //Tcp 状态转换函数
  828. static void sendQueueMsg(UINT32 msgId, UINT32 xTickstoWait)
  829. {
  830. eventCallbackMessage_t *queueMsg = NULL;
  831. queueMsg = malloc(sizeof(eventCallbackMessage_t));
  832. queueMsg->messageId = msgId;
  833. if (psEventQueueHandle)
  834. {
  835. if (pdTRUE != xQueueSend(psEventQueueHandle, &queueMsg, xTickstoWait))
  836. {
  837. ECOMM_TRACE(UNILOG_PLA_APP, sendQueueMsg_1, P_ERROR, 0, "xQueueSend error");
  838. }
  839. }
  840. }
  841. //Tcp状态注册函数
  842. static INT32 socketRegisterPSUrcCallback(urcID_t eventID, void *param, UINT32 paramLen)
  843. {
  844. CmiSimImsiStr *imsi = NULL;
  845. CmiPsCeregInd *cereg = NULL;
  846. UINT8 rssi = 0, index = 0;
  847. NmAtiNetifInfo *netif = NULL;
  848. switch(eventID)
  849. {
  850. case NB_URC_ID_SIM_READY:
  851. {
  852. imsi = (CmiSimImsiStr *)param;
  853. memcpy(gImsi, imsi->contents, imsi->length);
  854. #ifdef USING_PRINTF
  855. printf("SIM ready(imsi=%s)\n",(UINT8 *)imsi->contents);
  856. #endif
  857. break;
  858. }
  859. case NB_URC_ID_MM_SIGQ:
  860. {
  861. rssi = *(UINT8 *)param;
  862. #ifdef USING_PRINTF
  863. printf("RSSI signal=%d\n",rssi);
  864. #endif
  865. break;
  866. }
  867. case NB_URC_ID_PS_BEARER_ACTED:
  868. {
  869. #ifdef USING_PRINTF
  870. printf("Default bearer activated\n");
  871. #endif
  872. break;
  873. }
  874. case NB_URC_ID_PS_BEARER_DEACTED:
  875. {
  876. #ifdef USING_PRINTF
  877. printf("Default bearer Deactivated\n");
  878. #endif
  879. break;
  880. }
  881. case NB_URC_ID_PS_CEREG_CHANGED:
  882. {
  883. cereg = (CmiPsCeregInd *)param;
  884. gCellID = cereg->celId;
  885. #ifdef USING_PRINTF
  886. printf("URCCallBack:CEREG changed act:%d celId:%d locPresent:%d tac:%d\n", cereg->act, cereg->celId, cereg->locPresent, cereg->tac);
  887. #endif
  888. break;
  889. }
  890. case NB_URC_ID_PS_NETINFO:
  891. {
  892. netif = (NmAtiNetifInfo *)param;
  893. if (netif->netStatus == NM_NETIF_ACTIVATED)
  894. sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
  895. break;
  896. }
  897. }
  898. return 0;
  899. }
  900. //Tcpz连接状态回调函数
  901. static void socketAppConnectionCallBack(UINT8 connectionEventType, void *bodyEvent)
  902. {
  903. switch(connectionEventType)
  904. {
  905. case TCPIP_CONNECTION_STATUS_EVENT:
  906. {
  907. TcpipConnectionStatusInd *statusInd;
  908. statusInd = (TcpipConnectionStatusInd *)bodyEvent;
  909. if(statusInd != PNULL)
  910. {
  911. if(statusInd->status == TCPIP_CONNECTION_STATUS_CLOSED)
  912. {
  913. #ifdef USING_PRINTF
  914. printf("socketAppConnectionCallBack socket connection %u closed,cause %u", statusInd->connectionId, statusInd->cause);
  915. #endif
  916. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_1, P_ERROR, 2, "socketAppConnectionCallBack socket connection %u closed,cause %u", statusInd->connectionId, statusInd->cause);
  917. if(statusInd->connectionId == socContext.id)
  918. {
  919. socContext.id = -1;
  920. socContext.status = APP_SOCKET_CONNECTION_CLOSED;
  921. }
  922. }
  923. else if(statusInd->status == TCPIP_CONNECTION_STATUS_CONNECTING)
  924. {
  925. #ifdef USING_PRINTF
  926. printf("socketAppConnectionCallBack socket connection %u is connecting", statusInd->connectionId);
  927. #endif
  928. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_2, P_INFO, 1, "socketAppConnectionCallBack socket connection %u is connecting", statusInd->connectionId);
  929. if(statusInd->connectionId == socContext.id)
  930. {
  931. socContext.status = APP_SOCKET_CONNECTION_CONNECTING;
  932. }
  933. }
  934. else if(statusInd->status == TCPIP_CONNECTION_STATUS_CONNECTED)
  935. {
  936. #ifdef USING_PRINTF
  937. printf("socketAppConnectionCallBack socket connection %u is connected", statusInd->connectionId);
  938. #endif
  939. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_3, P_ERROR, 1, "socketAppConnectionCallBack socket connection %u is connected", statusInd->connectionId);
  940. if(statusInd->connectionId == socContext.id)
  941. {
  942. socContext.status = APP_SOCKET_CONNECTION_CONNECTED;
  943. }
  944. }
  945. }
  946. else
  947. {
  948. #ifdef USING_PRINTF
  949. printf("socketAppConnectionCallBack invalid connection status event");
  950. #endif
  951. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_4, P_ERROR, 0, "socketAppConnectionCallBack invalid connection status event");
  952. }
  953. break;
  954. }
  955. case TCPIP_CONNECTION_RECEIVE_EVENT:
  956. {
  957. TcpipConnectionRecvDataInd *rcvInd;
  958. TcpipConnectionRecvDataInd *rcvbuffer = NULL;
  959. rcvInd = (TcpipConnectionRecvDataInd *)bodyEvent;
  960. if(rcvInd != NULL)
  961. {
  962. rcvbuffer = malloc(sizeof(TcpipConnectionRecvDataInd));
  963. memcpy(rcvbuffer,rcvInd,sizeof(TcpipConnectionRecvDataInd));
  964. osMessageQueuePut(TcpRecvHandle,&rcvbuffer,0,1000);
  965. sendQueueMsg(QMSG_ID_SOCK_RECVPKG, 0);
  966. #ifdef USING_PRINTF
  967. uint8_t* DataPtr;
  968. DataPtr=rcvInd->data;
  969. if(rcvInd->length>=43)
  970. {
  971. printf("receive=%u_%x\n",rcvInd->length,*(DataPtr+37)<<24|*(DataPtr+38)<<16|*(DataPtr+39)<<8|*(DataPtr+40));
  972. }
  973. #endif
  974. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_5, P_INFO, 2, "socketAppConnectionCallBack socket connection %u receive length %u data", rcvInd->connectionId, rcvInd->length);
  975. }
  976. else
  977. {
  978. #ifdef USING_PRINTF
  979. printf( "socketAppConnectionCallBack invalid connection rcv event");
  980. #endif
  981. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_6, P_ERROR, 0, "socketAppConnectionCallBack invalid connection rcv event");
  982. }
  983. break;
  984. }
  985. case TCPIP_CONNECTION_UL_STATUS_EVENT:
  986. {
  987. TcpipConnectionUlDataStatusInd *ulStatusInd;
  988. ulStatusInd = (TcpipConnectionUlDataStatusInd *)bodyEvent;
  989. if(ulStatusInd != PNULL)
  990. {
  991. if(ulStatusInd->status == Tcpip_Connection_UL_DATA_SUCCESS)
  992. {
  993. #ifdef USING_PRINTF
  994. printf( "socketAppConnectionCallBack socket connection %u sequence %u data has sent success", ulStatusInd->connectionId, ulStatusInd->sequence);
  995. #endif
  996. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_7, P_INFO, 2, "socketAppConnectionCallBack socket connection %u sequence %u data has sent success", ulStatusInd->connectionId, ulStatusInd->sequence);
  997. }
  998. else if(ulStatusInd->status == Tcpip_Connection_UL_DATA_FAIL)
  999. {
  1000. #ifdef USING_PRINTF
  1001. printf("socketAppConnectionCallBack socket connection %u sequence %u data has sent fail", ulStatusInd->connectionId, ulStatusInd->sequence);
  1002. #endif
  1003. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_8, P_WARNING, 2, "socketAppConnectionCallBack socket connection %u sequence %u data has sent fail", ulStatusInd->connectionId, ulStatusInd->sequence);
  1004. }
  1005. }
  1006. else
  1007. {
  1008. #ifdef USING_PRINTF
  1009. printf("socketAppConnectionCallBack invalid connection ul status event");
  1010. #endif
  1011. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_9, P_ERROR, 0, "socketAppConnectionCallBack invalid connection ul status event");
  1012. }
  1013. break;
  1014. }
  1015. default:
  1016. #ifdef USING_PRINTF
  1017. printf("socketAppConnectionCallBack invalid event type %u", connectionEventType);
  1018. #endif
  1019. ECOMM_TRACE(UNILOG_PLA_APP, socketAppConnectionCallBack_10, P_ERROR, 1, "socketAppConnectionCallBack invalid event type %u", connectionEventType);
  1020. break;
  1021. }
  1022. }