socket_demo.c 96 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242
  1. /*================================================================
  2. Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
  3. Quectel Wireless Solution Proprietary and Confidential.
  4. =================================================================*/
  5. /*=================================================================
  6. EDIT HISTORY FOR MODULE
  7. This section contains comments describing changes made to the module.
  8. Notice that changes are listed in reverse chronological order.
  9. WHEN WHO WHAT, WHERE, WHY
  10. ------------ ------- -------------------------------------------------------------------------------
  11. =================================================================*/
  12. #include <stdint.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include "ql_api_osi.h"
  17. #include "ql_api_nw.h"
  18. #include "ql_log.h"
  19. #include "ql_api_datacall.h"
  20. #include "sockets.h"
  21. #include "lwip/ip_addr.h"
  22. #include "lwip/ip6_addr.h"
  23. #include "lwip/netdb.h"
  24. #include "lwip/netif.h"
  25. #include "lwip/inet.h"
  26. #include "lwip/tcp.h"
  27. #include "ql_ssl.h"
  28. #include "ip4_addr.h"
  29. #include "inet.h"
  30. #define QL_SOCKET_LOG_LEVEL QL_LOG_LEVEL_INFO
  31. #define QL_SOCKET_LOG(msg, ...) QL_LOG(QL_SOCKET_LOG_LEVEL, "ql_Sock", msg, ##__VA_ARGS__)
  32. #define QL_SOCKET_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_SSL", msg, ##__VA_ARGS__)
  33. #define QL_SOCKET_DEMO_CHANGE_DEMO 0
  34. #if QL_SOCKET_DEMO_CHANGE_DEMO
  35. #define QL_SOCKET_DEMO_URL "www.baidu.com"
  36. #else
  37. #define QL_SOCKET_DEMO_URL "nas.fast-fun.cn"//"220.180.239.212"
  38. #endif
  39. /*
  40. #define SERVER_PORT 8085
  41. #define SERVER_IP "47.107.99.203"
  42. #define SERVER_URL "nas.fast-fun.cn"//"220.180.239.212"
  43. */
  44. u32_t my_ipaddr_addr(const char *cp)
  45. {
  46. ip4_addr_t val;
  47. if (ip4addr_aton(cp, &val)) {
  48. return ip4_addr_get_u32(&val);
  49. }
  50. return (IPADDR_NONE);
  51. }
  52. static ql_task_t socket_demo_task = NULL;
  53. static char send_buf[128]={0};
  54. static int send_len = 0;
  55. static char recv_buf[128]={0};
  56. static int recv_len = 0;
  57. //获取socket接收缓存的剩余大小
  58. int ql_socket_get_free_size(int s,void *value)
  59. {
  60. int ret = ERR_OK;
  61. if (s < 0||value==NULL)
  62. {
  63. return -1;
  64. }
  65. *((int32_t *)value) =lwip_getRecvBufSize(s)-lwip_getRecvAvailSize(s);
  66. QL_SOCKET_LOG("socket free size:%d", *((int32_t *)value));
  67. if(*((int32_t *)value)<0)
  68. {
  69. ret = ERR_VAL;
  70. }
  71. return ret;
  72. }
  73. //获取socket发送缓存中已发送但未收到回应的数据大小
  74. int ql_socket_get_unacked_size(int s,void *value)
  75. {
  76. int ret = ERR_OK;
  77. if (s < 0||value==NULL)
  78. {
  79. return -1;
  80. }
  81. *((int32_t *)value) =lwip_getSentSize(s)-lwip_getAckedSize(s);
  82. QL_SOCKET_LOG("socket unacked size:%d", *((int32_t *)value));
  83. if(*((int32_t *)value)<0)
  84. {
  85. ret = ERR_VAL;
  86. }
  87. return ret;
  88. }
  89. #if 1
  90. static void socket_app_thread(void * arg)
  91. {
  92. int ret = 0;
  93. int i = 0;
  94. int profile_idx = 1;
  95. ql_data_call_info_s info;
  96. char ip4_addr_str[16] = {0};
  97. fd_set read_fds;
  98. fd_set write_fds;
  99. fd_set exp_fds;
  100. int socket_fd = -1;
  101. int flags = 0;
  102. int fd_changed = 0;
  103. int connected = 0;
  104. int closing = false;
  105. struct sockaddr_in local4, server_ipv4;
  106. struct addrinfo *pres = NULL;
  107. struct addrinfo *temp = NULL;
  108. uint8_t nSim = 0;
  109. ql_nw_data_count_info_s data_count_info = {0};
  110. #if QL_SOCKET_DEMO_CHANGE_DEMO
  111. ql_datacall_dns_info_s dns_pri = {0};
  112. ql_datacall_dns_info_s dns_sec = {0};
  113. #endif
  114. ql_rtos_task_sleep_s(10);
  115. QL_SOCKET_LOG("========== socket demo start ==========");
  116. QL_SOCKET_LOG("wait for network register done");
  117. while((ret = ql_network_register_wait(nSim, 120)) != 0 && i < 10){
  118. i++;
  119. ql_rtos_task_sleep_s(1);
  120. }
  121. if(ret == 0){
  122. i = 0;
  123. QL_SOCKET_LOG("====network registered!!!!====");
  124. }else{
  125. QL_SOCKET_LOG("====network register failure!!!!!====");
  126. goto exit;
  127. }
  128. ql_set_data_call_asyn_mode(nSim, profile_idx, 0);
  129. QL_SOCKET_LOG("===start data call====");
  130. ret=ql_start_data_call(nSim, profile_idx, QL_PDP_TYPE_IP, "cmnet", NULL, NULL, 0);
  131. QL_SOCKET_LOG("===data call result:%d", ret);
  132. if(ret != 0){
  133. QL_SOCKET_LOG("====data call failure!!!!=====");
  134. }
  135. memset(&info, 0x00, sizeof(ql_data_call_info_s));
  136. ret = ql_get_data_call_info(nSim, profile_idx, &info);
  137. if(ret != 0){
  138. QL_SOCKET_LOG("ql_get_data_call_info ret: %d", ret);
  139. ql_stop_data_call(nSim, profile_idx);
  140. goto exit;
  141. }
  142. QL_SOCKET_LOG("info->profile_idx: %d", info.profile_idx);
  143. QL_SOCKET_LOG("info->ip_version: %d", info.ip_version);
  144. QL_SOCKET_LOG("info->v4.state: %d", info.v4.state);
  145. inet_ntop(AF_INET, &info.v4.addr.ip, ip4_addr_str, sizeof(ip4_addr_str));
  146. QL_SOCKET_LOG("info.v4.addr.ip: %s\r\n", ip4_addr_str);
  147. inet_ntop(AF_INET, &info.v4.addr.pri_dns, ip4_addr_str, sizeof(ip4_addr_str));
  148. QL_SOCKET_LOG("info.v4.addr.pri_dns: %s\r\n", ip4_addr_str);
  149. inet_ntop(AF_INET, &info.v4.addr.sec_dns, ip4_addr_str, sizeof(ip4_addr_str));
  150. QL_SOCKET_LOG("info.v4.addr.sec_dns: %s\r\n", ip4_addr_str);
  151. #if QL_SOCKET_DEMO_CHANGE_DEMO
  152. ql_datacall_get_dns_addr(nSim, profile_idx, &dns_pri, &dns_sec);
  153. QL_SOCKET_LOG("get_dns_pri:[%d][%s]", dns_pri.type, ip4addr_ntoa(&dns_pri.ip4));
  154. QL_SOCKET_LOG("get_dns_sec:[%d][%s]", dns_sec.type, ip4addr_ntoa(&dns_sec.ip4));
  155. memset(&dns_pri, 0x00, sizeof(ql_datacall_dns_info_s));
  156. dns_pri.type = QL_PDP_TYPE_IP;
  157. dns_sec.type = QL_PDP_TYPE_IP;
  158. ip4addr_aton("114.114.114.114", &(dns_pri.ip4));
  159. ip4addr_aton("8.8.8.8", &(dns_sec.ip4));
  160. ql_datacall_set_dns_addr(nSim, profile_idx, &dns_pri, &dns_sec);
  161. memset(&dns_pri, 0x00, sizeof(ql_datacall_dns_info_s));
  162. ql_datacall_get_dns_addr(nSim, profile_idx, &dns_pri, &dns_sec);
  163. QL_SOCKET_LOG("get_dns_pri:[%d][%s]", dns_pri.type, ip4addr_ntoa(&dns_pri.ip4));
  164. QL_SOCKET_LOG("get_dns_sec:[%d][%s]", dns_sec.type, ip4addr_ntoa(&dns_sec.ip4));
  165. #endif
  166. memset(&local4, 0x00, sizeof(struct sockaddr_in));
  167. local4.sin_family = AF_INET;
  168. local4.sin_port = 0;
  169. inet_aton(ip4addr_ntoa(&info.v4.addr.ip), &local4.sin_addr);
  170. loop:
  171. ret = getaddrinfo_with_pcid(QL_SOCKET_DEMO_URL, NULL, NULL, &pres, (uint32)profile_idx);
  172. if (ret < 0 || pres == NULL)
  173. {
  174. QL_SOCKET_LOG("DNS getaddrinfo failed! ret=%d; pres=%p!\n",ret,pres);
  175. goto exit;
  176. }
  177. FD_ZERO(&read_fds);
  178. FD_ZERO(&write_fds);
  179. FD_ZERO(&exp_fds);
  180. flags = 0;
  181. connected = 0;
  182. closing = false;
  183. i = 0;
  184. for(temp = pres; temp != NULL; temp = temp->ai_next){
  185. //struct sockaddr_in * sin_res = (struct sockaddr_in *)temp->ai_addr;
  186. if(temp->ai_family == AF_INET){
  187. socket_fd = socket(temp->ai_family, SOCK_STREAM, 0);
  188. if(socket_fd < 0){
  189. continue;
  190. }
  191. ret = bind(socket_fd,(struct sockaddr *)&local4,sizeof(struct sockaddr));
  192. if(ret < 0){
  193. close(socket_fd);
  194. socket_fd = -1;
  195. continue;
  196. }
  197. flags |= O_NONBLOCK;
  198. fcntl(socket_fd, F_SETFL,flags);
  199. memset(&server_ipv4, 0x00, sizeof(struct sockaddr_in));
  200. server_ipv4.sin_family = AF_INET;
  201. server_ipv4.sin_port = htons(7780);
  202. server_ipv4.sin_addr.s_addr = my_ipaddr_addr("47.107.99.203");
  203. ret = connect(socket_fd, (struct sockaddr *)&server_ipv4, sizeof(struct sockaddr_in));
  204. if(ret == 0){
  205. connected = 1;
  206. break;
  207. }else{
  208. if(lwip_get_error(socket_fd) != EINPROGRESS){
  209. close(socket_fd);
  210. socket_fd = -1;
  211. continue;
  212. }else{
  213. break;
  214. }
  215. }
  216. }
  217. }
  218. if(socket_fd < 0){
  219. goto exit;
  220. }
  221. if(connected == 1){
  222. FD_SET(socket_fd, &read_fds);
  223. QL_SOCKET_LOG("=====connect to my_server success=====");
  224. memset(send_buf, 0x00, 128);
  225. send_len = snprintf(send_buf, 128,"%d%s%d\r\n",i,"startAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAend",i);
  226. if(write(socket_fd, send_buf, send_len) != send_len){
  227. FD_SET(socket_fd, &write_fds);
  228. }else{
  229. i++;
  230. }
  231. }else{
  232. FD_SET(socket_fd, &write_fds);
  233. }
  234. FD_SET(socket_fd, &exp_fds);
  235. while(1){
  236. fd_changed = select(socket_fd+1, &read_fds, &write_fds, &exp_fds, NULL);
  237. if(fd_changed > 0){
  238. if(FD_ISSET(socket_fd, &write_fds)){
  239. FD_CLR(socket_fd, &write_fds);
  240. if(connected== 0){
  241. int value = 0;
  242. int len = 0;
  243. len = sizeof(value);
  244. getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &value, &len);
  245. QL_SOCKET_LOG("errno: %d", value);
  246. if(value == 0 || value == EISCONN ){
  247. QL_SOCKET_LOG("=====connect to \"220.180.239.212:8252\" success=====");
  248. connected = 1;
  249. FD_SET(socket_fd, &read_fds);
  250. memset(send_buf, 0x00, 128);
  251. send_len = snprintf(send_buf, 128,"%d%s%d\r\n",i,"startAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAend",i);
  252. write(socket_fd, send_buf, send_len);
  253. i++;
  254. }else{
  255. QL_SOCKET_LOG("=====connect to \"220.180.239.212:8252\" failed=====");
  256. close(socket_fd);
  257. socket_fd = -1;
  258. break;
  259. }
  260. }else{
  261. memset(send_buf, 0x00, 128);
  262. send_len = snprintf(send_buf, 128,"%d%s%d\r\n",i,"startAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAend",i);
  263. write(socket_fd, send_buf, send_len);
  264. i++;
  265. }
  266. }else if(FD_ISSET(socket_fd, &read_fds)){
  267. FD_CLR(socket_fd, &read_fds);
  268. memset(recv_buf,0x00, 128);
  269. recv_len = read(socket_fd, recv_buf, 128);
  270. if(recv_len > 0){
  271. for(int i = 0;i < recv_len;i++)
  272. QL_SOCKET_LOG(">>>>Recv: %x \n", recv_buf[i]);
  273. QL_SOCKET_LOG("chengwei recv ok\n");
  274. memset(send_buf, 0x00, 128);
  275. send_len = snprintf(send_buf, 128,"%d%s%d\r\n",i,"startAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAend",i);
  276. write(socket_fd, send_buf, send_len);
  277. i++;
  278. FD_SET(socket_fd, &read_fds);
  279. if(ql_nw_get_data_count(nSim, &data_count_info) == 0)
  280. {
  281. QL_SOCKET_LOG("data count: uplink %llu, downlink %llu", data_count_info.uplink_data_count, data_count_info.downlink_data_count);
  282. }
  283. }else if(recv_len == 0){
  284. if(closing == false){
  285. QL_SOCKET_LOG("===passive close!!!!");
  286. shutdown(socket_fd, SHUT_WR);
  287. closing = true;
  288. FD_SET(socket_fd, &read_fds);
  289. }else{
  290. close(socket_fd);
  291. socket_fd = -1;
  292. break;
  293. }
  294. }else{
  295. if(lwip_get_error(socket_fd) == EAGAIN){
  296. FD_SET(socket_fd, &read_fds);
  297. }else{
  298. close(socket_fd);
  299. socket_fd = -1;
  300. break;
  301. }
  302. }
  303. }else if(FD_ISSET(socket_fd, &exp_fds)){
  304. FD_CLR(socket_fd, &exp_fds);
  305. close(socket_fd);
  306. socket_fd = -1;
  307. break;
  308. }
  309. }
  310. }
  311. if(pres!=NULL)
  312. {
  313. freeaddrinfo(pres);
  314. pres = NULL;
  315. }
  316. goto loop;
  317. exit:
  318. ql_rtos_task_delete(socket_demo_task);
  319. return;
  320. }
  321. #endif
  322. int ql_socket_app_init(void)
  323. {
  324. QlOSStatus err = QL_OSI_SUCCESS;
  325. err = ql_rtos_task_create(&socket_demo_task, 16*1024, APP_PRIORITY_ABOVE_NORMAL, "QsocketApp", socket_app_thread, NULL, 5);
  326. if(err != QL_OSI_SUCCESS)
  327. {
  328. QL_SOCKET_LOG("socket_app init failed");
  329. }
  330. return err;
  331. }
  332. #if 0
  333. /*********************************************************************************************/
  334. /*********************************************************************************************/
  335. /*********************************************************************************************/
  336. #define sint32 s32_t
  337. #define sint16 s16_t
  338. #define sint8 s8_t
  339. #define uint32 u32_t
  340. #define uint16 u16_t
  341. #define uint8 u8_t
  342. typedef unsigned char UINT8;
  343. typedef unsigned short UINT16;
  344. //typedef unsigned long UINT32;
  345. typedef unsigned char BOOL;
  346. typedef signed char INT8;
  347. typedef signed short INT16;
  348. typedef signed long INT32;
  349. #define CRLF "\r\n"
  350. #define BATT_SN_LEN 17
  351. #define BMS_SN_LEN 12
  352. #define TCP_START_SYM1 0x23
  353. #define TCP_START_SYM2 0x23
  354. #define TCP_CMD_SYM 0x02 // 瀹炴椂淇℃伅涓婃姤鏄�0x02
  355. #define TCP_HEART_SYM 0x07 // 蹇冭烦鍖呮爣蹇�
  356. #define TCP_TIMING 0x08 //缁堢鏍℃椂
  357. #define TCP_QUERY_SYM 0x80 //鏌ヨ鎸囦护锛堜笅琛岋級
  358. #define TCP_SETCMD_SYM 0x81 //璁剧疆鍛戒护锛堜笅琛岋級
  359. #define TCP_CONCMD_SYM 0x82 //鎺у埗鍛戒护锛堜笅琛岋級
  360. #define TCP_UDSCMD_SYM 0x83 //杩滅▼璇婃柇鍛戒护锛堜笅琛岋級
  361. //Answer symbol
  362. #define TCP_ANS_SYM 0xFE
  363. #define TCP_ENCPT_ENABLE 0x00
  364. #define TCP_ENCPT_DISABLE 0x01
  365. //瀹炴椂涓婃姤淇℃伅浣擄紙鍚岃ˉ鍙戜笂鎶ワ級
  366. #define TimeCali 0x01
  367. #define DebugMsg 0x8C
  368. #define VerMsg 0xA0
  369. #define GPSMsg 0xA2
  370. #define DeviceStateMsg 0xA4
  371. #define BattStaticMsg 0xB0
  372. #define BattDynamicMsg 0xB2
  373. #define TruckVehiMsg 0xB4
  374. #define EngyStoreSysMsg 0xB8
  375. #define BattAccuMsg 0xBA
  376. #define BattSceneMsg 0xBC
  377. #define BattHighFeqMsg 0xC0
  378. #define BattAlgthMsg 0xC2
  379. #define BATT_DYNAMIC_MSG_REVERS_BYTE 20
  380. #define BATT_CHRG_TEMP_NUM 4
  381. #define BATT_CONN_TEMP_NUM 4
  382. #define BATT_BSC_LOCK_NUM 4
  383. typedef struct _GPSInfo
  384. {
  385. uint8 locateMark;
  386. uint8 satelliteNum;
  387. uint8 direction[2];
  388. uint8 speed[2];
  389. uint8 altitude[2];
  390. uint8 latitude[4];
  391. uint8 longitude[4];
  392. uint8 AccMileage[4];
  393. } GPSInfo;
  394. typedef struct _DebugInfoType
  395. {
  396. UINT8 sendTimeUTC[6];
  397. UINT8 msgMark;
  398. UINT8 DebugLen[2];
  399. } DebugInfoType;
  400. typedef struct DebugMsgtoTcp_Type
  401. {
  402. UINT8 startSymbol[2];
  403. UINT8 cmdSymbol;
  404. UINT8 ansSymbol;
  405. UINT8 SN[BATT_SN_LEN];
  406. UINT8 encryptMethod;
  407. UINT8 dataLength[2];
  408. DebugInfoType DebugInfo;
  409. UINT8 _CRC;
  410. } DebugMsgtoTcpType;
  411. typedef struct _VerInfoType //0xA0
  412. {
  413. uint8 sendTimeUTC[6];
  414. uint8 msgMark;
  415. uint8 msgCollectionTimeUTC[6];
  416. uint8 tcpProtocolVer[2];
  417. uint8 deviceType;
  418. uint8 deviceGenerationInfo;
  419. uint8 ICCID[20];
  420. uint8 IMEI[15];
  421. uint8 deviceHwVersion[2];
  422. uint8 deviceKernelVersion[4];
  423. uint8 deviceDriverSWVersion[4];
  424. uint8 deviceAppSWVersion[4];
  425. uint8 BleMacAddr[6];
  426. uint8 deviceProduceDate[3];
  427. } VerInfoType;
  428. typedef struct VersionMsgtoTcpType
  429. {
  430. uint8 startSymbol[2];
  431. uint8 cmdSymbol;
  432. uint8 ansSymbol;
  433. uint8 SN[BATT_SN_LEN];
  434. uint8 encryptMethod;
  435. uint8 dataLength[2];
  436. VerInfoType VerInfo;
  437. uint8 CRC;
  438. } VersionMsgtoTcpType;
  439. typedef struct _GPSInfoType //0xA2
  440. {
  441. uint8 sendTimeUTC[6];
  442. uint8 msgMark;
  443. uint8 msgCollectionTimeUTC[6];
  444. GPSInfo GpsInfoData;
  445. uint8 Tac[2];
  446. uint8 CellID[4];
  447. } GPSInfoType;
  448. typedef struct _GPSMsgtoTcpType
  449. {
  450. uint8 startSymbol[2];
  451. uint8 cmdSymbol;
  452. uint8 ansSymbol;
  453. uint8 SN[BATT_SN_LEN];
  454. uint8 encryptMethod;
  455. uint8 dataLength[2];
  456. GPSInfoType gpsInfo;
  457. uint8 CRC;
  458. } GPSMsgtoTcpType;
  459. typedef struct _DeviceStateInfoType //0xA4
  460. {
  461. uint8 sendTimeUTC[6];
  462. uint8 msgMark;
  463. uint8 msgCollectionTimeUTC[6];
  464. uint8 deviceErrorCode;
  465. uint8 deviceTcpCSQValue;
  466. uint8 deviceLockBattState;
  467. uint8 deviceBeepState;
  468. uint8 deviceAuthState;
  469. uint8 deviceInstallElevation;
  470. uint8 deviceInstallRollAngle;
  471. uint8 deviceXAxisAccVal[2];
  472. uint8 deviceYAxisAccVal[2];
  473. uint8 deviceZAxisAccVal[2];
  474. uint8 deviceFFT_X_FreData[5];
  475. uint8 deviceFFT_X_AmpData[5];
  476. uint8 deviceFFT_Y_FreData[5];
  477. uint8 deviceFFT_Y_AmpData[5];
  478. uint8 deviceFFT_Z_FreData[5];
  479. uint8 deviceFFT_Z_AmpData[5];
  480. uint8 deviceUpsSOC;
  481. uint8 deviceUpsVolt[2];
  482. uint8 deviceUpsTemp;
  483. uint8 deviceTempNum;
  484. uint8 deviceTemp[10];
  485. } DeviceStateInfoType;
  486. typedef struct _DeviceStateMsgtoTcpType
  487. {
  488. uint8 startSymbol[2];
  489. uint8 cmdSymbol;
  490. uint8 ansSymbol;
  491. uint8 SN[BATT_SN_LEN];
  492. uint8 encryptMethod;
  493. uint8 dataLength[2];
  494. DeviceStateInfoType DeviceState;
  495. uint8 CRC;
  496. } DeviceStateMsgtoTcpType;
  497. /*************0xB0**********/
  498. typedef struct _BattStaticMsgType
  499. {
  500. uint8 sendTimeUTC[6];
  501. uint8 msgMark;
  502. uint8 msgCollectionTimeUTC[6];
  503. uint8 battCustomCode[2]; //string ascii
  504. uint8 battPackManuCode[2]; //string ascii
  505. uint8 battCellManuCode[2]; //string ascii
  506. uint8 battCellTypeCode; //N/L
  507. uint8 battCellVoltNum[2];
  508. uint8 battCellTempNum[2];
  509. uint8 battBMSSNLen;
  510. uint8 battBMSSN[BMS_SN_LEN];
  511. uint8 battRelatedCapacity[2]; //0.1Ah
  512. uint8 battRelatedEnergy[2]; //0.1kwh
  513. uint8 battRelatedVolt[2]; //0.1V
  514. uint8 battProduceDate[3];
  515. uint8 battRelatedCellVolt[2]; //1mv
  516. uint8 battRelatedMaxCellVolt[2]; //1mv
  517. uint8 battRelatedMinCellVolt[2]; //1mv
  518. uint8 battThermalManagType; //0-none,1-water heater and colder,2-water colder and ptc heater,3-ptc with air colder
  519. uint8 battConstMaxchrgCurr[2];//0.1A
  520. uint8 battConstMaxDischrgCurr[2]; //0.1A
  521. uint8 bmsHwVersion[4];
  522. uint8 bmsSwVersion[4];
  523. }BattStaticMsgType;
  524. typedef struct _BattStaticMsgToTcpType
  525. {
  526. uint8 startSymbol[2];
  527. uint8 cmdSymbol;
  528. uint8 ansSymbol;
  529. uint8 SN[BATT_SN_LEN];
  530. uint8 encryptMethod;
  531. uint8 dataLength[2];
  532. BattStaticMsgType battStaticInfo;
  533. uint8 CRC;
  534. } BattStaticMsgToTcpType;
  535. /*************0xB2**********/
  536. typedef struct _BattDynamicMsgType1
  537. {
  538. uint8 sendTimeUTC[6];
  539. uint8 msgMark;
  540. uint8 msgCollectionTimeUTC[6];
  541. uint8 battBmsErrLv;
  542. uint8 battBmsErrCode[2];
  543. uint8 battPackCurr[2]; //鐢垫睜鎬荤數娴� 0~40000,re:0.1A,off:-2000
  544. uint8 battLinkVolt[2]; //鐢垫睜鍖呭唴渚х數鍘� 0.1V
  545. uint8 battPackVolt[2]; //鐢垫睜鍖呭渚х數鍘� 0.1V
  546. uint8 battWorkState; //0-闈欑疆锛�1-鏀剧數锛�2-鎱㈠厖锛�3-蹇厖
  547. uint8 battRelayState[4];
  548. uint8 battHVState; //0-鍒濆鍖栵紝1-楂樺帇涓婄數锛�2-楂樺帇涓嬬數锛�3-鏃犳晥
  549. uint8 battChrgSt; //0-鏈厖鐢碉紝1-鍏呯數涓紝2-鍏呯數瀹屾垚锛�3-鍏呯數鏁呴殰
  550. uint8 battChrgGunSt; //0-鏈繛鎺ワ紝1-宸茶繛鎺�
  551. uint8 battChrgMode; //0-鎻掓灙鍏呯數锛�1-绔欏唴鍏呯數
  552. uint8 battBMSSOC; //0.4%
  553. uint8 battBMSSOH; //1%
  554. uint8 battBalanceSt; //0-鏈潎琛★紝1-宸插紑鍚潎琛�
  555. uint8 battInsR[2]; //1k惟
  556. uint8 battTMSSt; //0-鍏虫満锛�1-鍙惊鐜紝2-鍔犵儹锛�3-鍒跺喎锛屽叾浣欓鐣�
  557. uint8 battTMSErrCode; //璇﹁鏁呴殰浠g爜琛�
  558. uint8 battTMSReqPWR[2];//0.1kw
  559. uint8 battTMSOutletTemp; //鍑烘按鍙f俯搴︼紝1鈩冿紝-40鈩�
  560. uint8 battTMSInjectTemp; //杩涙按鍙f俯搴︼紝1鈩冿紝-40鈩�
  561. uint8 reverseVar[BATT_DYNAMIC_MSG_REVERS_BYTE]; //棰勭暀绌洪棿锛岄粯璁や负0
  562. }BattDynamicMsgType1;
  563. typedef struct _BattDynamicMsgType2
  564. {
  565. uint8 battMaxCellVolt[2]; //1mV
  566. uint8 battMaxCellVolOrderNum[2]; //搴忓彿
  567. uint8 battMinCellVolt[2]; //1mV
  568. uint8 battMinCellVoltOrderNum[2]; //搴忓彿
  569. uint8 battMaxCellTemp; //1mV
  570. uint8 battMaxCellTempOrderNum[2]; //搴忓彿
  571. uint8 battMinCellTemp; //1mV
  572. uint8 battMinCellTempOrderNum[2]; //搴忓彿
  573. uint8 battMaxRechrgCurr[2];//0.1A
  574. uint8 battMaxDischrgCurr[2]; //0.1A
  575. }BattDynamicMsgType2;
  576. typedef struct _BattDynamicMsgToTcpType
  577. {
  578. uint8 startSymbol[2];
  579. uint8 cmdSymbol;
  580. uint8 ansSymbol;
  581. uint8 SN[BATT_SN_LEN];
  582. uint8 encryptMethod;
  583. uint8 dataLength[2];
  584. //battDynamicMsg
  585. //uint8 CRC;
  586. } BattDynamicMsgToTcpType;
  587. /***********0xB4************/
  588. typedef struct _TruckVehiMsgType1
  589. {
  590. uint8 sendTimeUTC[6];
  591. uint8 msgMark;
  592. uint8 msgCollectionTimeUTC[6];
  593. uint8 VIN[17]; //ASCII
  594. uint8 vehiSpeed[2]; //0.1km/h
  595. uint8 vehiErrCode[2]; //鏁磋溅鏁呴殰浠g爜
  596. uint8 bscSystemErrCode; //鎹㈢數绯荤粺鏁呴殰浠g爜
  597. uint8 vehiSt; //鏁磋溅鐘舵�侊紝0-绛夊緟锛�1-ready
  598. uint8 bmsHvReq; //bms涓婇珮鍘嬭姹傦紙vcu to bms锛夛紝0-涓嬮珮鍘嬶紝1-涓婇珮鍘�
  599. uint8 vehiCurrGearSt; //0-绌烘尅锛� 1-12锛欴1-D12锛� 13-24锛歁1-M12锛� 25锛歊锛� 26锛歅
  600. uint8 vehiBreakSt; //鍒跺姩寮�鍏筹紝0-鍏抽棴锛屾湭鍒跺姩锛� 1-鎵撳紑锛屽埗鍔ㄤ腑
  601. uint8 vehilRelaySt[10]; //鏁村悎鐩稿叧缁х數鍣ㄧ姸鎬佽〃 棰勭暀
  602. uint8 bscSt; //鎹㈢數鎺у埗鍣ㄧ姸鎬� 0-琛岃溅鐘舵�� 1-閫氫俊鐘舵�� 2-鎹㈢數鐘舵��
  603. uint8 battBSCConTempNum;
  604. uint8 battBSCConTemp[BATT_CONN_TEMP_NUM]; //鎹㈢數杩炴帴鍣ㄦ俯搴� 1,-40
  605. //鎹㈢數閿佹満鏋勭姸鎬�
  606. uint8 battBSCLockNum;
  607. uint8 battBSCLockSt[BATT_BSC_LOCK_NUM]; //閿佹満鏋勭姸鎬侊紝0-閿佺揣锛�1-鏈攣绱ф湭瑙i攣锛�2-瑙i攣
  608. //鎹㈢數杩炴帴鍣�
  609. uint8 bscConnType; //1-鍗曡繛鎺ュ櫒锛� 4-鍥涜繛鎺ュ櫒
  610. uint8 bscConnSt; //0-瀹屽叏杩炴帴锛� 1-鏈畬鍏ㄨ繛鎺ワ紝 2-瀹屽叏鑴辩锛堟湭杩炴帴锛�
  611. uint8 bscChangeCount[2]; //杞﹁締鎹㈢數娆℃暟
  612. }TruckVehiMsgType1;
  613. typedef struct _TruckVehiMsgToTcpType
  614. {
  615. uint8 startSymbol[2];
  616. uint8 cmdSymbol;
  617. uint8 ansSymbol;
  618. uint8 SN[BATT_SN_LEN];
  619. uint8 encryptMethod;
  620. uint8 dataLength[2];
  621. TruckVehiMsgType1 truckVehiInfo;
  622. uint8 CRC;
  623. } TruckVehiMsgToTcpType;
  624. /**************0xB8************/
  625. typedef struct _EngyStoreSysMsgType
  626. {
  627. uint8 sendTimeUTC[6];
  628. uint8 msgMark;
  629. uint8 msgCollectionTimeUTC[6];
  630. uint8 inverterSt; //閫嗗彉鍣ㄧ姸鎬侊紝 0-闂悎 1-鏂紑
  631. uint8 battRelaySt; //鐢垫睜缁х數鍣ㄧ姸鎬� 0-闂悎 1-鏂紑
  632. uint8 battTMSFanSt; //鐢垫睜鏁g儹椋庢墖鐘舵�� 0-闂悎 1-鏂紑
  633. uint8 battTMSHeaterRelaySt; //鐢垫睜鍔犵儹缁х數鍣ㄧ姸鎬� 0-闂悎 1-鏂紑
  634. }EngyStoreSysMsgType;
  635. typedef struct _EngyStoreSysMsgToTcpType
  636. {
  637. uint8 startSymbol[2];
  638. uint8 cmdSymbol;
  639. uint8 ansSymbol;
  640. uint8 SN[BATT_SN_LEN];
  641. uint8 encryptMethod;
  642. uint8 dataLength[2];
  643. EngyStoreSysMsgType energyStoreSysInfo;
  644. uint8 CRC;
  645. } EngyStoreSysMsgToTcpType;
  646. /**************0xBA************/
  647. typedef struct AccInfoType
  648. {
  649. uint8 sendTimeUTC[6];
  650. uint8 msgMark;
  651. uint8 msgCollectionTimeUTC[6];
  652. uint8 accOnlineDays[2];
  653. uint8 vehiODO[4];
  654. uint8 accBattCycTimes[2];
  655. uint8 accOverChrgTimes[2];
  656. uint8 accOverDischrgTimes[2];
  657. uint8 accChrgTimes[2];
  658. uint8 accDischrgTimes[2];
  659. uint8 bmsTotalChrgCapy[4]; //0.1Ah
  660. uint8 bmsTotalChrgEngy[4]; //0.1kwh
  661. uint8 bmsTotalDischrgCapy[4]; //0.1Ah
  662. uint8 bmsTotalDischrgEngy[4]; //0.1kwh
  663. uint8 bmsTotalStaCharCapy[4]; //0.1Ah
  664. uint8 bmsTotalStaCharEngy[4]; //0.1kwh
  665. uint8 bmsTotalBackCharCapy[4]; //0.1Ah
  666. uint8 bmsTotalBackCharEngy[4]; //0.1kwh
  667. uint8 bmsTotalGunCharCapy[4]; //0.1Ah
  668. uint8 bmsTotalGunCharEngy[4]; //0.1kwh
  669. } AccInfoType;
  670. typedef struct AccInfoToTcpType
  671. {
  672. uint8 startSymbol[2];
  673. uint8 cmdSymbol;
  674. uint8 ansSymbol;
  675. uint8 SN[BATT_SN_LEN];
  676. uint8 encryptMethod;
  677. uint8 dataLength[2];
  678. AccInfoType AccInfo;
  679. uint8 CRC;
  680. } AccInfoToTcpType;
  681. /*********** BattSceneMsg 0xBC**********/
  682. typedef struct _BattSceneInfoType
  683. {
  684. uint8 sendTimeUTC[6];
  685. uint8 msgMark;
  686. uint8 msgCollectionTimeUTC[6];
  687. uint8 sceneType; //0-鏃犱笟鍔★紝 1-鍑哄敭锛� 2-绉熻祦
  688. uint8 sceneSt; //0-鏈璧� 1-宸茬璧�
  689. uint8 sceneStartDate[6];
  690. uint8 sceneAvalibleTime[2]; //澶�
  691. uint8 sceneDeadTime[2]; //澶�
  692. } BattSceneInfoType;
  693. typedef struct _BattSceneMsgtoTcpType
  694. {
  695. uint8 startSymbol[2];
  696. uint8 cmdSymbol;
  697. uint8 ansSymbol;
  698. uint8 SN[BATT_SN_LEN];
  699. uint8 encryptMethod;
  700. uint8 dataLength[2];
  701. BattSceneInfoType battSceneInfo;
  702. uint8 CRC;
  703. } BattSceneMsgtoTcpType;
  704. /*********** BattHighFeqMsg 0xC0**********/
  705. typedef struct _BattHighFeqInfoType
  706. {
  707. uint8 sendTimeUTC[6];
  708. uint8 msgMark;
  709. uint8 msgCollectionTimeUTC[6];
  710. uint8 battPackVolt[2]; //0.1v
  711. uint8 battPackCurr[2]; //0-20000, -1000A~1000A,0.1A
  712. uint8 battMaxCellVolt[2]; //1mv
  713. uint8 battMinCellVolt[2]; //1mv
  714. uint8 battMaxCellTemp[2]; //1,-40
  715. uint8 battMinCellTemp[2]; //1,-40
  716. } BattHighFeqInfoType;
  717. typedef struct _BattHighFeqMsgtoTcpType
  718. {
  719. uint8 startSymbol[2];
  720. uint8 cmdSymbol;
  721. uint8 ansSymbol;
  722. uint8 SN[BATT_SN_LEN];
  723. uint8 encryptMethod;
  724. uint8 dataLength[2];
  725. BattHighFeqInfoType battHighFeqInfo;
  726. uint8 CRC;
  727. } BattHighFeqMsgtoTcpType;
  728. /*********** BattAlgthMsg 0xC2**********/
  729. typedef struct _BattAlgthInfoType
  730. {
  731. uint8 sendTimeUTC[6];
  732. uint8 msgMark;
  733. uint8 msgCollectionTimeUTC[6];
  734. uint8 bmsPackSOC; //0.4%
  735. uint8 bmsPackSOH; //1%
  736. uint8 bboxCalSOC; //0.4%
  737. uint8 bboxCalSOH; //1%
  738. uint8 bboxCalTotalDischrgCapy[4];
  739. uint8 bboxCalTotalBackchrgCapy[4];
  740. uint8 bboxCalTotalChrgCapy[4];
  741. uint8 bboxCalTotalDischrgEngy[4];
  742. uint8 bboxCalTotalBackchrgEngy[4];
  743. uint8 bboxCalTotalChrgEngy[4];
  744. uint8 BBox_Dq_Dv_MAX[4];
  745. uint8 BBox_Dq_Dv_MIN[4];
  746. } BattAlgthInfoType;
  747. typedef struct _BattAlgthMsgtoTcpType
  748. {
  749. uint8 startSymbol[2];
  750. uint8 cmdSymbol;
  751. uint8 ansSymbol;
  752. uint8 SN[BATT_SN_LEN];
  753. uint8 encryptMethod;
  754. uint8 dataLength[2];
  755. BattAlgthInfoType battAlgthInfo;
  756. uint8 CRC;
  757. } BattAlgthMsgtoTcpType;
  758. /********************0x83 TCP_UDSCMD_SYM 涓嬭鎺у埗鎸囦护*******************/
  759. typedef struct _UdsCmdInfoType //download infomation
  760. {
  761. uint8 udsCmdLen;
  762. uint8 udsSID;
  763. uint8 udsDID_H;
  764. uint8 udsDID_L;
  765. uint8 udsCmdData[10];
  766. }UdsCmdInfoType;
  767. typedef struct _UdsCmdPosAnsInfoType
  768. {
  769. uint8 udsAnsLen;
  770. uint8 udsAnsDID_POS;
  771. uint8 udsAnsDID_H;
  772. uint8 udsAnsDID_L;
  773. }UdsCmdPosAnsInfoType;
  774. typedef struct _UdsCmdNegAnsInfoType
  775. {
  776. uint8 udsAnsLen;
  777. uint8 udsAnsDID_Neg;
  778. uint8 udsAnsDID_H;
  779. uint8 udsAnsDID_L;
  780. uint8 udsAnsNegCode;
  781. }UdsCmdNegAnsInfoType;
  782. typedef struct _UdsCmdNegAnsMsgtoTcpType
  783. {
  784. uint8 startSymbol[2];
  785. uint8 cmdSymbol;
  786. uint8 ansSymbol;
  787. uint8 SN[BATT_SN_LEN];
  788. uint8 encryptMethod;
  789. uint8 dataLength[2];
  790. UdsCmdNegAnsInfoType udsCmdNegAnsInfo;
  791. uint8 CRC;
  792. } UdsCmdNegAnsMsgtoTcpType;
  793. typedef struct UTC8Time_Type
  794. {
  795. uint8 year;
  796. uint8 month;
  797. uint8 day;
  798. uint8 hour;
  799. uint8 minute;
  800. uint8 second;
  801. } UTC8TimeType;
  802. typedef struct
  803. {
  804. sint16 TimeCaliFeqCng[3]; //0x01
  805. sint16 DebugMsgFeqCnt[3]; //0x8C
  806. sint16 VerMsgFeqCnt[3]; //0xA0
  807. sint16 GPSMsgFeqCnt[3]; //0xA2
  808. sint16 DeviceStateMsgFeqCnt[3]; //0xA4
  809. sint16 BattStaticMsgFeqCnt[3]; //0xB0
  810. sint16 BattDynamicMsgFeqCnt[3]; //0xB2
  811. sint16 TruckVehiMsgFeqCnt[3]; //0xB4
  812. sint16 EngyStoreSysMsgFeqCnt[3]; //0xB8
  813. sint16 BattAccuMsgFeqCnt[3]; //0xBA
  814. sint16 BattSceneMsgFeqCnt[3]; //0xBC
  815. sint16 BattHighFeqMsgFeqCnt[3]; //0xC0
  816. sint16 BattAlgthMsgFeqCnt[3]; //0xC2
  817. }TcpFeq_type;
  818. typedef struct
  819. {
  820. uint8 year;
  821. uint8 month;
  822. uint8 day;
  823. uint8 hour;
  824. uint8 minute;
  825. uint8 second;
  826. } UTC8TimeType;
  827. static void vTimer1000msCallback(TimerHandle_t pxTimer);
  828. static void tcpEncodeDebugMsg(uint32* PtrSendAddr, uint16* SendLen);
  829. static void tcpEncodeVerMsg(uint32* PtrSendAddr,uint16* SendLen);
  830. static void tcpEncodeGPSMsg(uint32* PtrSendAddr,uint16* SendLen);
  831. static void tcpEncodeDeviceStMsg(uint32* PtrSendAddr,uint16* SendLen);
  832. static void tcpBattStaticMsg(uint32* PtrSendAddr,uint16* SendLen);
  833. static void tcpBattDynamicMsg(uint32* PtrSendAddr,uint16* SendLen);
  834. static void tcpTruckVehiMsg(uint32* PtrSendAddr,uint16* SendLen);
  835. static void tcpEngyStoreSysMsg(uint32* PtrSendAddr,uint16* SendLen);
  836. static void tcpBattAccInfoMsg(uint32* PtrSendAddr,uint16* SendLen);
  837. static void tcpBattSceneInfoMsg(uint32* PtrSendAddr,uint16* SendLen);
  838. static void tcpBattHighFeqInfoMsg(uint32* PtrSendAddr,uint16* SendLen);
  839. static void tcpBattAlgthInfoMsg(uint32* PtrSendAddr,uint16* SendLen);
  840. static void tcpUdsCmdNegAnsMsg(uint32* PtrSendAddr,uint16* SendLen);
  841. static void tcpUdsCmdPosAnsMsg(uint32* PtrSendAddr,uint16* SendLen);
  842. //////////////////////////////////////////////////////////////////////////////////////////////
  843. typedef float real32_T;
  844. real32_T ihd_I_battCurr_T2;
  845. real32_T ihd_V_battU_T2;
  846. real32_T ihd_V_cellUAvrg;
  847. real32_T ihd_V_cellUMax;
  848. real32_T ihd_V_cellUMin;
  849. real32_T socd_pct_ahSoc;
  850. real32_T socd_pct_battSoc;
  851. real32_T socd_pct_battSocEi;
  852. real32_T socd_pct_battSocEo;
  853. real32_T socd_pct_bcuSoc;
  854. real32_T socd_pct_bcuSocEi;
  855. real32_T socd_pct_bcuSocEo;
  856. real32_T socd_pct_ekfSoc;
  857. real32_T sohd_pct_bcuSoh;
  858. QueueHandle_t GpsDataQueueHandle;
  859. typedef long BaseType_t;
  860. #define pdFALSE ( ( BaseType_t ) 0 )
  861. #define pdTRUE ( ( BaseType_t ) 1 )
  862. #define pdPASS ( pdTRUE )
  863. #define pdFAIL ( pdFALSE )
  864. #define BATT_SN_LEN 17
  865. #define TCP_PROTOL_VER 0x0302
  866. #define DEVICE_TYPE 0x02
  867. #define DEVICE_GENERATION 0x01
  868. #define DEVICE_KERNEL_VER 0x01000001
  869. #define DEVICE_HW_VERSION 0x0102
  870. #define DEVICE_DRIVER_SW_VER 0x01010003
  871. #define DEVICE_APP_SW_VER 0x01010301
  872. #define OTHER_TEMP_NUM 4
  873. #define BMS_CELL_MAX_NUM 384
  874. #define BMS_TEMP_MAX_NUM 64
  875. typedef unsigned char boolean_T;
  876. sint16 xyzData[3] = {0};
  877. uint8 TcpbattSN[BATT_SN_LEN] = {0x31};
  878. uint8 DeviceErrNum = 0;
  879. uint8 BLEMAC[6] = {0x45,0x56,0x67,0x78,0x89,0x90};
  880. uint8 DEVICE_PRO_DATE[3] = {23,01,01};
  881. uint8 BATT_PRO_DATE[3] = {23,01,01};
  882. char ImeiNum[15] = {0};
  883. char IccidNum[20] = {0};
  884. boolean_T rtev_flg_EESt[4];
  885. /************************************************************
  886. *BCU->4G解码变量存放区
  887. ************************************************************/
  888. UINT8 BMS_CellRecvFlg = 0; //电压收取标志位
  889. UINT8 canRecvFramNum[BMS_CELL_MAX_NUM/3] = {0};
  890. UINT8 BMS_ReqVIN = 0x00; // 是否请求VIN码,0:预留;1:请求VIN;2:不请求VIN;3:无效;,Re-1,Off-0,
  891. UINT8 BMS_ReqHVOff = 0x00; // 是否请求下高压,0:预留;1:请求下高压;2:不请求下高压;3:无效;,Re-1,Off-0,
  892. UINT8 BMS_ProtocolEditionH = 0x00; // 通讯协议版本高位(例 : 版本为3 .1, 则此处发3), , Re - 1, Off - 0,
  893. UINT8 BMS_ProtocolEditionL = 0x00; // 通讯协议版本低位(例 : 版本为3 .1, 则此处发1), , Re - 1, Off - 0,
  894. UINT8 BMS_CharDevNum = 0x00; // 可充电装置系统序号(BMS是整车中可充电装置系统中的第几个, 需要整车告知),1,Re-1,Off-0,
  895. UINT8 BMS_FtPosRly = 0x00; // 主正继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  896. UINT8 BMS_FtNegRly = 0x00; // 主负继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  897. UINT8 BMS_FtPosCharRly1 = 0x00; // 充正1继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  898. UINT8 BMS_FtNegCharRly1 = 0x00; // 充负1继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  899. UINT8 BMS_FtPosCharRly2 = 0x00; // 充正2继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  900. UINT8 BMS_FtNegCharRly2 = 0x00; // 充负2继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  901. UINT8 BMS_FtHeatRly1 = 0x00; // 加热1/正继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  902. UINT8 BMS_FtHeatRly2 = 0x00; // 加热2/负继电器粘连故障,0:正常; 1:故障,Re-1,Off-0,
  903. UINT8 BMS_StPosRly = 0x00; // 主正继电器状态(如继电器状态由BMS检测),0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  904. UINT8 BMS_StNegRly = 0x00; // 主负继电器状态(如继电器状态由BMS检测),0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  905. UINT8 BMS_StPreCharRly = 0x00; // 预充继电器状态,0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  906. UINT8 BMS_StPosCharRly1 = 0x00; // 直流充正继电器1状态,0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  907. UINT8 BMS_StNegCharRly1 = 0x00; // 直流充负继电器1状态,0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  908. UINT8 BMS_StPosCharRly2 = 0x00; // 直流充正继电器2状态,0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  909. UINT8 BMS_StNegCharRly2 = 0x00; // 直流充负继电器2状态,0:预留;1:开启;2:闭合;3:无效;,Re-1,Off-0,
  910. UINT8 BMS_FtAuxRelayWeld = 0x00; // 附件继电器粘连故障(保留),0:正常; 1:故障,Re-1,Off-0,
  911. UINT8 BMS_BraOpenCirc = 0x00; // 支路断路故障,0:正常; 1:故障,Re-1,Off-0,
  912. UINT8 BMS_FtBackCharCurrOutLim = 0x00; // 回充电流超限报警,0:正常1 : 1级 轻微故障 2 : 2级 较严重故障 3 : 3级 最严重故障, Re - 1, Off - 0,
  913. UINT8 BMS_FtPosRlyOpen = 0x00; // 主正继电器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  914. UINT8 BMS_FtNegRlyOpen = 0x00; // 主负继电器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  915. UINT8 BMS_FtPosCharRly1Open = 0x00; // 直流充电正1继电器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  916. UINT8 BMS_FtPosCharRly2Open = 0x00; // 直流充电正2继电器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  917. UINT8 BMS_FtNegCharRly1Open = 0x00; // 直流充电负1继电器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  918. UINT8 BMS_FtNegCharRly2Open = 0x00; // 直流充电负2继电器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  919. UINT8 BMS_FtTMSContClose = 0x00; // 加热膜或TMS接触器无法断开报警,0:正常; 1:故障,Re-1,Off-0,
  920. UINT8 BMS_FtTMSContOpen = 0x00; // 加热膜或TMS接触器无法闭合报警,0:正常; 1:故障,Re-1,Off-0,
  921. UINT8 BMS_FtTMS = 0x00; // 热管理系统故障,0:正常; 1:故障,Re-1,Off-0,
  922. UINT8 BMS_Ft24VSpy = 0x00; // BMS 24V供电异常报警,0:正常; 1:故障,Re-1,Off-0,
  923. UINT8 BMS_FtPACKSelfProt = 0x00; // 电池包自保护报警,0:正常; 1:故障,Re-1,Off-0,
  924. UINT8 BMS_FtCharSockTempOver = 0x00; // 充电插座过温报警,0:正常1 : 1级 轻微故障 2 : 2级 较严重故障 3 : 3级 最严重故障, Re - 1, Off - 0,
  925. UINT8 BMS_FtTempOutCtrl = 0x00; // 热失控报警,0:正常; 1:故障,Re-1,Off-0,
  926. UINT8 BMS_StPosHeatRly = 0x00; // 加热正继电器状态,0:保留;1:开启;2:闭合;3:无效,Re-1,Off-0,
  927. UINT8 BMS_StNegHeatRly = 0x00; // 加热负继电器状态,0:保留;1:开启;2:闭合;3:无效,Re-1,Off-0,
  928. UINT8 BMS_CharSysNum = 0x00; // 可充电储能子系统总数(保留),,Re-1,Off-0,
  929. UINT8 BMS_FtCode = 0x00; // 电池系统故障码,详见附表电池系统故障码列表,Re-1,Off-0,
  930. UINT8 BMS_ST1CheckSum = 0x00; // B2V_ST1的CheckSum,Byte0=Byte1 XOR Byte2 XOR Byte3 XOR Byte4 XOR Byte5 XOR Byte6 XOR Byte7,Re-1,Off-0,
  931. UINT8 BMS_ST1Counter = 0x00; // B2V_ST1的生命信号,0~14循环,15:信号无效,Re-1,Off-0,
  932. UINT8 BMS_Mode = 0x00; // BMS当前状态,0-未上高压,2-上高压
  933. UINT8 BMS_AuxRlySt = 0x00; // 附件继电器状态,0:开启;1:闭合;,Re-1,Off-0,
  934. UINT8 BMS_BattBalaSt = 0x00; // BMS当前均衡状态,0:未开启均衡;1:开启均衡;,Re-1,Off-0,
  935. UINT8 BMS_CharGunSt = 0x00; // 直流充电枪连接状态,0:未连接1 : 连接, Re - 1, Off - 0,
  936. UINT8 BMS_CharMode = 0x00; // BMS当前充电模式,0:预留1 : 直流充电 2 : 交流充电 3 : 其他充电, Re - 1, Off - 0,
  937. UINT8 BMS_CharSt = 0x00; // 充电状态,0:可以充电1 : 正在充电 2 : 充电结束 3 : 充电故障, Re - 1, Off - 0,
  938. UINT8 BMS_FtLvl = 0x00; // 当前最高故障等级,0:正常1 : 1级 轻微故障 2 : 2级 较严重故障 3 : 3级 最严重故障, Re - 1, Off - 0,
  939. UINT8 BMS_FtCellTempDiff = 0x00; // 电芯温差异常报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  940. UINT8 BMS_FtCellTempHigh = 0x00; // 电芯温度过高报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  941. UINT8 BMS_FtPACKOverVolt = 0x00; // PACK过压报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  942. UINT8 BMS_FtPACKUndeVolt = 0x00; // PACK欠压报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  943. UINT8 BMS_FtSOCLow = 0x00; // SOC过低报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  944. UINT8 BMS_FtCellOverVolt = 0x00; // 单体电压过高报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  945. UINT8 BMS_FtCellUndeVolt = 0x00; // 单体电压欠压报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  946. UINT8 BMS_FtIns = 0x00; // 绝缘报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  947. UINT8 BMS_FtCellOverVoltDiff = 0x00; // 单体压差过大,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  948. UINT8 BMS_FtCharCurrOver = 0x00; // 充电电流过大报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  949. UINT8 BMS_FtDisCharCurrOver = 0x00; // 放电电流过大报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  950. UINT8 BMS_FtCellTempLow = 0x00; // 电芯温度过低报警,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  951. UINT8 BMS_FtBranVoltDifOver = 0x00; // 支路压差过大报警(存在并联支路的系统),0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  952. UINT8 BMS_FtBMSHardWare = 0x00; // BMS硬件故障,0:无故障; 1:1级 轻微故障; 2:2级 较严重故障3 : 3级 最严重故障, Re - 1, Off - 0,
  953. UINT8 BMS_FtSOCHigh = 0x00; // SOC过高报警,0:正常; 1:故障,Re-1,Off-0,
  954. UINT8 BMS_FtSOCJump = 0x00; // SOC跳变报警,0:正常; 1:故障,Re-1,Off-0,
  955. UINT8 BMS_FtInCom = 0x00; // BMS内部通信故障,0:正常; 1:故障,Re-1,Off-0,
  956. UINT8 BMS_FtSysMism = 0x00; // BMS/可充电储能系统不匹配报警,0:正常; 1:故障,Re-1,Off-0,
  957. UINT8 BMS_FtHvIntLock = 0x00; // 高压互锁报警,0:正常; 1:故障,Re-1,Off-0,
  958. UINT8 BMS_FtSmoke = 0x00; // 火警探测器故障,0:正常; 1:故障,Re-1,Off-0,
  959. UINT8 BMS_FtFire = 0x00; // 电池包火灾报警,0:正常; 1:故障,Re-1,Off-0,
  960. UINT8 BMS_FtNum = 0x00; // BMS当前发生的故障总数目(包括GB32960中规定的故障数目),,Re-1,Off-0,
  961. UINT8 BMS_PackSOC = 0x00; // 电池包SOC,,Re-0.4,Off-0,
  962. UINT8 BMS_PackSOH = 0x00; // 电池包SOH,,Re-0.4,Off-0,
  963. UINT8 BMS_MaxCellTemp = 0x00; // 单体最高温度,,Re-1,Off--50,℃
  964. UINT8 BMS_MinCellTemp = 0x00; // 单体最低温度,,Re-1,Off--50,℃
  965. UINT8 BMS_AverCellTemp = 0x00; // 单体平均温度,,Re-1,Off--50,℃
  966. UINT8 BMS_MaxCellTempCSC = 0x00; // 最高温度电芯所在子系统(CSC)编号,范围(1~255),Re-1,Off-0,
  967. UINT8 BMS_MaxCellTempNum = 0x00; // 最高温度电芯所在子系统(CSC)内温度探针编号,范围(1~255),Re-1,Off-0,
  968. UINT8 BMS_MinCellTempCSC = 0x00; // 最低温度电芯所在子系统(CSC)编号,范围(1~255),Re-1,Off-0,
  969. UINT8 BMS_MinCellTempNum = 0x00; // 最低温度电芯所在子系统(CSC)内温度探针编号,范围(1~255),Re-1,Off-0,
  970. UINT8 BMS_MaxCellVoltCSC = 0x00; // 最高电压电芯所在子系统(CSC)编号,范围(1~255),Re-1,Off-0,
  971. UINT8 BMS_MaxCellVoltNum = 0x00; // 最高电压电芯所在子系统(CSC)内单体编号,范围(1~255),Re-1,Off-0,
  972. UINT8 BMS_MinCellVoltCSC = 0x00; // 最低电压电芯所在子系统(CSC)编号,范围(1~255),Re-1,Off-0,
  973. UINT8 BMS_MinCellVoltNum = 0x00; // 最低电压电芯所在子系统(CSC)内单体编号,范围(1~255),Re-1,Off-0,
  974. UINT8 BMS_InsDeteSt = 0x00; // BMS绝缘检测状态,0:停止检测;1:激活检测;,Re-1,Off-0,
  975. UINT8 BMS_FtCharInsLow = 0x00; // 充电绝缘阻值低,0:正常; 1:故障,Re-1,Off-0,
  976. UINT8 BMS_FtCurrSenr = 0x00; // 电流传感器故障,0:正常; 1:故障,Re-1,Off-0,
  977. UINT8 BMS_FtHeatingFilm = 0x00; // 加热膜加热回路故障,0:正常; 1:故障,Re-1,Off-0,
  978. UINT8 BMS_FtMainLoopPreChar = 0x00; // 主回路预充或预检故障,0:正常; 1:故障,Re-1,Off-0,
  979. UINT8 BMS_FtAuxLoopPreChar = 0x00; // 辅件回路预充或预检故障,0:正常; 1:故障,Re-1,Off-0,
  980. UINT8 BMS_FtACANLost = 0x00; // ACAN/整车CAN通讯故障,0:正常; 1:故障,Re-1,Off-0,
  981. UINT8 BMS_FtDCDC = 0x00; // BMS-DC-DC故障,0:正常; 1:故障,Re-1,Off-0,
  982. UINT8 BMS_FtSOCDif = 0x00; // SOC差异过大,0:正常; 1:故障,Re-1,Off-0,
  983. UINT8 BMS_FtCellOverDisChar = 0x00; // 电芯过放故障,0:正常; 1:故障,Re-1,Off-0,
  984. UINT8 BMS_FtCharOver = 0x00; // 车载储能装置过充报警,0:正常;1:1级 轻微故障;2:2级 较严重故障3 : 10级 最严重故障, Re - 1, Off - 0,
  985. UINT8 BMS_FtContDisCharCurrOverLoad = 0x00; // 持续回充过流故障,0:正常;1:1级 轻微故障;2:2级 较严重故障3 : 10级 最严重故障, Re - 1, Off - 0,
  986. UINT8 BMS_FtContCharCurrOverLoad = 0x00; // 持续放电过流故障,0:正常;1:1级 轻微故障;2:2级 较严重故障3 : 10级 最严重故障, Re - 1, Off - 0,
  987. UINT8 BMS_Gun1DCNegTemp = 0x00; // 充电口1负温感值,,Re-1,Off--40,℃
  988. UINT8 BMS_Gun1DCPosTemp = 0x00; // 充电口1正温感值,,Re-1,Off--40,℃
  989. UINT8 BMS_Gun2DCNegTemp = 0x00; // 充电口2负温感值,,Re-1,Off--40,℃
  990. UINT8 BMS_Gun2DCPosTemp = 0x00; // 充电口2正温感值,,Re-1,Off--40,℃
  991. UINT8 BMS_CurrHeatSt = 0x00; // 当前加热状态,0:未加热;1:加热中;2:预留;3:无效;,Re-1,Off-0,
  992. UINT8 BMS_CurrCoolSt = 0x00; // 当前冷却状态,0:未冷却;1:冷却中;2:预留;3:无效;,Re-1,Off-0,
  993. UINT8 BMS_FtCharCnct = 0x00; // 插枪连接信号异常,0:正常; 1:故障,Re-1,Off-0,
  994. UINT8 BMS_FtOverDisCharCurrDuringChar = 0x00; // 充电时放电电流过大,0:正常; 1:故障,Re-1,Off-0,
  995. UINT8 BMS_FtCharNTC = 0x00; // 充电插座NTC故障,0:正常; 1:故障,Re-1,Off-0,
  996. UINT8 BMS_FtELock = 0x00; // 电子锁故障,0:正常; 1:故障,Re-1,Off-0,
  997. UINT8 BMS_CellVoltFramNum = 0x00; // 单体电压帧序号,有效值1~255,Re-1,Off-0,
  998. UINT8 BMS_CellTempFramNum = 0x00; // 温度帧序号,有效值1~255,Re-1,Off-0,
  999. UINT8 BMS_CSC_Code = 0x00; // 子系统编号CSC,有效值1~255,Re-1,Off-0,
  1000. UINT8 BMS_CellTemp[BMS_TEMP_MAX_NUM] = {0x00}; // 当前CSC下的第N个探针的温度,255 "Invalid" 0xFF 无效有效值 0 ~254, 单位 ℃, 范围(-50 ~204)℃, , Re - 1, Off-- 50,℃
  1001. UINT8 BMS_Checksum = 0x00; // 电池编码信息1的CheckSum,Byte0=Byte1 XOR Byte2 XOR Byte3 XOR Byte4 XOR Byte5 XOR Byte6 XOR Byte7,Re-1,Off-0,
  1002. UINT8 BMS_PackComp = 0x00; // 电池厂家,1:"CATL" 2:"Li Shen" 3:"MGL" 4:"SAMSUN" 5:"LG",Re-1,Off-0,
  1003. UINT8 BMS_BattCodeLeng = 0x00; // 电池编码长度,0:Do not transmit this Code,Re-1,Off-0,
  1004. UINT8 BMS_SN[27] = {0}; // 电池编码(SN)字符1(ASCII),,Re-1,Off-0,
  1005. UINT8 BMS_BattType = 0x00; // 电池类型,1:铅酸电池; 2:镍氢电池; 3:磷酸铁锂电池; 4:锰酸锂电池; 5:钴酸锂电池; 6:三元材料电池; 7:聚合物锂离子电池; 8:钛酸锂电池; 9:超级电容; 10~13:保留; 14:燃料电池;15:保留,Re-1,Off-0,
  1006. UINT8 BMS_CoolType = 0x00; // 电池冷却方式,0:其他冷却方式1 : 自然冷却 2 : 风扇冷却 3 : 水冷却, Re - 1, Off - 0,
  1007. UINT8 BMS_CSC_Total = 0x00; // 电池系统中CSC总的数目,,Re-1,Off-0,
  1008. UINT8 BMS_CellVoltLevel = 0x00; // 单体平台电压(非实时变化的值),有效值0~5V; 255 "Signal Invalid" 0xFF 无效,Re-0.1,Off-0,V
  1009. UINT8 BMS_CellMinVolt = 0x00; // 单体可用最低电压(非实时变化的值),有效值0~5V; 255 "Signal Invalid" 0xFF 无效,Re-0.1,Off-0,V
  1010. UINT8 BMS_CellMaxVolt = 0x00; // 单体可用最高电压(非实时变化的值),有效值0~5V; 255 "Signal Invalid" 0xFF 无效,Re-0.1,Off-0,V
  1011. UINT8 BMS_HVBranNum = 0x00; // 电池系统高压支路数,,Re-1,Off-0,
  1012. UINT8 BMS_SingleHVBranchCellNum = 0x00; // 电池系统单支路电芯数,,Re-1,Off-0,
  1013. UINT8 BMS_ReqMode = 0x00; // BMS请求设定模式,0:关机模式1 : 制冷模式 2 : 制热模式 3 : 自循环模式, Re - 1, Off - 0,
  1014. UINT8 BMS_HVCmd = 0x00; // 高压请求,0:请求上高压1 : 请求下高压, Re - 1, Off - 0,
  1015. UINT8 BMS_ChgSts = 0x00; // 充电状态,0:非充电1 : 充电, Re - 1, Off - 0,
  1016. UINT8 BMS_HVRelaySts = 0x00; // BMS高压继电器状态,0:断开状态; 1:闭合状态; 2~3:无效,Re-1,Off-0,
  1017. UINT8 BMS_SetTemp = 0x00; // 设定温度,,Re-1,Off--40,
  1018. UINT8 BMS_Life = 0x00; // BMS生命帧,,Re-1,Off-0,
  1019. UINT8 BMS_CRC = 0x00; // CRC校验值,,Re-1,Off-0,
  1020. UINT8 TMS_WorkStatus = 0x00; // TMS工作状态,0:关机模式1 : 制冷模式 2 : 制热模式 3 : 自循环模式, Re - 1, Off - 0,
  1021. UINT8 TMS_HVRelayST = 0x00; // TMS高压继电器状态,0:断开状态; 1:闭合状态; 2~3:无效,Re-1,Off-0,
  1022. UINT8 TMS_OutletTemp = 0x00; // 出水温度(机组到电池),255:无效,Re-1,Off--40,
  1023. UINT8 TMS_InletTemp = 0x00; // 回水温度(电池到机组),255:无效,Re-1,Off--40,
  1024. UINT8 TMS_ErrCode = 0x00; // TMS故障码,0:无故障; 出现 1 种以上循环发送,Re-1,Off-0,
  1025. UINT8 TMS_FaultLevel = 0x00; // TMS故障码等级,0:无效1 : 1级故障 2 : 2级故障 3 : 3级故障, Re - 1, Off - 0,
  1026. UINT16 BMS_SoftwareVersion = 0x00; // 软件版本号:RyyyBzzz(R为软件版本、B为测试版本、正式版本不带B) ,yyy:0~254,精度1,255:无效,不显示;zzz:0~254,精度1,255:无效,不显示;
  1027. UINT16 BMS_HardwareVersion = 0x00; // 硬件版本号:VyyyBzzz(V为硬件版本、B为测试版本、正式版本不带B) ,,Re-1,Off-0,
  1028. UINT16 BMS_PackCurr = 0x00; // 电池包总电流,充电为负值,放电为正值,,Re-0.1,Off--1000,A
  1029. UINT16 BMS_MaxCharCurr = 0x00; // 电池包最大回充电流,,Re-0.1,Off--1000,A
  1030. UINT16 BMS_MaxDisCharCurr = 0x00; // 电池包最大放电电流,,Re-0.1,Off--1000,A
  1031. UINT16 BMS_PosIns = 0x00; // 母线正对车体绝缘电阻,,Re-1,Off-0,KΩ
  1032. UINT16 BMS_NegIns = 0x00; // 母线负对车体绝缘电阻,,Re-1,Off-0,KΩ
  1033. UINT16 BMS_BattVolt = 0x00; // 电池包内侧电压,,Re-0.1,Off-0,V
  1034. UINT16 BMS_LinkVolt = 0x00; // 电池包外侧电压,,Re-0.1,Off-0,V
  1035. UINT16 BMS_MaxCellVolt = 0x00; // 单体最高电压值,,Re-0.001,Off-0,V
  1036. UINT16 BMS_AverCellVolt = 0x00; // 电芯电压平均值,,Re-0.001,Off-0,V
  1037. UINT16 BMS_MinCellVolt = 0x00; // 电芯最低电压值,,Re-0.001,Off-0,V
  1038. UINT16 BMS_ContChrgCurr = 0x00; // BMS允许的持续回充电流,,Re-0.1,Off-0,A
  1039. UINT16 BMS_ContDisCharCurr = 0x00; // BMS允许的持续放电电流,,Re-0.1,Off--1000,A
  1040. UINT16 BMS_CharReqVolt = 0x00; // 充电所需电压(交流),,Re-0.1,Off-0,V
  1041. UINT16 BMS_CharReqCurr = 0x00; // 充电所需电流(交流),,Re-0.1,Off--1000,A
  1042. UINT16 BMS_SysInsRes = 0x00; // 系统绝缘电阻,,Re-1,Off-0,KΩ
  1043. UINT16 BMS_MaxDisCharPwr = 0x00; // 最大允许放电功率,,Re-0.1,Off-0,kw
  1044. UINT16 BMS_MaxCharPwr = 0x00; // 最大允许充电功率,,Re-0.1,Off-0,kw
  1045. UINT16 BMS_ContDisCharPwr = 0x00; // BMS允许的持续放电功率,,Re-0.1,Off-0,kw
  1046. UINT16 BMS_ContCharPwr = 0x00; // BMS允许的持续充电功率,,Re-0.1,Off-0,kw
  1047. UINT16 BMS_InstEngyCons = 0x00; // 动力电池瞬时百公里能耗,,Re-0.1,Off-0,kwh
  1048. UINT16 BMS_TotalEngyCons = 0x00; // 动力电池总/平均百公里能耗,,Re-0.1,Off-0,kwh
  1049. UINT16 BMS_SOE = 0x00; // 剩余电量,,Re-0.01,Off-0,kwh
  1050. UINT16 BMS_RmanCharTime = 0x00; // 剩余充电时间,,Re-1,Off-0,min
  1051. UINT16 BMS_CharNum = 0x00; // 充电次数,,Re-1,Off-0,
  1052. UINT16 BMS_CellVolt[BMS_CELL_MAX_NUM] = {0x00}; // 电芯的电压,65535 "Invalid" 0xFFFF 无效有效值 0 ~65534, 范围(0 ~65.534) V, Re - 0.001, Off - 0, V
  1053. UINT16 BMS_BattRateCap = 0x00; // 电池包额定容量,有效值 0~65534,65535 "Signal Invalid" 无效,Re-1,Off-0,Ah
  1054. UINT16 BMS_BattRateVolt = 0x00; // 电池包额定电压,有效值 0~6553.4,65535 "Signal Invalid" 无效,Re-0.1,Off-0,V
  1055. UINT16 BMS_BattRateEngy = 0x00; // 电池包额定能量,有效值 0~6553.4,65535 "Signal Invalid" 无效,Re-0.1,Off-0,kWh
  1056. UINT16 BMS_CellTotal = BMS_CELL_MAX_NUM; // PACK中单体电芯的总数目,,Re-1,Off-0,//
  1057. UINT16 BMS_TempTotal = BMS_TEMP_MAX_NUM; // PACK中电芯温度点(探针)的总数目,,Re-1,Off-0,
  1058. UINT16 BMS_SingleCharEngy = 0x00; // 单次充电kWh 数,,Re-0.1,Off-0,KWh
  1059. UINT16 BMS_SingleCharCapy = 0x00; // 单次充电Ah 数,,Re-0.1,Off-0,Ah
  1060. UINT16 BMS_HVVolt = 0x00; // BMS当前电压,,Re-1,Off-0,
  1061. UINT16 TMS_ReqPow = 0x00; // TMS需求功率,65535:无效,Re-0.1,Off-0,Kw
  1062. UINT32 BMS_TotalCharEngy = 0x00; // 累计充入kWh 数,,Re-0.1,Off-0,KWh
  1063. UINT32 BMS_TotalDischarEngy = 0x00; // 累计放出kWh 数,,Re-0.1,Off-0,KWh
  1064. UINT32 BMS_TotalBackCharEngy = 0x00; // 累计动能回馈充入kWh 数,,Re-0.1,Off-0,KWh
  1065. UINT32 BMS_TotalStaCharEngy = 0x00; // 累计换电站充入kWh 数,,Re-0.1,Off-0,KWh
  1066. UINT32 BMS_TotalGunCharEngy = 0x00; // 累计插枪充电充入kWh 数,,Re-0.1,Off-0,KWh
  1067. UINT32 BMS_TotalGunCharCapy = 0x00; // 累计插枪充电充入Ah 数,,Re-0.1,Off-0,Ah
  1068. UINT32 BMS_TotalCharCapy = 0x00; // 累计充入Ah 数,,Re-0.1,Off-0,Ah
  1069. UINT32 BMS_TotalDischarCapy = 0x00; // 累计放出Ah 数,,Re-0.1,Off-0,Ah
  1070. UINT32 BMS_TotalBackCharCapy = 0x00; // 累计动能回馈充入Ah 数,,Re-0.1,Off-0,Ah
  1071. UINT32 BMS_TotalStaCharCapy = 0x00; // 累计换电站充入Ah 数,,Re-0.1,Off-0,Ah
  1072. uint8 BATT_SYS_ERROR_NUM_BBox_To_TCP = 0x00; //电池系统故障数量
  1073. uint8* BATT_SYS_ERROR_CODE_ARRAY_BBox_To_TCP = NULL; //电池系统故障代码
  1074. /************************************************************
  1075. *BBox计算变量定义区
  1076. ************************************************************/
  1077. UINT8 BBox_DataReadyFlag = 0;
  1078. UINT8 BBox_VCUConSt = 0x01; //VCU 连接状态,用于判断电池连接与车或站的连接状态,1为站,0为车
  1079. UINT8 BBox_PackSOC = 0x00; //BBox计算SOC,Re-0.4,Off-0;
  1080. UINT8 BBox_PackSOH = 0x00; //BBox计算SOH,Re-1,Off-0;
  1081. UINT32 BBox_TotalCharEngy = 0x00; // 累计充入kWh 数,,Re-0.1,Off-0,KWh
  1082. UINT32 BBox_TotalDischarEngy = 0x00; // 累计放出kWh 数,,Re-0.1,Off-0,KWh
  1083. UINT32 BBox_TotalBackCharEngy = 0x00; // 累计动能回馈充入kWh 数,,Re-0.1,Off-0,KWh
  1084. UINT32 BBox_TotalStaCharEngy = 0x00; // 累计换电站充入kWh 数,,Re-0.1,Off-0,KWh
  1085. UINT32 BBox_TotalGunCharEngy = 0x00; // 累计插枪充电充入kWh 数,,Re-0.1,Off-0,KWh
  1086. UINT32 BBox_TotalGunCharCapy = 0x00; // 累计插枪充电充入Ah 数,,Re-0.1,Off-0,Ah
  1087. UINT32 BBox_TotalCharCapy = 0x00; // 累计充入Ah 数,,Re-0.1,Off-0,Ah
  1088. UINT32 BBox_TotalDischarCapy = 0x00; // 累计放出Ah 数,,Re-0.1,Off-0,Ah
  1089. UINT32 BBox_TotalBackCharCapy = 0x00; // 累计动能回馈充入Ah 数,,Re-0.1,Off-0,Ah
  1090. UINT32 BBox_TotalStaCharCapy = 0x00; // 累计换电站充入Ah 数,,Re-0.1,Off-0,Ah
  1091. UINT32 BBox_Dq_Dv_MAX = 0x00; //BBox计算dq/dv_MAX,Re-0.001,Off-0,Ah/10mV
  1092. UINT32 BBox_Dq_Dv_MIN = 0x00; //BBox计算dq/dv_MIN,Re-0.001,Off-0,Ah/10mV
  1093. float BBox_SocCorrectionValue = 0x00; //BBox的SOC修正量,平台下发,Re-0.1,0ff-100,1bit std for 0.1% -100~100
  1094. float BBox_SohCorrectionValue = 0x00; //BBox的SOHC修正量,平台下发,Re-0.1,0ff-0,1bit std for 0.1% 1~100
  1095. //////////////////////////////////////////////////////////////////////////////////////////////
  1096. volatile TcpFeq_type TcpDataFeq={
  1097. {TimeCali, 60*60*2,0}, //time calib
  1098. {DebugMsg, 10, 0}, //debug msg feq
  1099. {VerMsg, 60*60, 0}, //Version feq
  1100. {GPSMsg, 10, 0}, //gps msg feq
  1101. {DeviceStateMsg, 10, 0}, //device state msg feq
  1102. {BattStaticMsg, 60, 0}, //
  1103. {BattDynamicMsg, 60, 0}, //
  1104. {TruckVehiMsg, 10, 0}, //trunk vehil msg feq
  1105. {EngyStoreSysMsg, 30, 0}, //
  1106. {BattAccuMsg, 30, 0}, //trunk vehil&batt acc msg feq
  1107. {BattSceneMsg, 60*60, 0}, //
  1108. {BattHighFeqMsg, 10, 0}, //
  1109. {BattAlgthMsg, 10, 0}, //
  1110. };
  1111. static UTC8TimeType UTC8TimeTcp;
  1112. static void vTimer1000msCallback(TimerHandle_t pxTimer)
  1113. {
  1114. uint32 ulTimerID;
  1115. ulTimerID = (uint32)pvTimerGetTimerID(pxTimer);
  1116. sint16 *TcpDataFeqPtr =NULL;
  1117. TcpDataFeqPtr = (sint16 *)&TcpDataFeq;
  1118. if (ulTimerID == 0)
  1119. {
  1120. if(SocketId>=0)
  1121. {
  1122. for(uint8 i=2;i<sizeof(TcpDataFeq)/sizeof(sint16);i=i+3)
  1123. {
  1124. *(TcpDataFeqPtr+i) = (*(TcpDataFeqPtr+i)-1)<0 ? 0 : (*(TcpDataFeqPtr+i)-1);
  1125. }
  1126. }
  1127. TimeUpdate(&UTC8TimeTcp);
  1128. }
  1129. }
  1130. void TimeUpdate(UTC8TimeType *UTC8TimeTcpPtr)
  1131. {
  1132. int year = 0, month = 0, day = 0, hour = 0,minute = 0,second = 0;
  1133. int lastday = 0;
  1134. year = UTC8TimeTcpPtr->year + 2000;
  1135. month = UTC8TimeTcpPtr->month;
  1136. day = UTC8TimeTcpPtr->day;
  1137. hour = UTC8TimeTcpPtr->hour;
  1138. minute = UTC8TimeTcpPtr->minute;
  1139. second = UTC8TimeTcpPtr->second;
  1140. second+=1;
  1141. if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
  1142. {
  1143. lastday = 31;
  1144. }
  1145. else if (month == 4 || month == 6 || month == 9 || month == 11)
  1146. {
  1147. lastday = 30;
  1148. }
  1149. else
  1150. {
  1151. if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
  1152. lastday = 29;
  1153. else
  1154. lastday = 28;
  1155. }
  1156. if(second >=60)
  1157. {
  1158. second -=60;
  1159. minute +=1;
  1160. if(minute >=60)
  1161. {
  1162. minute -=60;
  1163. hour +=1;
  1164. }
  1165. }
  1166. if (hour >= 24)
  1167. {
  1168. hour -= 24;
  1169. day += 1;
  1170. if (day > lastday)
  1171. {
  1172. day -= lastday;
  1173. month += 1;
  1174. if (month > 12)
  1175. {
  1176. month -= 12;
  1177. year += 1;
  1178. }
  1179. }
  1180. }
  1181. UTC8TimeTcpPtr->year = year - 2000;
  1182. UTC8TimeTcpPtr->month = month;
  1183. UTC8TimeTcpPtr->day = day;
  1184. UTC8TimeTcpPtr->hour = hour;
  1185. UTC8TimeTcpPtr->minute = minute;
  1186. UTC8TimeTcpPtr->second = second;
  1187. }
  1188. /********************************平台协议3.0应用层***********************************/
  1189. static void tcpEncodeDebugMsg(uint32* PtrSendAddr, uint16* SendLen)
  1190. {
  1191. uint8 *SendBuffer = NULL;
  1192. char rbuf[512]={0};
  1193. char tmp[13] = {0};
  1194. memcpy(tmp,BMS_SN,12);
  1195. DebugMsgtoTcpType DebugMsgInfo;
  1196. UINT16 DataLen = 0;
  1197. UINT16 BufferLen = 0;
  1198. sprintf((char *)rbuf, "%s,%d,\
  1199. {%.2f,%.2f,%.2f,%.2f},\
  1200. {%d,%d,%d,%d,%d,%d},\
  1201. {%.3f,%.3f,%.3f,%.1f,%d,%d}",
  1202. tmp,DeviceErrNum,
  1203. socd_pct_ahSoc,socd_pct_battSoc,socd_pct_bcuSoc,socd_pct_ekfSoc,
  1204. BBox_TotalCharEngy,BBox_TotalDischarEngy,BBox_TotalBackCharEngy,BBox_TotalCharCapy,BBox_TotalDischarCapy,BBox_TotalBackCharCapy,
  1205. ihd_V_cellUMax,ihd_V_cellUMin,ihd_V_cellUAvrg,ihd_I_battCurr_T2,BMS_PackSOC,rtev_flg_EESt[3]);
  1206. BufferLen = strlen((const char *)rbuf);
  1207. *SendLen = BufferLen + sizeof(DebugMsgInfo);
  1208. SendBuffer = malloc(*SendLen);
  1209. memcpy(SendBuffer + sizeof(DebugMsgInfo) - 1, rbuf, BufferLen);
  1210. DataLen = sizeof(DebugMsgInfo.DebugInfo) + BufferLen;
  1211. DebugMsgInfo.startSymbol[0] = TCP_START_SYM1;
  1212. DebugMsgInfo.startSymbol[1] = TCP_START_SYM2;
  1213. DebugMsgInfo.cmdSymbol = TCP_CMD_SYM;
  1214. DebugMsgInfo.ansSymbol = TCP_ANS_SYM;
  1215. memcpy(DebugMsgInfo.SN, TcpbattSN, BATT_SN_LEN);
  1216. DebugMsgInfo.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1217. DebugMsgInfo.dataLength[0] = (DataLen >> 8) & 0xFF;
  1218. DebugMsgInfo.dataLength[1] = DataLen & 0xFF;
  1219. DebugMsgInfo.DebugInfo.sendTimeUTC[0] = UTC8TimeTcp.year & 0xFF; // year
  1220. DebugMsgInfo.DebugInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1221. DebugMsgInfo.DebugInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1222. DebugMsgInfo.DebugInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1223. DebugMsgInfo.DebugInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1224. DebugMsgInfo.DebugInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1225. DebugMsgInfo.DebugInfo.msgMark = DebugMsg;
  1226. DebugMsgInfo.DebugInfo.DebugLen[0] = BufferLen >> 8;
  1227. DebugMsgInfo.DebugInfo.DebugLen[1] = BufferLen;
  1228. memcpy(SendBuffer, (UINT8 *)(&DebugMsgInfo), sizeof(DebugMsgInfo) - 1);
  1229. DebugMsgInfo._CRC = bcc_chk(SendBuffer, BufferLen + sizeof(DebugMsgInfo) - 1);
  1230. memcpy(SendBuffer + BufferLen + sizeof(DebugMsgInfo) - 1, &DebugMsgInfo._CRC, 1);
  1231. *PtrSendAddr = (uint32)SendBuffer;
  1232. }
  1233. static void tcpEncodeVerMsg(uint32* PtrSendAddr,uint16* SendLen)
  1234. {
  1235. uint8 *SendBuffer = NULL;
  1236. VersionMsgtoTcpType VerMsgToTcpInfo;
  1237. *SendLen = sizeof(VersionMsgtoTcpType);
  1238. SendBuffer = malloc(*SendLen);
  1239. uint16 DataLen = 0;
  1240. DataLen = (uint16)sizeof(VerInfoType);
  1241. VerMsgToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  1242. VerMsgToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  1243. VerMsgToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  1244. VerMsgToTcpInfo.ansSymbol = TCP_ANS_SYM;
  1245. memcpy(VerMsgToTcpInfo.SN, TcpbattSN, BATT_SN_LEN);
  1246. VerMsgToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1247. VerMsgToTcpInfo.dataLength[0] = (DataLen >> 8) & 0xFF;
  1248. VerMsgToTcpInfo.dataLength[1] = DataLen & 0xFF;
  1249. VerMsgToTcpInfo.VerInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1250. VerMsgToTcpInfo.VerInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1251. VerMsgToTcpInfo.VerInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1252. VerMsgToTcpInfo.VerInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1253. VerMsgToTcpInfo.VerInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1254. VerMsgToTcpInfo.VerInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1255. VerMsgToTcpInfo.VerInfo.msgMark = VerMsg;
  1256. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1257. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1258. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1259. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1260. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1261. VerMsgToTcpInfo.VerInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
  1262. VerMsgToTcpInfo.VerInfo.tcpProtocolVer[0] = (TCP_PROTOL_VER >> 8) & 0xFF;
  1263. VerMsgToTcpInfo.VerInfo.tcpProtocolVer[1] = TCP_PROTOL_VER&0xFF;
  1264. VerMsgToTcpInfo.VerInfo.deviceType = DEVICE_TYPE;
  1265. VerMsgToTcpInfo.VerInfo.deviceGenerationInfo = DEVICE_GENERATION;
  1266. memcpy(VerMsgToTcpInfo.VerInfo.ICCID, IccidNum, 20);
  1267. memcpy(VerMsgToTcpInfo.VerInfo.IMEI, ImeiNum, 15);
  1268. VerMsgToTcpInfo.VerInfo.deviceHwVersion[0] = (DEVICE_HW_VERSION >> 8) & 0xFF;
  1269. VerMsgToTcpInfo.VerInfo.deviceHwVersion[1] = (DEVICE_HW_VERSION)&0xFF;
  1270. VerMsgToTcpInfo.VerInfo.deviceKernelVersion[0] = DEVICE_KERNEL_VER >> 24;
  1271. VerMsgToTcpInfo.VerInfo.deviceKernelVersion[1] = DEVICE_KERNEL_VER >> 16;
  1272. VerMsgToTcpInfo.VerInfo.deviceKernelVersion[2] = DEVICE_KERNEL_VER >> 8;
  1273. VerMsgToTcpInfo.VerInfo.deviceKernelVersion[3] = DEVICE_KERNEL_VER;
  1274. VerMsgToTcpInfo.VerInfo.deviceDriverSWVersion[0] = DEVICE_DRIVER_SW_VER >> 24;
  1275. VerMsgToTcpInfo.VerInfo.deviceDriverSWVersion[1] = DEVICE_DRIVER_SW_VER >> 16;
  1276. VerMsgToTcpInfo.VerInfo.deviceDriverSWVersion[2] = DEVICE_DRIVER_SW_VER >> 8;
  1277. VerMsgToTcpInfo.VerInfo.deviceDriverSWVersion[3] = DEVICE_DRIVER_SW_VER;
  1278. VerMsgToTcpInfo.VerInfo.deviceAppSWVersion[0] = DEVICE_APP_SW_VER >> 24;
  1279. VerMsgToTcpInfo.VerInfo.deviceAppSWVersion[1] = DEVICE_APP_SW_VER >> 16;
  1280. VerMsgToTcpInfo.VerInfo.deviceAppSWVersion[2] = DEVICE_APP_SW_VER >> 8;
  1281. VerMsgToTcpInfo.VerInfo.deviceAppSWVersion[3] = DEVICE_APP_SW_VER;
  1282. memcpy((uint8*)(VerMsgToTcpInfo.VerInfo.BleMacAddr),BLEMAC,sizeof(BLEMAC));
  1283. memcpy((uint8*)(VerMsgToTcpInfo.VerInfo.deviceProduceDate),DEVICE_PRO_DATE,sizeof(DEVICE_PRO_DATE));
  1284. VerMsgToTcpInfo.CRC = bcc_chk((uint8 *)(&VerMsgToTcpInfo), sizeof(VerMsgToTcpInfo) - 1);
  1285. memcpy(SendBuffer, (uint8*)(&VerMsgToTcpInfo), sizeof(VersionMsgtoTcpType));
  1286. *PtrSendAddr = (uint32)SendBuffer;
  1287. }
  1288. static void tcpEncodeGPSMsg(uint32* PtrSendAddr,uint16* SendLen)
  1289. {
  1290. uint8 *SendBuffer = NULL;
  1291. GPSInfo GpsRecvData;
  1292. GPSMsgtoTcpType GpsToTcpInfo;
  1293. *SendLen = sizeof(GpsToTcpInfo);
  1294. SendBuffer = malloc(*SendLen);
  1295. uint16 tac = 0;
  1296. uint32 cellId = 0;
  1297. uint8 DataLen = (uint16)sizeof(GPSInfoType);
  1298. GpsToTcpInfo.startSymbol[0] = TCP_START_SYM1;
  1299. GpsToTcpInfo.startSymbol[1] = TCP_START_SYM2;
  1300. GpsToTcpInfo.cmdSymbol = TCP_CMD_SYM;
  1301. GpsToTcpInfo.ansSymbol = TCP_ANS_SYM;
  1302. memcpy(GpsToTcpInfo.SN, TcpbattSN, BATT_SN_LEN);
  1303. GpsToTcpInfo.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1304. GpsToTcpInfo.dataLength[0] = (DataLen >> 8) & 0xFF;
  1305. GpsToTcpInfo.dataLength[1] = DataLen & 0xFF;
  1306. GpsToTcpInfo.gpsInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1307. GpsToTcpInfo.gpsInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1308. GpsToTcpInfo.gpsInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1309. GpsToTcpInfo.gpsInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1310. GpsToTcpInfo.gpsInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1311. GpsToTcpInfo.gpsInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1312. GpsToTcpInfo.gpsInfo.msgMark = GPSMsg;
  1313. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1314. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1315. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1316. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1317. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1318. GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
  1319. if (xQueueReceive(GpsDataQueueHandle, &GpsRecvData, 0) == pdPASS)
  1320. {
  1321. memcpy((uint8 *)&GpsToTcpInfo.gpsInfo.GpsInfoData, (uint8 *)&GpsRecvData, sizeof(GPSInfo));
  1322. }
  1323. else
  1324. {
  1325. memset((uint8 *)&GpsToTcpInfo.gpsInfo.GpsInfoData, 0x00, sizeof(GPSInfo));
  1326. }
  1327. GpsToTcpInfo.gpsInfo.Tac[0] = tac >> 8;
  1328. GpsToTcpInfo.gpsInfo.Tac[1] = tac & 0xFF;
  1329. GpsToTcpInfo.gpsInfo.CellID[0] = cellId >> 24;
  1330. GpsToTcpInfo.gpsInfo.CellID[1] = cellId >> 16;
  1331. GpsToTcpInfo.gpsInfo.CellID[2] = cellId >> 8;
  1332. GpsToTcpInfo.gpsInfo.CellID[3] = cellId;
  1333. GpsToTcpInfo.CRC = bcc_chk((uint8 *)(&GpsToTcpInfo), sizeof(GPSMsgtoTcpType) - 1);
  1334. memcpy(SendBuffer, (uint8*)(&GpsToTcpInfo), sizeof(GpsToTcpInfo));
  1335. *PtrSendAddr = (uint32)SendBuffer;
  1336. }
  1337. static void tcpEncodeDeviceStMsg(uint32* PtrSendAddr,uint16* SendLen)
  1338. {
  1339. uint8 *SendBuffer = NULL;
  1340. DeviceStateMsgtoTcpType deviceStateMsg = {0x00};
  1341. *SendLen = sizeof(DeviceStateMsgtoTcpType);
  1342. SendBuffer = malloc(*SendLen);
  1343. uint16 DataLen = 0;
  1344. DataLen = (uint16)sizeof(DeviceStateInfoType);
  1345. deviceStateMsg.startSymbol[0] = TCP_START_SYM1;
  1346. deviceStateMsg.startSymbol[1] = TCP_START_SYM2;
  1347. deviceStateMsg.cmdSymbol = TCP_CMD_SYM;
  1348. deviceStateMsg.ansSymbol = TCP_ANS_SYM;
  1349. memcpy(deviceStateMsg.SN, TcpbattSN, BATT_SN_LEN);
  1350. deviceStateMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1351. deviceStateMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1352. deviceStateMsg.dataLength[1] = DataLen & 0xFF;
  1353. deviceStateMsg.DeviceState.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1354. deviceStateMsg.DeviceState.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1355. deviceStateMsg.DeviceState.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1356. deviceStateMsg.DeviceState.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1357. deviceStateMsg.DeviceState.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1358. deviceStateMsg.DeviceState.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1359. deviceStateMsg.DeviceState.msgMark = DeviceStateMsg;
  1360. deviceStateMsg.DeviceState.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1361. deviceStateMsg.DeviceState.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1362. deviceStateMsg.DeviceState.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1363. deviceStateMsg.DeviceState.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1364. deviceStateMsg.DeviceState.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1365. deviceStateMsg.DeviceState.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
  1366. uint8 CSQValue = 0;
  1367. GetCSQValue(&CSQValue);
  1368. deviceStateMsg.DeviceState.deviceErrorCode = 0x12;
  1369. deviceStateMsg.DeviceState.deviceTcpCSQValue = CSQValue;
  1370. deviceStateMsg.DeviceState.deviceLockBattState = 0x34;
  1371. deviceStateMsg.DeviceState.deviceBeepState = 1;
  1372. deviceStateMsg.DeviceState.deviceAuthState = 1;
  1373. deviceStateMsg.DeviceState.deviceInstallElevation = 0x23;
  1374. deviceStateMsg.DeviceState.deviceInstallRollAngle = 0x34;
  1375. uint16 xyzDatacache[3] = {0};
  1376. memcpy(xyzDatacache, xyzData, 3 * sizeof(uint16));
  1377. for (uint8 i = 0; i < 3; i++)
  1378. {
  1379. if (xyzDatacache[i] > 0x8000) // 鏁版嵁涓鸿礋
  1380. {
  1381. xyzDatacache[i] = 20000U + (sint16)xyzDatacache[i];
  1382. }
  1383. else
  1384. {
  1385. xyzDatacache[i] = xyzDatacache[i] + 20000U;
  1386. }
  1387. }
  1388. deviceStateMsg.DeviceState.deviceXAxisAccVal[0] = xyzDatacache[0] >> 8;
  1389. deviceStateMsg.DeviceState.deviceXAxisAccVal[1] = xyzDatacache[0];
  1390. deviceStateMsg.DeviceState.deviceYAxisAccVal[0] = xyzDatacache[1] >> 8;
  1391. deviceStateMsg.DeviceState.deviceYAxisAccVal[1] = xyzDatacache[1];
  1392. deviceStateMsg.DeviceState.deviceZAxisAccVal[0] = xyzDatacache[2] >> 8;
  1393. deviceStateMsg.DeviceState.deviceZAxisAccVal[1] = xyzDatacache[2];
  1394. memcpy(deviceStateMsg.DeviceState.deviceFFT_X_FreData, returnFreq[0], 5);
  1395. memcpy(deviceStateMsg.DeviceState.deviceFFT_X_AmpData, returnP[0], 5);
  1396. memcpy(deviceStateMsg.DeviceState.deviceFFT_Y_FreData, returnFreq[1], 5);
  1397. memcpy(deviceStateMsg.DeviceState.deviceFFT_Y_AmpData, returnP[1], 5);
  1398. memcpy(deviceStateMsg.DeviceState.deviceFFT_Z_FreData, returnFreq[2], 5);
  1399. memcpy(deviceStateMsg.DeviceState.deviceFFT_Z_AmpData, returnP[2], 5);
  1400. deviceStateMsg.DeviceState.deviceUpsSOC = 100;
  1401. deviceStateMsg.DeviceState.deviceUpsVolt[0] = 0x12;
  1402. deviceStateMsg.DeviceState.deviceUpsVolt[1] = 0x34;
  1403. deviceStateMsg.DeviceState.deviceUpsTemp = 0x40;
  1404. deviceStateMsg.DeviceState.deviceTempNum = 10; //闀垮害涓嶇‘瀹�
  1405. memset((uint8*)(deviceStateMsg.DeviceState.deviceTemp),0x65,deviceStateMsg.DeviceState.deviceTempNum);
  1406. deviceStateMsg.CRC = bcc_chk((uint8 *)(&deviceStateMsg), sizeof(DeviceStateMsgtoTcpType) - 1);
  1407. memcpy(SendBuffer, (uint8*)(&deviceStateMsg), sizeof(DeviceStateMsgtoTcpType));
  1408. *PtrSendAddr = (uint32)SendBuffer;
  1409. }
  1410. static void tcpBattStaticMsg(uint32* PtrSendAddr,uint16* SendLen)
  1411. {
  1412. uint8 *SendBuffer = NULL;
  1413. BattStaticMsgToTcpType battStaticMsg = {0x00};
  1414. *SendLen = sizeof(BattStaticMsgToTcpType);
  1415. SendBuffer = malloc(*SendLen);
  1416. uint16 DataLen = 0;
  1417. DataLen = (uint16)sizeof(BattStaticMsgType);
  1418. battStaticMsg.startSymbol[0] = TCP_START_SYM1;
  1419. battStaticMsg.startSymbol[1] = TCP_START_SYM2;
  1420. battStaticMsg.cmdSymbol = TCP_CMD_SYM;
  1421. battStaticMsg.ansSymbol = TCP_ANS_SYM;
  1422. memcpy(battStaticMsg.SN, TcpbattSN, BATT_SN_LEN);
  1423. battStaticMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1424. battStaticMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1425. battStaticMsg.dataLength[1] = DataLen & 0xFF;
  1426. battStaticMsg.battStaticInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1427. battStaticMsg.battStaticInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1428. battStaticMsg.battStaticInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1429. battStaticMsg.battStaticInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1430. battStaticMsg.battStaticInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1431. battStaticMsg.battStaticInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1432. battStaticMsg.battStaticInfo.msgMark = BattStaticMsg;
  1433. battStaticMsg.battStaticInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1434. battStaticMsg.battStaticInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1435. battStaticMsg.battStaticInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1436. battStaticMsg.battStaticInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1437. battStaticMsg.battStaticInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1438. battStaticMsg.battStaticInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
  1439. battStaticMsg.battStaticInfo.battCustomCode[0] = 0x31;
  1440. battStaticMsg.battStaticInfo.battCustomCode[1] = 0x32;
  1441. battStaticMsg.battStaticInfo.battPackManuCode[0] = 0x33;
  1442. battStaticMsg.battStaticInfo.battPackManuCode[1] = 0x34;
  1443. battStaticMsg.battStaticInfo.battCellManuCode[0] = 0x35;
  1444. battStaticMsg.battStaticInfo.battCellManuCode[1] = 0x36;
  1445. battStaticMsg.battStaticInfo.battCellTypeCode = 0;
  1446. battStaticMsg.battStaticInfo.battCellVoltNum[0] = 0;
  1447. battStaticMsg.battStaticInfo.battCellVoltNum[1] = 0;
  1448. battStaticMsg.battStaticInfo.battCellTempNum[0] = 0;
  1449. battStaticMsg.battStaticInfo.battCellTempNum[1] = 0;
  1450. battStaticMsg.battStaticInfo.battBMSSNLen = BMS_SN_LEN;
  1451. memset(battStaticMsg.battStaticInfo.battBMSSN,0x31,BMS_SN_LEN);
  1452. battStaticMsg.battStaticInfo.battRelatedCapacity[0] = 0x12;
  1453. battStaticMsg.battStaticInfo.battRelatedCapacity[1] = 0x34;
  1454. battStaticMsg.battStaticInfo.battRelatedEnergy[0] = 0x45;
  1455. battStaticMsg.battStaticInfo.battRelatedEnergy[1] = 0x56;
  1456. battStaticMsg.battStaticInfo.battRelatedVolt[0] = 0x67;
  1457. battStaticMsg.battStaticInfo.battRelatedVolt[1] = 0x78;
  1458. memcpy(battStaticMsg.battStaticInfo.battProduceDate,BATT_PRO_DATE,3);
  1459. battStaticMsg.battStaticInfo.battRelatedCellVolt[0] = 0x11;
  1460. battStaticMsg.battStaticInfo.battRelatedCellVolt[1] = 0x22;
  1461. battStaticMsg.battStaticInfo.battRelatedMaxCellVolt[0] = 0x33;
  1462. battStaticMsg.battStaticInfo.battRelatedMaxCellVolt[1] = 0x44;
  1463. battStaticMsg.battStaticInfo.battRelatedMinCellVolt[0] = 0x55;
  1464. battStaticMsg.battStaticInfo.battRelatedMinCellVolt[1] = 0x66;
  1465. battStaticMsg.battStaticInfo.battThermalManagType = 2;
  1466. battStaticMsg.battStaticInfo.battConstMaxchrgCurr[0] = 0x77;
  1467. battStaticMsg.battStaticInfo.battConstMaxchrgCurr[1] = 0x88;
  1468. battStaticMsg.battStaticInfo.battConstMaxDischrgCurr[0] = 0x99;
  1469. battStaticMsg.battStaticInfo.battConstMaxDischrgCurr[1] = 0xaa;
  1470. battStaticMsg.battStaticInfo.bmsHwVersion[0] = 1;
  1471. battStaticMsg.battStaticInfo.bmsHwVersion[1] = 2;
  1472. battStaticMsg.battStaticInfo.bmsHwVersion[2] = 3;
  1473. battStaticMsg.battStaticInfo.bmsHwVersion[3] = 1;
  1474. battStaticMsg.battStaticInfo.bmsSwVersion[0] = 2;
  1475. battStaticMsg.battStaticInfo.bmsSwVersion[1] = 0;
  1476. battStaticMsg.battStaticInfo.bmsSwVersion[2] = 0;
  1477. battStaticMsg.battStaticInfo.bmsSwVersion[3] = 3;
  1478. battStaticMsg.CRC = bcc_chk((uint8 *)(&battStaticMsg), sizeof(battStaticMsg) - 1);
  1479. memcpy(SendBuffer, (uint8*)(&battStaticMsg), sizeof(BattStaticMsgToTcpType));
  1480. *PtrSendAddr = (uint32)SendBuffer;
  1481. }
  1482. static void tcpBattDynamicMsg(uint32* PtrSendAddr,uint16* SendLen)
  1483. {
  1484. uint8 *SendBuffer = NULL;
  1485. BattDynamicMsgType1 battDynamicMsgType1 = {0x00};
  1486. BattDynamicMsgType2 battDynamicMsgType2 = {0x00};
  1487. BattDynamicMsgToTcpType battDynamicMsgType = {0x00};
  1488. getBattSysErrCodeFromCAN();
  1489. uint16 DataLen = 0;
  1490. DataLen = sizeof(BattDynamicMsgType1)
  1491. + (2 + BMS_CellTotal * 2)
  1492. + (1 + BATT_CHRG_TEMP_NUM)
  1493. + (1 + BATT_CONN_TEMP_NUM)
  1494. + (2 + BMS_TempTotal)
  1495. + (1 + OTHER_TEMP_NUM)
  1496. + sizeof(BattDynamicMsgType2)
  1497. + 1 + BATT_SYS_ERROR_NUM_BBox_To_TCP;
  1498. *SendLen = sizeof(BattDynamicMsgToTcpType) + DataLen + 1; //(+1 means crc)
  1499. SendBuffer = malloc(*SendLen);
  1500. battDynamicMsgType.startSymbol[0] = TCP_START_SYM1;
  1501. battDynamicMsgType.startSymbol[1] = TCP_START_SYM2;
  1502. battDynamicMsgType.cmdSymbol = TCP_CMD_SYM;
  1503. battDynamicMsgType.ansSymbol = TCP_ANS_SYM;
  1504. memcpy(battDynamicMsgType.SN, TcpbattSN, BATT_SN_LEN);
  1505. battDynamicMsgType.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1506. battDynamicMsgType.dataLength[0] = (DataLen >> 8) & 0xFF;
  1507. battDynamicMsgType.dataLength[1] = DataLen & 0xFF;
  1508. memcpy((SendBuffer + 0),&battDynamicMsgType,sizeof(BattDynamicMsgToTcpType)); //without crc
  1509. battDynamicMsgType1.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1510. battDynamicMsgType1.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1511. battDynamicMsgType1.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1512. battDynamicMsgType1.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1513. battDynamicMsgType1.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1514. battDynamicMsgType1.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1515. battDynamicMsgType1.msgMark = BattDynamicMsg;
  1516. battDynamicMsgType1.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1517. battDynamicMsgType1.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1518. battDynamicMsgType1.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1519. battDynamicMsgType1.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1520. battDynamicMsgType1.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1521. battDynamicMsgType1.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1522. battDynamicMsgType1.battBmsErrLv = 0x01;
  1523. battDynamicMsgType1.battBmsErrCode[0] = 0x02;
  1524. battDynamicMsgType1.battBmsErrCode[1] = 0x03;
  1525. battDynamicMsgType1.battPackCurr[0] = 0x04;
  1526. battDynamicMsgType1.battPackCurr[1] = 0x05;
  1527. battDynamicMsgType1.battLinkVolt[0] = 0x06;
  1528. battDynamicMsgType1.battLinkVolt[1] = 0x07;
  1529. battDynamicMsgType1.battPackVolt[0] = 0x08;
  1530. battDynamicMsgType1.battPackVolt[1] = 0x09;
  1531. battDynamicMsgType1.battWorkState = 0x0a;
  1532. battDynamicMsgType1.battRelayState[0] = 0x0b;
  1533. battDynamicMsgType1.battRelayState[1] = 0x0c;
  1534. battDynamicMsgType1.battRelayState[2] = 0x0d;
  1535. battDynamicMsgType1.battRelayState[3] = 0x0e;
  1536. battDynamicMsgType1.battHVState = 0x10;
  1537. battDynamicMsgType1.battChrgSt = 0x20;
  1538. battDynamicMsgType1.battChrgGunSt = 0x30;
  1539. battDynamicMsgType1.battChrgMode = 0x40;
  1540. battDynamicMsgType1.battBMSSOC = 0x50;
  1541. battDynamicMsgType1.battBMSSOH = 0x60;
  1542. battDynamicMsgType1.battBalanceSt = 0x70;
  1543. battDynamicMsgType1.battInsR[0] = 0x80;
  1544. battDynamicMsgType1.battInsR[1] = 0x90;
  1545. battDynamicMsgType1.battTMSSt = 0xa0;
  1546. battDynamicMsgType1.battTMSErrCode = 0xb0;
  1547. battDynamicMsgType1.battTMSReqPWR[0] = 0xc0;
  1548. battDynamicMsgType1.battTMSReqPWR[1] = 0xd0;
  1549. battDynamicMsgType1.battTMSOutletTemp = 0xe0;
  1550. battDynamicMsgType1.battTMSInjectTemp = 0xf0;
  1551. memset(battDynamicMsgType1.reverseVar,0x12,BATT_DYNAMIC_MSG_REVERS_BYTE);
  1552. battDynamicMsgType2.battMaxCellVolt[0] = 0x11;
  1553. battDynamicMsgType2.battMaxCellVolt[1] = 0x12;
  1554. battDynamicMsgType2.battMaxCellVolOrderNum[0] = 0x13;
  1555. battDynamicMsgType2.battMaxCellVolOrderNum[1] = 0x14;
  1556. battDynamicMsgType2.battMinCellVolt[0] = 0x15;
  1557. battDynamicMsgType2.battMinCellVolt[1] = 0x16;
  1558. battDynamicMsgType2.battMinCellVoltOrderNum[0] = 0x17;
  1559. battDynamicMsgType2.battMinCellVoltOrderNum[1] = 0x18;
  1560. battDynamicMsgType2.battMaxCellTemp = (BMS_MaxCellTemp)&0xFF;
  1561. battDynamicMsgType2.battMaxCellTempOrderNum[0] = (BMS_MaxCellTempNum>>8)&0xFF;
  1562. battDynamicMsgType2.battMaxCellTempOrderNum[1] = (BMS_MaxCellTempNum)&0xFF;
  1563. battDynamicMsgType2.battMinCellTemp = (BMS_MinCellTemp)&0xFF;
  1564. battDynamicMsgType2.battMinCellTempOrderNum[0] = (BMS_MinCellTempNum>>8)&0xFF;
  1565. battDynamicMsgType2.battMinCellTempOrderNum[1] = (BMS_MinCellTempNum)&0xFF;
  1566. battDynamicMsgType2.battMaxRechrgCurr[0] = 0x12;
  1567. battDynamicMsgType2.battMaxRechrgCurr[1] = 0x13;
  1568. battDynamicMsgType2.battMaxDischrgCurr[0] = 0x14;
  1569. battDynamicMsgType2.battMaxDischrgCurr[1] = 0x15;
  1570. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)),&battDynamicMsgType1,sizeof(BattDynamicMsgType1));
  1571. uint8 battCellVoltNum[2] = {0x00};
  1572. battCellVoltNum[0] = (BMS_CellTotal>>8)&0xFF;
  1573. battCellVoltNum[1] = BMS_CellTotal&0xFF;
  1574. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1575. + sizeof(BattDynamicMsgType1)), battCellVoltNum,2);
  1576. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1577. + sizeof(BattDynamicMsgType1)
  1578. + 2), BMS_CellVolt,BMS_CellTotal*2); //copy the cell vol info
  1579. uint8 battChrgTemp[BATT_CHRG_TEMP_NUM] = {0x30};
  1580. *(SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1581. + sizeof(BattDynamicMsgType1)
  1582. + (2 + BMS_CellTotal*2)) = BATT_CHRG_TEMP_NUM;
  1583. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1584. + sizeof(BattDynamicMsgType1)
  1585. + (2 + BMS_CellTotal*2)
  1586. + 1), battChrgTemp,BATT_CHRG_TEMP_NUM ); //copy the cell vol info
  1587. uint8 battConnTemp[BATT_CONN_TEMP_NUM] = {0x31};
  1588. memset(battConnTemp,0x31,BATT_CONN_TEMP_NUM); //tset data
  1589. *(SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1590. + sizeof(BattDynamicMsgType1)
  1591. + (2 + BMS_CellTotal*2)
  1592. + (1 + BATT_CHRG_TEMP_NUM)) = BATT_CONN_TEMP_NUM;
  1593. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1594. + sizeof(BattDynamicMsgType1)
  1595. + (2 + BMS_CellTotal*2)
  1596. + (1 + BATT_CHRG_TEMP_NUM)
  1597. + (1)), battConnTemp, BATT_CONN_TEMP_NUM ); //copy the batt connector temp info
  1598. uint8 battCellTempNum[2] = {0x00};
  1599. battCellTempNum[0] = (BMS_TempTotal>>8)&0xFF;
  1600. battCellTempNum[1] = BMS_TempTotal&0xFF;
  1601. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1602. + sizeof(BattDynamicMsgType1)
  1603. + (2 + BMS_CellTotal*2)
  1604. + (1 + BATT_CHRG_TEMP_NUM)
  1605. + (1 + BATT_CONN_TEMP_NUM)),battCellTempNum,2);
  1606. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1607. + sizeof(BattDynamicMsgType1)
  1608. + (2 + BMS_CellTotal*2)
  1609. + (1 + BATT_CHRG_TEMP_NUM)
  1610. + (1 + BATT_CONN_TEMP_NUM)
  1611. + (2)), BMS_CellTemp,BMS_TempTotal); //copy the cell temp info
  1612. uint8 otherTemp[OTHER_TEMP_NUM] = {0x32};
  1613. memset(otherTemp,0x32,OTHER_TEMP_NUM); //tset data
  1614. *(SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1615. + sizeof(BattDynamicMsgType1)
  1616. + (2 + BMS_CellTotal*2)
  1617. + (1+ BATT_CHRG_TEMP_NUM)
  1618. + (1 + BATT_CONN_TEMP_NUM)
  1619. + (2 + BMS_TempTotal)) = OTHER_TEMP_NUM;
  1620. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1621. + sizeof(BattDynamicMsgType1)
  1622. + (2 + BMS_CellTotal*2)
  1623. + (1 + BATT_CHRG_TEMP_NUM)
  1624. + (1 + BATT_CONN_TEMP_NUM)
  1625. + (2 + BMS_TempTotal)
  1626. + (1)),otherTemp, OTHER_TEMP_NUM); //copy the other temp info
  1627. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1628. + sizeof(BattDynamicMsgType1)
  1629. + (2 + BMS_CellTotal*2)
  1630. + (1 + BATT_CHRG_TEMP_NUM)
  1631. + (1 + BATT_CONN_TEMP_NUM)
  1632. + (2 + BMS_TempTotal)
  1633. + (1 + OTHER_TEMP_NUM)),(uint8*)(&battDynamicMsgType2),sizeof(BattDynamicMsgType2)); //copy the dynamic msg2 info
  1634. *(SendBuffer + sizeof(BattDynamicMsgToTcpType)// copy the system error code info
  1635. + sizeof(BattDynamicMsgType1)
  1636. + (2 + BMS_CellTotal*2)
  1637. + (1 + BATT_CHRG_TEMP_NUM)
  1638. + (1 + BATT_CONN_TEMP_NUM)
  1639. + (2 + BMS_TempTotal)
  1640. + (1 + OTHER_TEMP_NUM)
  1641. + sizeof(BattDynamicMsgType2)
  1642. + 1) = BATT_SYS_ERROR_NUM_BBox_To_TCP&0xFF;
  1643. if(BATT_SYS_ERROR_NUM_BBox_To_TCP != 0 && BATT_SYS_ERROR_CODE_ARRAY_BBox_To_TCP != NULL)
  1644. {
  1645. memcpy((SendBuffer + sizeof(BattDynamicMsgToTcpType)
  1646. + sizeof(BattDynamicMsgType1)
  1647. + (2 + BMS_CellTotal*2)
  1648. + (1 + BATT_CHRG_TEMP_NUM)
  1649. + (1 + BATT_CONN_TEMP_NUM)
  1650. + (2 + BMS_TempTotal)
  1651. + (1 + OTHER_TEMP_NUM)
  1652. + 1),BATT_SYS_ERROR_CODE_ARRAY_BBox_To_TCP, BATT_SYS_ERROR_NUM_BBox_To_TCP);
  1653. vPortFree((BATT_SYS_ERROR_CODE_ARRAY_BBox_To_TCP));
  1654. }
  1655. *(SendBuffer+ (*SendLen - 1)) = bcc_chk(SendBuffer, (*SendLen - 1));
  1656. *PtrSendAddr = (uint32)SendBuffer;
  1657. }
  1658. static void tcpTruckVehiMsg(uint32* PtrSendAddr,uint16* SendLen)
  1659. {
  1660. uint8 *SendBuffer = NULL;
  1661. TruckVehiMsgToTcpType truckVehiMsgToTcpMsg = {0x00};
  1662. // TruckVehiMsgType1 truckVehiMsgType1 = {0x00};
  1663. uint16 DataLen = 0;
  1664. DataLen = sizeof(TruckVehiMsgType1);
  1665. // + (1 + BATT_CONN_TEMP_NUM)
  1666. // + (1 + BATT_BSC_LOCK_NUM)
  1667. // + 1
  1668. // + 2;
  1669. *SendLen = sizeof(TruckVehiMsgToTcpType);// + DataLen + 1; //(+1 means crc)
  1670. SendBuffer = malloc(*SendLen);
  1671. truckVehiMsgToTcpMsg.startSymbol[0] = TCP_START_SYM1;
  1672. truckVehiMsgToTcpMsg.startSymbol[1] = TCP_START_SYM2;
  1673. truckVehiMsgToTcpMsg.cmdSymbol = TCP_CMD_SYM;
  1674. truckVehiMsgToTcpMsg.ansSymbol = TCP_ANS_SYM;
  1675. memcpy(truckVehiMsgToTcpMsg.SN, TcpbattSN, BATT_SN_LEN);
  1676. truckVehiMsgToTcpMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1677. truckVehiMsgToTcpMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1678. truckVehiMsgToTcpMsg.dataLength[1] = DataLen & 0xFF;
  1679. // memcpy((SendBuffer + 0),&truckVehiMsgToTcpMsg,sizeof(TruckVehiMsgToTcpType)); //without crc
  1680. truckVehiMsgToTcpMsg.truckVehiInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1681. truckVehiMsgToTcpMsg.truckVehiInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1682. truckVehiMsgToTcpMsg.truckVehiInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1683. truckVehiMsgToTcpMsg.truckVehiInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1684. truckVehiMsgToTcpMsg.truckVehiInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1685. truckVehiMsgToTcpMsg.truckVehiInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1686. truckVehiMsgToTcpMsg.truckVehiInfo.msgMark = TruckVehiMsg;
  1687. truckVehiMsgToTcpMsg.truckVehiInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1688. truckVehiMsgToTcpMsg.truckVehiInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1689. truckVehiMsgToTcpMsg.truckVehiInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1690. truckVehiMsgToTcpMsg.truckVehiInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1691. truckVehiMsgToTcpMsg.truckVehiInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1692. truckVehiMsgToTcpMsg.truckVehiInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1693. memcpy(truckVehiMsgToTcpMsg.truckVehiInfo.VIN,VIN,17);
  1694. truckVehiMsgToTcpMsg.truckVehiInfo.vehiSpeed[0] = 0x12;
  1695. truckVehiMsgToTcpMsg.truckVehiInfo.vehiSpeed[1] = 0x34;
  1696. truckVehiMsgToTcpMsg.truckVehiInfo.vehiErrCode[0] = 0x56;
  1697. truckVehiMsgToTcpMsg.truckVehiInfo.vehiErrCode[1] = 0x78;
  1698. truckVehiMsgToTcpMsg.truckVehiInfo.bscSystemErrCode = 0x9a;
  1699. truckVehiMsgToTcpMsg.truckVehiInfo.vehiSt = 0x01;
  1700. truckVehiMsgToTcpMsg.truckVehiInfo.bmsHvReq = 0x02;
  1701. truckVehiMsgToTcpMsg.truckVehiInfo.vehiCurrGearSt = 0x03;
  1702. truckVehiMsgToTcpMsg.truckVehiInfo.vehiBreakSt = 0x04;
  1703. memset(truckVehiMsgToTcpMsg.truckVehiInfo.vehilRelaySt,0x23,10); //tset data
  1704. truckVehiMsgToTcpMsg.truckVehiInfo.bscSt = 0x05;
  1705. truckVehiMsgToTcpMsg.truckVehiInfo.battBSCConTempNum = BATT_CONN_TEMP_NUM;
  1706. memset(truckVehiMsgToTcpMsg.truckVehiInfo.battBSCConTemp,0x22,BATT_CONN_TEMP_NUM);
  1707. truckVehiMsgToTcpMsg.truckVehiInfo.battBSCLockNum = BATT_BSC_LOCK_NUM;
  1708. memset(truckVehiMsgToTcpMsg.truckVehiInfo.battBSCLockSt,0x32,BATT_BSC_LOCK_NUM);
  1709. truckVehiMsgToTcpMsg.truckVehiInfo.bscConnType = 0x05;
  1710. truckVehiMsgToTcpMsg.truckVehiInfo.bscConnSt = 0x06;
  1711. truckVehiMsgToTcpMsg.truckVehiInfo.bscChangeCount[0] = 0x07;
  1712. truckVehiMsgToTcpMsg.truckVehiInfo.bscChangeCount[1] = 0x08;
  1713. truckVehiMsgToTcpMsg.CRC = bcc_chk((uint8*)(&truckVehiMsgToTcpMsg), (*SendLen - 1));
  1714. memcpy(SendBuffer,(uint8*)(&truckVehiMsgToTcpMsg),(*SendLen));
  1715. *PtrSendAddr = (uint32)SendBuffer;
  1716. }
  1717. static void tcpEngyStoreSysMsg(uint32* PtrSendAddr,uint16* SendLen)
  1718. {
  1719. uint8 *SendBuffer = NULL;
  1720. EngyStoreSysMsgToTcpType engyStoreSysMsgToTcpMsg = {0x00};
  1721. uint16 DataLen = 0;
  1722. *SendLen = sizeof(EngyStoreSysMsgToTcpType); //(+1 means crc)
  1723. SendBuffer = malloc(*SendLen);
  1724. DataLen = sizeof(EngyStoreSysMsgType);
  1725. engyStoreSysMsgToTcpMsg.startSymbol[0] = TCP_START_SYM1;
  1726. engyStoreSysMsgToTcpMsg.startSymbol[1] = TCP_START_SYM2;
  1727. engyStoreSysMsgToTcpMsg.cmdSymbol = TCP_CMD_SYM;
  1728. engyStoreSysMsgToTcpMsg.ansSymbol = TCP_ANS_SYM;
  1729. memcpy(engyStoreSysMsgToTcpMsg.SN, TcpbattSN, BATT_SN_LEN);
  1730. engyStoreSysMsgToTcpMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1731. engyStoreSysMsgToTcpMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1732. engyStoreSysMsgToTcpMsg.dataLength[1] = DataLen & 0xFF;
  1733. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1734. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1735. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1736. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1737. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1738. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1739. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgMark = EngyStoreSysMsg;
  1740. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1741. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1742. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1743. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1744. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1745. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1746. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.inverterSt = 0x02;
  1747. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.battRelaySt = 0x04;
  1748. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.battTMSFanSt = 0x05;
  1749. engyStoreSysMsgToTcpMsg.energyStoreSysInfo.battTMSHeaterRelaySt = 0x06;
  1750. engyStoreSysMsgToTcpMsg.CRC = bcc_chk((uint8*)(&engyStoreSysMsgToTcpMsg), (*SendLen - 1));
  1751. memcpy(SendBuffer,(uint8*)(&engyStoreSysMsgToTcpMsg),(*SendLen));
  1752. *PtrSendAddr = (uint32)SendBuffer;
  1753. }
  1754. static void tcpBattAccInfoMsg(uint32* PtrSendAddr,uint16* SendLen)
  1755. {
  1756. uint8 *SendBuffer = NULL;
  1757. AccInfoToTcpType accInfoToTcpType = {0x00};
  1758. uint16 DataLen = 0;
  1759. *SendLen = sizeof(AccInfoToTcpType); //(+1 means crc)
  1760. SendBuffer = malloc(*SendLen);
  1761. DataLen = sizeof(AccInfoType);
  1762. accInfoToTcpType.startSymbol[0] = TCP_START_SYM1;
  1763. accInfoToTcpType.startSymbol[1] = TCP_START_SYM2;
  1764. accInfoToTcpType.cmdSymbol = TCP_CMD_SYM;
  1765. accInfoToTcpType.ansSymbol = TCP_ANS_SYM;
  1766. memcpy(accInfoToTcpType.SN, TcpbattSN, BATT_SN_LEN);
  1767. accInfoToTcpType.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1768. accInfoToTcpType.dataLength[0] = (DataLen >> 8) & 0xFF;
  1769. accInfoToTcpType.dataLength[1] = DataLen & 0xFF;
  1770. accInfoToTcpType.AccInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1771. accInfoToTcpType.AccInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1772. accInfoToTcpType.AccInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1773. accInfoToTcpType.AccInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1774. accInfoToTcpType.AccInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1775. accInfoToTcpType.AccInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1776. accInfoToTcpType.AccInfo.msgMark = BattAccuMsg;
  1777. accInfoToTcpType.AccInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1778. accInfoToTcpType.AccInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1779. accInfoToTcpType.AccInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1780. accInfoToTcpType.AccInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1781. accInfoToTcpType.AccInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1782. accInfoToTcpType.AccInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1783. accInfoToTcpType.AccInfo.accOnlineDays[0] = 0x00;
  1784. accInfoToTcpType.AccInfo.accOnlineDays[1] = 0x00;
  1785. accInfoToTcpType.AccInfo.vehiODO[0] = 0x27;
  1786. accInfoToTcpType.AccInfo.vehiODO[1] = 0x10;
  1787. accInfoToTcpType.AccInfo.vehiODO[2] = 0x28;
  1788. accInfoToTcpType.AccInfo.vehiODO[3] = 0x11;
  1789. accInfoToTcpType.AccInfo.accBattCycTimes[0] = 0x12;
  1790. accInfoToTcpType.AccInfo.accBattCycTimes[1] = 0x34;
  1791. accInfoToTcpType.AccInfo.accOverChrgTimes[0] = 0x45;
  1792. accInfoToTcpType.AccInfo.accOverChrgTimes[1] = 0x56;
  1793. accInfoToTcpType.AccInfo.accOverDischrgTimes[0] = 0x13;
  1794. accInfoToTcpType.AccInfo.accOverDischrgTimes[1] = 0x35;
  1795. accInfoToTcpType.AccInfo.accChrgTimes[0] = 0x01;
  1796. accInfoToTcpType.AccInfo.accChrgTimes[1] = 0x02;
  1797. accInfoToTcpType.AccInfo.accDischrgTimes[0] = 0x33;
  1798. accInfoToTcpType.AccInfo.accDischrgTimes[1] = 0x44;
  1799. accInfoToTcpType.AccInfo.bmsTotalChrgCapy[0] = 0x55;
  1800. accInfoToTcpType.AccInfo.bmsTotalChrgCapy[1] = 0x66;
  1801. accInfoToTcpType.AccInfo.bmsTotalChrgCapy[2] = 0x77;
  1802. accInfoToTcpType.AccInfo.bmsTotalChrgCapy[3] = 0x88;
  1803. accInfoToTcpType.AccInfo.bmsTotalChrgEngy[0] = 0x99;
  1804. accInfoToTcpType.AccInfo.bmsTotalChrgEngy[1] = 0xaa;
  1805. accInfoToTcpType.AccInfo.bmsTotalChrgEngy[2] = 0xbb;
  1806. accInfoToTcpType.AccInfo.bmsTotalChrgEngy[3] = 0xcc;
  1807. accInfoToTcpType.AccInfo.bmsTotalDischrgCapy[0] = 0xdd;
  1808. accInfoToTcpType.AccInfo.bmsTotalDischrgCapy[1] = 0xee;
  1809. accInfoToTcpType.AccInfo.bmsTotalDischrgCapy[2] = 0xff;
  1810. accInfoToTcpType.AccInfo.bmsTotalDischrgCapy[3] = 0x01;
  1811. accInfoToTcpType.AccInfo.bmsTotalDischrgEngy[0] = 0x02;
  1812. accInfoToTcpType.AccInfo.bmsTotalDischrgEngy[1] = 0x03;
  1813. accInfoToTcpType.AccInfo.bmsTotalDischrgEngy[2] = 0x04;
  1814. accInfoToTcpType.AccInfo.bmsTotalDischrgEngy[3] = 0x05;
  1815. accInfoToTcpType.AccInfo.bmsTotalStaCharCapy[0] = 0x01;
  1816. accInfoToTcpType.AccInfo.bmsTotalStaCharCapy[1] = 0x03;
  1817. accInfoToTcpType.AccInfo.bmsTotalStaCharCapy[2] = 0x04;
  1818. accInfoToTcpType.AccInfo.bmsTotalStaCharCapy[3] = 0x06;
  1819. accInfoToTcpType.AccInfo.bmsTotalStaCharEngy[0] = 0x02;
  1820. accInfoToTcpType.AccInfo.bmsTotalStaCharEngy[1] = 0x04;
  1821. accInfoToTcpType.AccInfo.bmsTotalStaCharEngy[2] = 0x06;
  1822. accInfoToTcpType.AccInfo.bmsTotalStaCharEngy[3] = 0x08;
  1823. accInfoToTcpType.AccInfo.bmsTotalBackCharCapy[0] = 0x09;
  1824. accInfoToTcpType.AccInfo.bmsTotalBackCharCapy[1] = 0x0a;
  1825. accInfoToTcpType.AccInfo.bmsTotalBackCharCapy[2] = 0x0b;
  1826. accInfoToTcpType.AccInfo.bmsTotalBackCharCapy[3] = 0x0c;
  1827. accInfoToTcpType.AccInfo.bmsTotalBackCharEngy[0] = 0x0d;
  1828. accInfoToTcpType.AccInfo.bmsTotalBackCharEngy[1] = 0x0e;
  1829. accInfoToTcpType.AccInfo.bmsTotalBackCharEngy[2] = 0x0f;
  1830. accInfoToTcpType.AccInfo.bmsTotalBackCharEngy[3] = 0x11;
  1831. accInfoToTcpType.AccInfo.bmsTotalGunCharCapy[0] = 0x12;
  1832. accInfoToTcpType.AccInfo.bmsTotalGunCharCapy[1] = 0x13;
  1833. accInfoToTcpType.AccInfo.bmsTotalGunCharCapy[2] = 0x14;
  1834. accInfoToTcpType.AccInfo.bmsTotalGunCharCapy[3] = 0x15;
  1835. accInfoToTcpType.AccInfo.bmsTotalGunCharEngy[0] = 0x16;
  1836. accInfoToTcpType.AccInfo.bmsTotalGunCharEngy[1] = 0x17;
  1837. accInfoToTcpType.AccInfo.bmsTotalGunCharEngy[2] = 0x18;
  1838. accInfoToTcpType.AccInfo.bmsTotalGunCharEngy[3] = 0x19;
  1839. accInfoToTcpType.CRC = bcc_chk((uint8*)(&accInfoToTcpType), (*SendLen - 1));
  1840. memcpy(SendBuffer,(uint8*)(&accInfoToTcpType),sizeof(AccInfoToTcpType));
  1841. *PtrSendAddr = (uint32)SendBuffer;
  1842. }
  1843. static void tcpBattSceneInfoMsg(uint32* PtrSendAddr,uint16* SendLen)
  1844. {
  1845. uint8 *SendBuffer = NULL;
  1846. BattSceneMsgtoTcpType battSceneMsgtoTcpMsg = {0x00};
  1847. uint16 DataLen = 0;
  1848. *SendLen = sizeof(BattSceneMsgtoTcpType);
  1849. SendBuffer = malloc(*SendLen);
  1850. DataLen = sizeof(BattSceneInfoType);
  1851. battSceneMsgtoTcpMsg.startSymbol[0] = TCP_START_SYM1;
  1852. battSceneMsgtoTcpMsg.startSymbol[1] = TCP_START_SYM2;
  1853. battSceneMsgtoTcpMsg.cmdSymbol = TCP_CMD_SYM;
  1854. battSceneMsgtoTcpMsg.ansSymbol = TCP_ANS_SYM;
  1855. memcpy(battSceneMsgtoTcpMsg.SN, TcpbattSN, BATT_SN_LEN);
  1856. battSceneMsgtoTcpMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1857. battSceneMsgtoTcpMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1858. battSceneMsgtoTcpMsg.dataLength[1] = DataLen & 0xFF;
  1859. battSceneMsgtoTcpMsg.battSceneInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1860. battSceneMsgtoTcpMsg.battSceneInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1861. battSceneMsgtoTcpMsg.battSceneInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1862. battSceneMsgtoTcpMsg.battSceneInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1863. battSceneMsgtoTcpMsg.battSceneInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1864. battSceneMsgtoTcpMsg.battSceneInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1865. battSceneMsgtoTcpMsg.battSceneInfo.msgMark = BattSceneMsg;
  1866. battSceneMsgtoTcpMsg.battSceneInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1867. battSceneMsgtoTcpMsg.battSceneInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1868. battSceneMsgtoTcpMsg.battSceneInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1869. battSceneMsgtoTcpMsg.battSceneInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1870. battSceneMsgtoTcpMsg.battSceneInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1871. battSceneMsgtoTcpMsg.battSceneInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1872. battSceneMsgtoTcpMsg.battSceneInfo.sceneType = 0x01;
  1873. battSceneMsgtoTcpMsg.battSceneInfo.sceneSt = 0x02;
  1874. memset(battSceneMsgtoTcpMsg.battSceneInfo.sceneStartDate,0x12,6); //tset data
  1875. memset(battSceneMsgtoTcpMsg.battSceneInfo.sceneAvalibleTime,0x13,2); //tset data
  1876. memset(battSceneMsgtoTcpMsg.battSceneInfo.sceneDeadTime,0x14,2); //tset data
  1877. battSceneMsgtoTcpMsg.CRC = bcc_chk((uint8*)(&battSceneMsgtoTcpMsg), (*SendLen - 1));
  1878. memcpy(SendBuffer,(uint8*)(&battSceneMsgtoTcpMsg),sizeof(BattSceneMsgtoTcpType));
  1879. *PtrSendAddr = (uint32)SendBuffer;
  1880. }
  1881. static void tcpBattHighFeqInfoMsg(uint32* PtrSendAddr,uint16* SendLen)
  1882. {
  1883. uint8 *SendBuffer = NULL;
  1884. BattHighFeqMsgtoTcpType battHighFeqMsgtoTcpMsg = {0x00};
  1885. uint16 DataLen = 0;
  1886. *SendLen = sizeof(BattHighFeqMsgtoTcpType);
  1887. SendBuffer = malloc(*SendLen);
  1888. DataLen = sizeof(BattHighFeqInfoType);
  1889. battHighFeqMsgtoTcpMsg.startSymbol[0] = TCP_START_SYM1;
  1890. battHighFeqMsgtoTcpMsg.startSymbol[1] = TCP_START_SYM2;
  1891. battHighFeqMsgtoTcpMsg.cmdSymbol = TCP_CMD_SYM;
  1892. battHighFeqMsgtoTcpMsg.ansSymbol = TCP_ANS_SYM;
  1893. memcpy(battHighFeqMsgtoTcpMsg.SN, TcpbattSN, BATT_SN_LEN);
  1894. battHighFeqMsgtoTcpMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1895. battHighFeqMsgtoTcpMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1896. battHighFeqMsgtoTcpMsg.dataLength[1] = DataLen & 0xFF;
  1897. battHighFeqMsgtoTcpMsg.battHighFeqInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1898. battHighFeqMsgtoTcpMsg.battHighFeqInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1899. battHighFeqMsgtoTcpMsg.battHighFeqInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1900. battHighFeqMsgtoTcpMsg.battHighFeqInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1901. battHighFeqMsgtoTcpMsg.battHighFeqInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1902. battHighFeqMsgtoTcpMsg.battHighFeqInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1903. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgMark = BattHighFeqMsg;
  1904. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1905. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1906. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1907. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1908. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1909. battHighFeqMsgtoTcpMsg.battHighFeqInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1910. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battPackVolt[0] = 0x01;
  1911. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battPackVolt[1] = 0x02;
  1912. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battPackCurr[0] = 0x27;
  1913. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battPackCurr[1] = 0x10;
  1914. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMaxCellVolt[0] = 0x03;
  1915. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMaxCellVolt[1] = 0x04;
  1916. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMinCellVolt[0] = 0x05;
  1917. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMinCellVolt[1] = 0x06;
  1918. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMaxCellTemp[0] = 0x07;
  1919. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMaxCellTemp[1] = 0x08;
  1920. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMinCellTemp[0] = 0x09;
  1921. battHighFeqMsgtoTcpMsg.battHighFeqInfo.battMinCellTemp[1] = 0x09;
  1922. battHighFeqMsgtoTcpMsg.CRC = bcc_chk((uint8*)(&battHighFeqMsgtoTcpMsg), (*SendLen - 1));
  1923. memcpy(SendBuffer,(uint8*)(&battHighFeqMsgtoTcpMsg),sizeof(BattHighFeqMsgtoTcpType));
  1924. *PtrSendAddr = (uint32)SendBuffer;
  1925. }
  1926. static void tcpBattAlgthInfoMsg(uint32* PtrSendAddr,uint16* SendLen)
  1927. {
  1928. uint8 *SendBuffer = NULL;
  1929. BattAlgthMsgtoTcpType battAlgthMsgtoTcpMsg = {0x00};
  1930. uint16 DataLen = 0;
  1931. *SendLen = sizeof(BattAlgthMsgtoTcpType);
  1932. SendBuffer = malloc(*SendLen);
  1933. DataLen = sizeof(BattAlgthInfoType);
  1934. battAlgthMsgtoTcpMsg.startSymbol[0] = TCP_START_SYM1;
  1935. battAlgthMsgtoTcpMsg.startSymbol[1] = TCP_START_SYM2;
  1936. battAlgthMsgtoTcpMsg.cmdSymbol = TCP_CMD_SYM;
  1937. battAlgthMsgtoTcpMsg.ansSymbol = TCP_ANS_SYM;
  1938. memcpy(battAlgthMsgtoTcpMsg.SN, TcpbattSN, BATT_SN_LEN);
  1939. battAlgthMsgtoTcpMsg.encryptMethod = TCP_ENCPT_DISABLE; // not encrypt
  1940. battAlgthMsgtoTcpMsg.dataLength[0] = (DataLen >> 8) & 0xFF;
  1941. battAlgthMsgtoTcpMsg.dataLength[1] = DataLen & 0xFF;
  1942. battAlgthMsgtoTcpMsg.battAlgthInfo.sendTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1943. battAlgthMsgtoTcpMsg.battAlgthInfo.sendTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1944. battAlgthMsgtoTcpMsg.battAlgthInfo.sendTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1945. battAlgthMsgtoTcpMsg.battAlgthInfo.sendTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1946. battAlgthMsgtoTcpMsg.battAlgthInfo.sendTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1947. battAlgthMsgtoTcpMsg.battAlgthInfo.sendTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1948. battAlgthMsgtoTcpMsg.battAlgthInfo.msgMark = BattAlgthMsg;
  1949. battAlgthMsgtoTcpMsg.battAlgthInfo.msgCollectionTimeUTC[0] = (UTC8TimeTcp.year) & 0xFF; // year
  1950. battAlgthMsgtoTcpMsg.battAlgthInfo.msgCollectionTimeUTC[1] = UTC8TimeTcp.month & 0xFF; // month
  1951. battAlgthMsgtoTcpMsg.battAlgthInfo.msgCollectionTimeUTC[2] = UTC8TimeTcp.day & 0xFF; // day
  1952. battAlgthMsgtoTcpMsg.battAlgthInfo.msgCollectionTimeUTC[3] = UTC8TimeTcp.hour & 0xFF; // hour
  1953. battAlgthMsgtoTcpMsg.battAlgthInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF; // mins
  1954. battAlgthMsgtoTcpMsg.battAlgthInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF; // sec
  1955. battAlgthMsgtoTcpMsg.battAlgthInfo.bmsPackSOC = 0x10;
  1956. battAlgthMsgtoTcpMsg.battAlgthInfo.bmsPackSOH = 0x20;
  1957. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalSOC = 0x27;
  1958. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalSOH = 0x10;
  1959. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgCapy[0] = 0x30;
  1960. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgCapy[1] = 0x40;
  1961. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgCapy[2] = 0x50;
  1962. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgCapy[3] = 0x60;
  1963. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgCapy[0] = 0x70;
  1964. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgCapy[1] = 0x80;
  1965. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgCapy[2] = 0x90;
  1966. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgCapy[3] = 0xa0;
  1967. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgCapy[0] = 0x0b;
  1968. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgCapy[1] = 0x0c;
  1969. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgCapy[2] = 0x0d;
  1970. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgCapy[3] = 0x0e;
  1971. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgEngy[0] = 0x01;
  1972. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgEngy[1] = 0x02;
  1973. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgEngy[2] = 0x03;
  1974. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalDischrgEngy[3] = 0x04;
  1975. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgEngy[0] = 0x05;
  1976. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgEngy[1] = 0x06;
  1977. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgEngy[2] = 0x07;
  1978. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalBackchrgEngy[3] = 0x08;
  1979. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgEngy[0] = 0x09;
  1980. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgEngy[1] = 0x0a;
  1981. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgEngy[2] = 0x0b;
  1982. battAlgthMsgtoTcpMsg.battAlgthInfo.bboxCalTotalChrgEngy[3] = 0x0c;
  1983. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MAX[0] = 0x11;
  1984. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MAX[1] = 0x22;
  1985. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MAX[2] = 0x33;
  1986. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MAX[3] = 0x44;
  1987. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MIN[0] = 0x55;
  1988. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MIN[1] = 0x66;
  1989. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MIN[2] = 0x77;
  1990. battAlgthMsgtoTcpMsg.battAlgthInfo.BBox_Dq_Dv_MIN[3] = 0x88;
  1991. battAlgthMsgtoTcpMsg.CRC = bcc_chk((uint8*)(&battAlgthMsgtoTcpMsg), (*SendLen - 1));
  1992. memcpy(SendBuffer,(uint8*)(&battAlgthMsgtoTcpMsg),sizeof(BattAlgthMsgtoTcpType));
  1993. *PtrSendAddr = (uint32)SendBuffer;
  1994. }
  1995. static void tcpUdsCmdNegAnsMsg(uint32* PtrSendAddr,uint16* SendLen)
  1996. {
  1997. }
  1998. static void tcpUdsCmdPosAnsMsg(uint32* PtrSendAddr,uint16* SendLen)
  1999. {
  2000. }
  2001. #endif