tt808.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. #include "tt808.h"
  2. #include "usart.h"
  3. #include <stdint.h>
  4. #include "rtc.h"
  5. #include <stdlib.h>
  6. //BYTE uint8_t
  7. //WORD uint16_t
  8. //DWORD uint32_t
  9. TT808 tt808;
  10. TCPCenterD tcpd;
  11. TCPClientD tcpc;
  12. bool XTflag = false;
  13. RTC_DateTypeDef GetData; //获取日期结构体
  14. RTC_TimeTypeDef GetTime; //获取时间结构体
  15. void newpacket(uint8_t *head,uint8_t *body,uint8_t outarr[]);
  16. void packageData(uint8_t flag, uint8_t *head, uint8_t *body, size_t bodylength, uint8_t *escaped_data, size_t *new_length);
  17. void tt808test(uint8_t* Bodyxxt, size_t bodylength, uint8_t XXLSH);
  18. // 发送一包内容为0x30 0x7e 0x08 0x7d 0x55的数据包,则经过封装如下:0x7e 0x30 0x7d 0x02 0x08 0x7d 0x01 0x55 0x7e
  19. extern RTC_HandleTypeDef hrtc;
  20. extern Time time;
  21. void RTCtime(void)
  22. {
  23. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
  24. /* Get the RTC current Date */
  25. HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
  26. time.tt[0] = GetData.Year;
  27. time.tt[1] = GetData.Month;
  28. time.tt[2] = GetData.Date;
  29. time.tt[3] = GetTime.Hours;
  30. time.tt[4] = GetTime.Minutes;
  31. time.tt[5] = GetTime.Seconds;
  32. }
  33. /**消息结构
  34. * 标识位 消息头 消息体 校验码 标识位
  35. * 0x7e 11BYTE MORE 1BYTE 0x7e
  36. *
  37. */
  38. /**消息头
  39. *
  40. * 消息ID(WORD) 消息体属性(WORD) 终端ID(BCD[6]) 消息流水号(WORD)
  41. * (0 1) (2 3) (4 5 6 7 8 9) (10 11)
  42. */
  43. /**消息体属性
  44. *
  45. * 消息体长度 数据加密方式 分包 保留
  46. * (0 1 2 3 4 5 6 7 8 9) (10 11 12) 13 (14 15)
  47. */
  48. // 校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。
  49. void printBinary(uint16_t num) {
  50. for (int i = 15; i >= 0; i--) {
  51. if (num & (1u << i)) {
  52. printf("1");
  53. } else {
  54. printf("0");
  55. }
  56. }
  57. printf("\n");
  58. }
  59. typedef struct Node {
  60. uint8_t data;
  61. struct Node* next;
  62. } Node;
  63. Node* createNode(uint8_t value) {
  64. Node* newNode = (Node*)malloc(sizeof(Node));
  65. newNode->data = value;
  66. newNode->next = NULL;
  67. return newNode;
  68. }
  69. void insertAfter(Node* prevNode, uint8_t value) {
  70. Node* newNode = createNode(value);
  71. newNode->next = prevNode->next;
  72. prevNode->next = newNode;
  73. }
  74. uint8_t escaped_data[100]; // 定义足够大的数组存储转义后的数据
  75. void escape_data(uint8_t* input, int length, uint8_t* escaped_data, size_t* new_length) {
  76. *new_length = 0;
  77. Node* head = createNode(input[0]); // 创建链表头节点
  78. Node* current = head;
  79. escaped_data[(*new_length)++] = input[0]; // 将第一个数据直接存入
  80. for (int i = 1; i < length; i++) {
  81. if (input[i] == 0x7E && (i != length - 1)) {
  82. escaped_data[(*new_length)++] = 0x7D;
  83. escaped_data[(*new_length)++] = 0x02;
  84. }
  85. else if (input[i] == 0x7D) {
  86. escaped_data[(*new_length)++] = 0x7D;
  87. escaped_data[(*new_length)++] = 0x01;
  88. }
  89. else {
  90. escaped_data[(*new_length)++] = input[i];
  91. }
  92. }
  93. // 释放链表内存
  94. current = head;
  95. Node* temp;
  96. while (current != NULL) {
  97. temp = current;
  98. current = current->next;
  99. free(temp);
  100. }
  101. }
  102. //uint8_t escaped_data[100]; // 假设足够大来存储转义后的数据
  103. size_t new_length = 0;
  104. // 数据封装函数
  105. void packageData(uint8_t flag, uint8_t *head, uint8_t *body, size_t bodylength, uint8_t *escaped_data, size_t *new_length)
  106. {
  107. // Calculate total length
  108. uint8_t len = 1 + 12 + bodylength + 1 + 1; // 1 byte for flag + 10 bytes for header + body length + 1 byte for checksum + 1 byte for flag
  109. uint8_t checksum = 0; // Initialize checksum
  110. // Calculate checksum from message header
  111. for (int i = 0; i < 12; i++) {
  112. checksum ^= head[i];
  113. }
  114. for (int i = 0; i < bodylength; i++) {
  115. checksum ^= body[i];
  116. }
  117. // Start building the packet
  118. uint8_t packet[len];
  119. int index = 0;
  120. packet[index++] = flag; // Set the flag
  121. // Copy message header to packet
  122. for (int i = 0; i < 12; i++) {
  123. packet[index++] = head[i];
  124. }
  125. // Copy message body to packet
  126. for (size_t i = 0; i < bodylength; i++) {
  127. packet[index++] = body[i];
  128. }
  129. packet[index++] = checksum; // Set the checksum
  130. packet[index++] = flag; // Set the flag at the end
  131. int packetlength = (sizeof(packet)/sizeof(packet[0]));
  132. // 执行转义处理
  133. escape_data(packet, packetlength, escaped_data, new_length);
  134. // 输出转义后的数据
  135. // for (int i = 0; i < *new_length; i++) {
  136. // printf("%02X ", escaped_data[i]);
  137. // }
  138. // printf("\n");
  139. // char TCPvalue[128];
  140. // char *ptr = TCPvalue;
  141. // ptr += sprintf(ptr, "AT+MIPSEND=1,%d,\"",sizeof(escaped_data));
  142. // for (int i = 0; i < sizeof(escaped_data); i++) {
  143. // ptr += sprintf(ptr, "%02X", escaped_data[i]);
  144. // }
  145. // sprintf(ptr, "\"\r\n");//TCPvalue
  146. // if(sendCmd_4G(TCPvalue, "+MIPSEND:", 1, 3))//发送11BYTE MAX1460
  147. // //if(sendCmd_4G("AT+MIPSEND=1,11,\"12345678900\"\r\n", "+MIPSEND:", 1, 3))//发送11BYTE MAX1460
  148. // {
  149. // printf("#发送完成\r\n");
  150. // }
  151. // memset(cmd_replyArray,0,sizeof(cmd_replyArray));
  152. // memcpy(cmd_replyArray,escaped_data,*new_length);
  153. }
  154. void reCenter(void);
  155. uint16_t xxid =0 ;
  156. uint8_t BusinessData[256] = {0}; // 定义业务数据数组
  157. uint8_t TCPCenterCrc=0;
  158. /**
  159. * @breaf 目前监测 U1485标志位 0x7E 0x2A 0x23 0x7E
  160. */
  161. bool U4re =false;
  162. bool newmac=false;
  163. bool genghaunmac =false;
  164. extern Menu_table menu;
  165. void newMacchange(uint8_t MIPurc1[])
  166. {
  167. //conn AT+CONN=101000000010\r\n
  168. //connected +CONNECTED:0,101000000010
  169. //dis +DISCONN:0,101000000010
  170. //snnum 0010
  171. uint8_t BDmacNum = MIPurc1[17];//绑定的L1
  172. uint16_t mac = (MIPurc1[20] << 8) | MIPurc1[21]; //eg 0010
  173. // char SNconn[25];
  174. // char *ptr = SNconn;
  175. // ptr += sprintf(ptr, "AT+CONN=1010");
  176. // for (int i = 18; i < 22; i++) {
  177. // ptr += sprintf(ptr, "%02X", MIPurc1[i]);
  178. // }
  179. // sprintf(ptr, "\r\n");//TCPvalue
  180. //
  181. // char SNF[25];
  182. // char *ptr1 = SNF;
  183. // ptr1 += sprintf(ptr1, "+CONNECTED:0,1010");
  184. // for (int i = 18; i < 22; i++) {
  185. // ptr1 += sprintf(ptr1, "%02X", MIPurc1[i]);
  186. // }
  187. // //sprintf(ptr, "\r\n");//TCPvalue
  188. //
  189. //
  190. // char SNname[2];
  191. // char *ptr2 = SNname;
  192. // for (int i = 20; i < 22; i++) {
  193. // ptr2 += sprintf(ptr2, "%02X", MIPurc1[i]);
  194. // }
  195. // //sprintf(ptr, "\r\n");//TCPvalue
  196. //
  197. // char SND[25];
  198. // char *ptr3 = SND;
  199. // ptr3 += sprintf(ptr3, "+DISCONN:0,1010");
  200. // for (int i = 18; i < 22; i++) {
  201. // ptr3 += sprintf(ptr3, "%02X", MIPurc1[i]);
  202. // }
  203. if(BDmacNum==0x01)//M1
  204. {
  205. //xxid=0;
  206. menu.SN1name=NULL;
  207. menu.SN1=NULL;
  208. menu.SN1F=NULL;
  209. menu.SN1D=NULL;
  210. erase_flash(Sn1StatusAddr);
  211. erase_flash(Sn1Addr);
  212. erase_flash(serialNum1Addr);
  213. // menu.SN1 = SNconn;//AT+CONN=*********\r\n
  214. // menu.SN1F = SNF;//+CONNECTED:0,101000000010
  215. // menu.SN1name = SNname;
  216. // menu.SN1D = SND;
  217. Write_Information(Sn1Addr, mac);
  218. menu.home &= 0x0FFF;
  219. }
  220. else if(BDmacNum==0x02)//M2
  221. {
  222. menu.SN2name=NULL;
  223. menu.SN2=NULL;
  224. menu.SN2F=NULL;
  225. menu.SN2D=NULL;
  226. erase_flash(Sn2StatusAddr);
  227. erase_flash(Sn2Addr);
  228. erase_flash(serialNum2Addr);
  229. // menu.SN2 = SNconn;//AT+CONN=*********\r\n
  230. // menu.SN2F = SNF;//+CONNECTED:0,101000000010
  231. // menu.SN2name = SNname;
  232. // menu.SN2D = SND;
  233. Write_Information(Sn2Addr, mac);
  234. menu.home &= 0xF0FF;
  235. }
  236. else if(BDmacNum==0x03)//M3
  237. {
  238. menu.SN3name=NULL;
  239. menu.SN3=NULL;
  240. menu.SN3F=NULL;
  241. menu.SN3D=NULL;
  242. erase_flash(Sn3StatusAddr);
  243. erase_flash(Sn3Addr);
  244. erase_flash(serialNum3Addr);
  245. // menu.SN3 = SNconn;//AT+CONN=*********\r\n
  246. // menu.SN3F = SNF;//+CONNECTED:0,101000000010
  247. // menu.SN3name = SNname;
  248. // menu.SN3D = SND;
  249. Write_Information(Sn3Addr, mac);
  250. menu.home &= 0xF0FF;
  251. }
  252. else if(BDmacNum==0x04)//M4
  253. {
  254. menu.SN4name=NULL;
  255. menu.SN4=NULL;
  256. menu.SN4F=NULL;
  257. menu.SN4D=NULL;
  258. erase_flash(Sn4StatusAddr);
  259. erase_flash(Sn4Addr);
  260. erase_flash(serialNum4Addr);
  261. // menu.SN4 = SNconn;//AT+CONN=*********\r\n
  262. // menu.SN4F = SNF;//+CONNECTED:0,101000000010
  263. // menu.SN4name = SNname;
  264. // menu.SN4D = SND;
  265. Write_Information(Sn4Addr, mac);
  266. menu.home &= 0xFF0F;
  267. }
  268. readLockStatusinit();
  269. // scanMac();
  270. }
  271. uint8_t hext[100]={0};
  272. uint8_t cmd_replyArray[] = {0};
  273. uint32_t DTUID=0x64747531;
  274. uint16_t length;
  275. void wsj(uint8_t flag);
  276. void tcphuifu(void);
  277. int tcpdataLength = 0;
  278. void wjwd(void);
  279. uint8_t MIPurc[100];
  280. uint8_t MIPurc1[100];
  281. uint8_t MIPurcXXTCSJ[100];//平台下行透传数据
  282. bool MIPurcReFlag = false;
  283. uint16_t hccd = 0;
  284. char high[]={0};
  285. bool chuliSJ = false;
  286. char hex2asc(const char *hex)
  287. {
  288. char asc = 0;
  289. char a = (hex[0]>='A' && hex[0]<='F')?(hex[0]^32):hex[0];
  290. char b = (hex[1]>='A' && hex[1]<='F')?(hex[1]^32):hex[1];
  291. if ((a>='0' && a<='9' || a>='a' && a<='f') && (b>='0' && b<='9' || b>='a' && b<='f')){
  292. asc = ((('a'<=a && a<='f')?(a-'a')+10:a-'0')<<4)|(('a'<=b && b<='f')?(b-'a')+10:b-'0');
  293. }
  294. return asc;
  295. }
  296. char *bin2hex(char *hex, const unsigned char *bin, int size)
  297. {
  298. size_t i;
  299. for(i=0; i<size; i++)
  300. {
  301. sprintf(hex+i*2, "%02x", bin[i]);
  302. }
  303. hex[i+i] = 0;
  304. return hex;
  305. }
  306. int hex2bin(unsigned char *bin, const char *hex)
  307. {
  308. const char *h = hex;
  309. unsigned char *b = bin;
  310. int rlt = 0;
  311. while(*h){
  312. *b++ = hex2asc(h);
  313. h = h + 2;
  314. rlt++;
  315. }
  316. return rlt;//长度
  317. }
  318. int rlt;
  319. char year_str[3];
  320. char month_str[3];
  321. char day_str[3];
  322. char hour_str[3];
  323. char minute_str[3];
  324. char second_str[3];
  325. void ZHSJ(uint8_t outTt[],char in[])//转换数据
  326. {
  327. const char *hex = (const char *)in; // 将 uint8_t * 转换为 const char *
  328. int size = strlen(hex) / 2; // 计算二进制数据的长度
  329. unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据
  330. hex2bin(bin, hex); // 调用hex2bin函数进行转换
  331. memcpy(outTt, bin, 1); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中
  332. free(bin); // 释放内存
  333. }
  334. void ZHSN(uint8_t outTt[],char in[])//转换SN
  335. {
  336. const char *hex = (const char *)in; // 将 uint8_t * 转换为 const char *
  337. int size = strlen(hex) / 2; // 计算二进制数据的长度
  338. unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据
  339. hex2bin(bin, hex); // 调用hex2bin函数进行转换
  340. memcpy(outTt, bin, 2); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中
  341. free(bin); // 释放内存
  342. }
  343. void wsj(uint8_t flag )
  344. {
  345. if(flag==0)
  346. {
  347. if (sendCmd_4G("AT+CCLK?\r\n", "OK", 1, 1))
  348. {
  349. memcpy(year_str, &g_ML307A_8buf_Down[8], 2); // 复制两个字符
  350. memcpy(month_str, &g_ML307A_8buf_Down[11], 2);
  351. memcpy(day_str, &g_ML307A_8buf_Down[14], 2);
  352. memcpy(hour_str, &g_ML307A_8buf_Down[17], 2);
  353. memcpy(minute_str, &g_ML307A_8buf_Down[20], 2);
  354. memcpy(second_str, &g_ML307A_8buf_Down[23], 2);
  355. year_str[2] = '\0'; // 添加空字符结束符
  356. month_str[2] = '\0';
  357. day_str[2] = '\0';
  358. hour_str[2] = '\0';
  359. minute_str[2] = '\0';
  360. second_str[2] = '\0';
  361. // time.year = (uint8_t)atoi(year_str); // 使用atoi函数将字符转换为数字并赋值给time.year转16
  362. // time.month = (uint8_t)atoi(month_str);
  363. // time.day = (uint8_t)atoi(day_str);
  364. // time.hour = (uint8_t)atoi(hour_str)+8;
  365. // time.minute = (uint8_t)atoi(minute_str);
  366. // time.second = (uint8_t)atoi(second_str);
  367. ZHSJ(&time.tt[0],year_str);
  368. ZHSJ(&time.tt[1],month_str);
  369. ZHSJ(&time.tt[2],day_str);
  370. ZHSJ(&time.tt[3],hour_str);
  371. ZHSJ(&time.tt[4],minute_str);
  372. ZHSJ(&time.tt[5],second_str);
  373. tongbushijian(time.tt[0], time.tt[1], time.tt[2], time.tt[3], time.tt[4], time.tt[5]);
  374. }
  375. }
  376. else
  377. {
  378. /* 上面通过AT指令问 */
  379. RTCtime();//上电同步时间
  380. }
  381. }
  382. uint8_t xxtnewlength=0;
  383. uint8_t xxtfz[100];
  384. uint8_t tcppacket[100];
  385. uint8_t xxtFZ(uint8_t xxt[], uint8_t xxtlength, uint8_t outXxt[],uint16_t XXID)
  386. {
  387. int index = 0;
  388. uint8_t newlength = xxtlength+3;
  389. uint8_t newXxt[newlength];
  390. if(XXID==XXIDzdjq || XXID==XXIDzdxt || XXID==XXIDzddz)//不加头尾(鉴权、心跳、地址)
  391. {
  392. for (int i = 0; i < xxtlength; i++) {
  393. newXxt[index++] = xxt[i]; // 将消息头拷贝到报文中
  394. }
  395. newlength = index;
  396. for(int i =0;i<newlength;i++)
  397. {
  398. outXxt[i]=newXxt[i];
  399. }
  400. }
  401. else
  402. {
  403. newXxt[index++]=newlength;
  404. newXxt[index++]=0x2A;
  405. for (int i = 0; i < xxtlength; i++) {
  406. newXxt[index++] = xxt[i]; // 将消息头拷贝到报文中
  407. }
  408. newXxt[index++]=0x23;
  409. newXxt[index++]=xorBytes(&newXxt[1],newlength-1);
  410. newlength = index;
  411. for(int i =0;i<newlength;i++)
  412. {
  413. outXxt[i]=newXxt[i];
  414. }
  415. }
  416. //test
  417. // for (int i = 0; i < newlength; i++) {
  418. // printf("%02X ", newXxt[i]); // 以十六进制格式打印每个元素
  419. // }
  420. return newlength;
  421. }
  422. uint8_t header[12];
  423. void chuli(uint16_t XXID)
  424. {
  425. uint16_t XXTSXdata = xxtnewlength;
  426. XXTSXdata |= ( xxtnewlength | (TCPJMFSNULL<<10)); // 将长度左移3位后和加密方式进行按位或操作(001 RSA ,000 无加密)
  427. header[0] = ((XXID>>8)&0xff);
  428. header[1] = (XXID&0xff);
  429. header[2] = ((XXTSXdata>>8)&0xff);
  430. header[3] = (XXTSXdata&0xff);
  431. header[4] = 0x00;
  432. header[5] = 0x00;
  433. header[6] = 0x16;
  434. header[7] = 0x00;
  435. header[8] = 0x00;
  436. header[9] = 0x08;
  437. header[10] = ((tt808.LSH>>8)&0xff);;
  438. header[11] = (tt808.LSH&0xff);;
  439. int index = 0;
  440. tcppacket[index++] = TT808FLAG; // Set the flag
  441. for (int i = 0; i < 12; i++) {
  442. tcppacket[index++] = header[i];
  443. }
  444. // Copy message body to packet
  445. for (size_t i = 0; i < xxtnewlength; i++) {
  446. tcppacket[index++] = xxtfz[i];
  447. }
  448. tcppacket[index++] = xorBytes(&tcppacket[1],12+xxtnewlength);; // Set the checksum
  449. tcppacket[index++] = TT808FLAG; // Set the flag at the end
  450. // for (int i = 0; i < index; i++) {
  451. // printf("%02X ", tcppacket[i]); // 以十六进制格式打印每个元素
  452. // }
  453. char TCPvalue[100];
  454. char *ptr = TCPvalue;
  455. ptr += sprintf(ptr, "AT+MIPSEND=1,%d,\"",index);
  456. for (int i = 0; i < index; i++) {
  457. ptr += sprintf(ptr, "%02X", tcppacket[i]);
  458. }
  459. sprintf(ptr, "\"\r\n");//TCPvalue
  460. if(sendCmd_4G(TCPvalue, "+MIPSEND:", 1, 1))//发送11BYTE MAX1460
  461. {
  462. printf("#发送完成\r\n");
  463. }
  464. tt808.LSH+=1;
  465. }
  466. /*需要传入消息体长度sizeof(xxt)/sizeof(xxt[0]);*/
  467. void tt808FsFunc(uint8_t xxt[], uint8_t xxtlength, uint16_t XXID)
  468. {
  469. xxtnewlength = xxtFZ(xxt, xxtlength, xxtfz, XXID);
  470. chuli(XXID);
  471. }
  472. void ReMLBSLOC(void)
  473. {
  474. if(g_ML307A_8buf_Down[1]==0x4D && g_ML307A_8buf_Down[2]==0x4C && g_ML307A_8buf_Down[3]==0x42 \
  475. && g_ML307A_8buf_Down[4]==0x53 && g_ML307A_8buf_Down[5]==0x4C && g_ML307A_8buf_Down[6]==0x4F \
  476. && g_ML307A_8buf_Down[7]==0x43 && g_ML307A_8buf_Down[8]==0x3A)//检测MLBSLOC:定位
  477. {
  478. memcpy(JD_str, &g_ML307A_8buf_Down[14], 12);
  479. memcpy(WD_str, &g_ML307A_8buf_Down[27], 11);
  480. double num;
  481. double num1;
  482. num = atof(JD_str);
  483. num1 = atof(WD_str);
  484. num = num* 1000000;
  485. num1= num1* 1000000;
  486. JD_dw = (uint32_t)num;
  487. WD_dw = (uint32_t)num1;
  488. }
  489. }
  490. void ReMIPURC(void)
  491. {
  492. //4D 49 50 55 52 43
  493. if(g_ML307A_8buf_Down[1]==0x4D && g_ML307A_8buf_Down[2]==0x49 && g_ML307A_8buf_Down[3]==0x50 \
  494. && g_ML307A_8buf_Down[4]==0x55 && g_ML307A_8buf_Down[5]==0x52 && g_ML307A_8buf_Down[6]==0x43 ) //监测平台回复
  495. {
  496. uint8_t high_byte = (g_ML307A_8buf_Down[18]&0x0f) *10;
  497. uint8_t low_byte = g_ML307A_8buf_Down[19]&0x0f;
  498. hccd = high_byte + low_byte;
  499. memcpy(MIPurc,&g_ML307A_8buf_Down[21],hccd*2);
  500. const char *hex = (const char *)MIPurc; // 将 uint8_t * 转换为 const char *
  501. int size = strlen(hex) / 2; // 计算二进制数据的长度
  502. unsigned char *bin = (unsigned char *)malloc(size); // 分配足够的内存用于存储二进制数据
  503. rlt = hex2bin(bin, hex); // 调用hex2bin函数进行转换
  504. memcpy(MIPurc1, bin, rlt); // 将 bin 中的 rlt 个字节复制到 MIPurc1 中 接收到的数据放入MIPurc1中
  505. free(bin); // 释放内存
  506. memset(g_ML307A_8buf_Down,0,u4length);
  507. }
  508. }
  509. uint16_t nowMac1;
  510. uint16_t nowMac2;
  511. uint16_t nowMac3;
  512. uint16_t nowMac4;
  513. extern BtFrame btframe;
  514. extern void close_lock(BtFrame btframe);
  515. extern void open_lock(BtFrame btframe);
  516. uint8_t WbscLength =0;//数据长度
  517. uint8_t WbscCmd = 0;//指令代码 0x32
  518. uint16_t WbscHmac = 0;//高位mac
  519. uint16_t WbscLmac = 0;//低位mac
  520. bool Ptsjf = false;
  521. extern bool locDw;
  522. bool Timetb=false;
  523. bool JQflag = false;
  524. void MIPURCHandle(void)
  525. {
  526. if(MIPurc1[0]==0x7E)
  527. {
  528. uint16_t PTXXID = MIPurc1[1]<<8 | MIPurc1[2]; //消息ID
  529. uint16_t xxtcLen = MIPurc1[3]<<8 | MIPurc1[4]; //数据长度
  530. uint16_t xxRE = MIPurc1[15]<<8 | MIPurc1[16]; //回复ID
  531. uint8_t YESorNO = MIPurc1[17]; //00 success ; 01 fail
  532. if(PTXXID==XXIDpttyyd) //收到平台通用应答0x8001
  533. {
  534. if(xxRE == XXIDzdjq)//回复鉴权ID
  535. {
  536. if(YESorNO==YES)
  537. {
  538. //printf("@鉴权应答yes\r\n");
  539. JQflag = true;
  540. }
  541. else if(YESorNO==NO)
  542. {
  543. //printf("@鉴权应答no\r\n");
  544. }
  545. memset(MIPurc1,0,rlt);//rlt下发长度
  546. }
  547. else if(xxRE==XXIDzdxt)//回复心跳ID
  548. {
  549. if(YESorNO==YES)
  550. {
  551. //printf("@心跳应答yes\r\n");
  552. XTflag = true;
  553. if(!Timetb)
  554. {
  555. wsj(0);
  556. }
  557. locDw = true;
  558. }
  559. else if(YESorNO==NO)
  560. {
  561. //printf("@心跳应答no\r\n");
  562. }
  563. memset(MIPurc1,0,rlt);//rlt下发长度
  564. }
  565. else if(xxRE==XXIDzddz)//回复地址ID
  566. {
  567. if(YESorNO==YES)
  568. {
  569. //printf("@地址应答yes\r\n");
  570. }
  571. else if(YESorNO==NO)
  572. {
  573. //printf("@地址应答no\r\n");
  574. }
  575. memset(MIPurc1,0,rlt);//rlt下发长度
  576. }
  577. else if(xxRE==XXIDwbsc) //收到平台施解封命令0x0300
  578. {
  579. if(YESorNO==YES)
  580. {
  581. //printf("@文本上传回复yes\r\n");
  582. }
  583. else if(YESorNO==NO)
  584. {
  585. //printf("@文本上传回复no\r\n");;
  586. }
  587. memset(MIPurc1,0,rlt);//rlt下发长度
  588. }
  589. }
  590. else if(PTXXID == XXIDptxxtc) //收到平台消息透传 8900
  591. {
  592. uint8_t tcsjLen = MIPurc1[13];
  593. memcpy(MIPurcXXTCSJ,&MIPurc1[13],xxtcLen);
  594. printf("@得到透传数据,%d\r\n",tcsjLen);
  595. JQflag = true;
  596. // time.tt[0] = MIPurcXXTCSJ[22];
  597. // time.tt[1] = MIPurcXXTCSJ[23];
  598. // time.tt[2] = MIPurcXXTCSJ[24];
  599. // time.tt[3] = MIPurcXXTCSJ[25];
  600. // time.tt[4] = MIPurcXXTCSJ[26];
  601. // time.tt[5] = MIPurcXXTCSJ[27];
  602. //
  603. //
  604. // tongbushijian(time.tt[0], time.tt[1], time.tt[2], time.tt[3], time.tt[4], time.tt[5]);
  605. //Timetb=true;
  606. memset(MIPurc1,0,rlt);//rlt下发长度
  607. // memset(MIPurcXXTCSJ,0,xxtcLen);//rlt下发长度
  608. } // 标头 消息ID 消息体属性 电话号 流水号 长度+2A 操作+CMD MAC号 gate1b+bill8b+linecode2b+key6b+vaildtime1b+备用4b+时间6b 23+流水号2b+校验
  609. else if(PTXXID==XXIDwbsc) //收到平台文本上传 eg.+MIPURC: "rtcp",1,50,7E 0300 0046 000016000008 2890 282A 1532 00000010 00 0000000000000000 0000 000000000000 00 00000000 230001220000 23 0001 99 7E
  610. {
  611. //printf("@得到平台施解封数据\r\n");
  612. nowMac1 = locksnu8.L1snT8[0]<<8 | locksnu8.L1snT8[1];//L1绑定的低字节&0xff
  613. nowMac2 = locksnu8.L2snT8[0]<<8 | locksnu8.L2snT8[1];//L2绑定的低字节&0xff
  614. nowMac3 = locksnu8.L3snT8[0]<<8 | locksnu8.L3snT8[1];//L3绑定的低字节&0xff
  615. nowMac4 = locksnu8.L4snT8[0]<<8 | locksnu8.L4snT8[1];//L4绑定的低字节&0xff
  616. WbscLength = MIPurc1[13];//数据长度
  617. WbscCmd = MIPurc1[16];//指令代码 0x32
  618. WbscHmac = MIPurc1[17] << 8 | MIPurc1[18];//高位mac
  619. WbscLmac = MIPurc1[19] << 8 | MIPurc1[20];//低位mac
  620. if(WbscCmd==0x32)//1532
  621. {
  622. printf("@得到平台施封数据,ID:%04x\r\n",WbscLmac);
  623. XTflag = false;
  624. locDw = false;
  625. if(nowMac1 == WbscLmac && L1bd)//施封L1
  626. {
  627. printf("@施封L1,ID:%04x,%04x\r\n",WbscLmac,nowMac1);
  628. {//施封具体
  629. if(sendCmd_BT(menu.SN1,"ERROR",1,1))
  630. {
  631. SET_MENU_STATUS(4,1,0,3);
  632. HAL_Delay(400);
  633. }
  634. else if(sendCmd_BT(menu.SN1,menu.SN1F,1,2))
  635. {
  636. SET_MENU_STATUS(4,1,0,3);
  637. HAL_Delay(400);
  638. }
  639. }
  640. }
  641. else if(nowMac2 == WbscLmac && L2bd)//施封L2
  642. {
  643. printf("@施封L2,ID:%04x,%04x\r\n",WbscLmac,nowMac2);
  644. {//施封具体
  645. if(sendCmd_BT(menu.SN2,"ERROR",1,1))
  646. {
  647. SET_MENU_STATUS(5,1,0,3);
  648. HAL_Delay(400);
  649. }
  650. else if(sendCmd_BT(menu.SN2,menu.SN2F,1,2))
  651. {
  652. SET_MENU_STATUS(5,1,0,3);
  653. HAL_Delay(400);
  654. }
  655. }
  656. }
  657. else if(nowMac3 == WbscLmac && L3bd)//施封L3
  658. {
  659. printf("@施封L3,ID:%04x,%04x\r\n",WbscLmac,nowMac3);
  660. {//施封具体
  661. if(sendCmd_BT(menu.SN3,"ERROR",1,1))
  662. {
  663. SET_MENU_STATUS(6,1,0,3);
  664. HAL_Delay(400);
  665. }
  666. else if(sendCmd_BT(menu.SN3,menu.SN3F,1,2))
  667. {
  668. SET_MENU_STATUS(6,1,0,3);
  669. HAL_Delay(400);
  670. }
  671. }
  672. }
  673. else if(nowMac4 == WbscLmac && L4bd)//施封L4
  674. {
  675. printf("@施封L4,ID:%04x,%04x\r\n",WbscLmac,nowMac4);
  676. {//施封具体
  677. if(sendCmd_BT(menu.SN4,"ERROR",1,1))
  678. {
  679. SET_MENU_STATUS(7,1,0,3);
  680. HAL_Delay(400);
  681. }
  682. else if(sendCmd_BT(menu.SN4,menu.SN4F,1,2))
  683. {
  684. SET_MENU_STATUS(7,1,0,3);
  685. HAL_Delay(400);
  686. }
  687. }
  688. }
  689. else
  690. {
  691. printf("@未绑定此MAC\r\n");
  692. }
  693. Ptsjf = true;
  694. memset(MIPurc1,0,rlt);//rlt下发长度
  695. }
  696. else if(WbscCmd==0x38)//1538
  697. {
  698. printf("@得到平台解封数据,ID:%04x\r\n",WbscLmac);
  699. XTflag = false;
  700. locDw = false;
  701. if(nowMac1 == WbscLmac && L1bd)//解锁L1
  702. {
  703. printf("@解封L1,ID:%04x,%04x\r\n",WbscLmac,nowMac1);
  704. {//解封具体
  705. if(sendCmd_BT(menu.SN1,"ERROR",1,2))
  706. {
  707. HAL_Delay(400);
  708. SET_MENU_STATUS(4,0,0,3);
  709. }
  710. else if(sendCmd_BT(menu.SN1,menu.SN1F,2,2))
  711. {
  712. HAL_Delay(400);
  713. SET_MENU_STATUS(4,0,0,3);
  714. }
  715. }
  716. }
  717. else if(nowMac2 == WbscLmac && L2bd)//解锁L2
  718. {
  719. printf("@解封L2,ID:%04x,%04x\r\n",WbscLmac,nowMac2);
  720. {//解封具体
  721. if(sendCmd_BT(menu.SN2,"ERROR",1,2))
  722. {
  723. HAL_Delay(400);
  724. SET_MENU_STATUS(5,0,0,3);
  725. }
  726. else if(sendCmd_BT(menu.SN2,menu.SN2F,2,2))
  727. {
  728. HAL_Delay(400);
  729. SET_MENU_STATUS(5,0,0,3);
  730. }
  731. }
  732. }
  733. else if(nowMac3 == WbscLmac && L3bd)//解锁L3
  734. {
  735. printf("@解封L3,ID:%04x,%04x\r\n",WbscLmac,nowMac3);
  736. {//解封具体
  737. if(sendCmd_BT(menu.SN3,"ERROR",1,2))
  738. {
  739. HAL_Delay(400);
  740. SET_MENU_STATUS(6,0,0,3);
  741. }
  742. else if(sendCmd_BT(menu.SN3,menu.SN3F,2,2))
  743. {
  744. HAL_Delay(400);
  745. SET_MENU_STATUS(6,0,0,3);
  746. }
  747. }
  748. }
  749. else if(nowMac4 == WbscLmac && L4bd)//解锁L4
  750. {
  751. printf("@解封L4,ID:%04x,%04x\r\n",WbscLmac,nowMac4);
  752. {//解封具体
  753. if(sendCmd_BT(menu.SN4,"ERROR",1,2))
  754. {
  755. HAL_Delay(400);
  756. SET_MENU_STATUS(7,0,0,3);
  757. }
  758. else if(sendCmd_BT(menu.SN4,menu.SN4F,2,2))
  759. {
  760. HAL_Delay(400);
  761. SET_MENU_STATUS(7,0,0,3);
  762. }
  763. }
  764. }
  765. else
  766. {
  767. printf("@未绑定此MAC\r\n");
  768. }
  769. Ptsjf = true;
  770. memset(MIPurc1,0,rlt);//rlt下发长度
  771. }
  772. else if(WbscCmd==0x02)//1202 eg.+MIPURC: "rtcp",1,22,7E030000140000160000082890132A1202010000000301240401123456230001997E
  773. {
  774. printf("@得到平台绑定MAC数据\r\n");
  775. genghaunmac=true;
  776. }
  777. }
  778. }
  779. }
  780. /*
  781. 0-3报警标志
  782. 4-7状态
  783. 8-11纬度
  784. 12-15经度
  785. 16-17高程
  786. 18-19速度
  787. 20-21方向
  788. 22-27时间
  789. */
  790. /**
  791. "报警标志对象": {
  792. "[bit31]非法开门报警": "0",
  793. "[bit30]侧翻预警": "0",
  794. "[bit29]碰撞预警": "0",
  795. "[bit28]车辆非法位移": "0",
  796. "[bit27]车辆非法点火": "0",
  797. "[bit26]车辆被盗(通过车辆防盗器)": "0",
  798. "[bit25]车辆油量异常": "0",
  799. "[bit24]车辆VSS故障": "0",
  800. "[bit23]路线偏离报警": "0",
  801. "[bit22]路段行驶时间不足/过长": "0",
  802. "[bit21]进出路线": "0",
  803. "[bit20]进出区域": "0",
  804. "[bit19]超时停车": "0",
  805. "[bit18]当天累计驾驶超时": "0",
  806. "[bit15~bit17]保留": "000",
  807. "[bit14]疲劳驾驶预警": "0",
  808. "[bit13]超速预警": "0",
  809. "[bit12]道路运输证IC卡模块故障": "0",
  810. "[bit11]摄像头故障": "0",
  811. "[bit10]TTS模块故障": "0",
  812. "[bit9]终端LCD或显示器故障": "0",
  813. "[bit8]终端主电源掉电": "0",
  814. "[bit7]终端主电源欠压": "0",
  815. "[bit6]GNSS天线短路": "0",
  816. "[bit5]GNSS天线未接或被剪断": "0",
  817. "[bit4]GNSS模块发生故障": "0",
  818. "[bit3]危险预警": "0",
  819. "[bit2]疲劳驾驶": "0",
  820. "[bit1]超速报警": "0",
  821. "[bit0]紧急报警,触动报警开关后触发": "0"
  822. "状态标志对象": {
  823. "[bit22~bit31]保留": "0000000000",
  824. "[0]bit21": "未使用Galileo卫星进行定位",
  825. "[0]bit20": "未使用GLONASS卫星进行定位",
  826. "[0]bit19": "未使用北斗卫星进行定位",
  827. "[0]bit18": "未使用GPS卫星进行定位",
  828. "[0]bit17": "门5关",
  829. "[0]bit16": "门4关",
  830. "[0]bit15": "门3关",
  831. "[0]bit14": "门2关",
  832. "[0]bit13": "门1关",
  833. "[0]bit12": "车门解锁",
  834. "[0]bit11": "车辆电路正常",
  835. "[0]bit10": "车辆油路正常",
  836. "[00]bit8~bit9": "空车",
  837. "[bit6~bit7]保留": "00",
  838. "[0]bit5": "经纬度未经保密插件加密",
  839. "[0]bit4": "运营状态",
  840. "[0]bit3": "东经",
  841. "[0]bit2": "北纬",
  842. "[0]bit1": "未定位",
  843. "[0]bit0": "ACC关"
  844. "[01CD81D6]纬度": 30245334,
  845. "[0727A76F]经度": 120039279,
  846. "[0000]高程": 0,
  847. "[0000]速度": 0,
  848. "[0000]方向": 0,
  849. "[180323093105]定位时间": "2018-03-23 09:31:05",
  850. */
  851. LBSset lbsset;
  852. uint8_t LBSdata[28];
  853. uint8_t LockStatusData[21];
  854. void Lbsprocess(void)
  855. {
  856. wsj(1); //问时间
  857. LBSdata[0] = (lbsset.bjbz>>24)&0xff;
  858. LBSdata[1] = (lbsset.bjbz>>16)&0xff;
  859. LBSdata[2] = (lbsset.bjbz>>8)&0xff;
  860. LBSdata[3] = lbsset.bjbz&0xff;
  861. LBSdata[4] = (lbsset.zt>>24)&0xff;
  862. LBSdata[5] = (lbsset.zt>>16)&0xff;
  863. LBSdata[6] = (lbsset.zt>>8)&0xff;
  864. LBSdata[7] = lbsset.zt&0xff;
  865. LBSdata[8] = (WD_dw>>24)&0xff;
  866. LBSdata[9] = (WD_dw>>16)&0xff;
  867. LBSdata[10] =(WD_dw>>8)&0xff;
  868. LBSdata[11] = WD_dw&0xff;
  869. LBSdata[12] = (JD_dw>>24)&0xff;
  870. LBSdata[13] = (JD_dw>>16)&0xff;
  871. LBSdata[14] = (JD_dw>>8)&0xff;
  872. LBSdata[15] = JD_dw&0xff;
  873. LBSdata[16] = (lbsset.gaocheng>>8)&0xff;
  874. LBSdata[17] = lbsset.gaocheng&0xff;
  875. LBSdata[18] = (lbsset.sudu>>8)&0xff;
  876. LBSdata[19] = lbsset.sudu&0xff;
  877. LBSdata[20] = (lbsset.fangxiang>>8)&0xff;
  878. LBSdata[21] = lbsset.fangxiang&0xff;
  879. LBSdata[22] = time.tt[0];
  880. LBSdata[23] = time.tt[1];
  881. LBSdata[24] = time.tt[2];
  882. LBSdata[25] = time.tt[3]+DongbaquTime;//加东八区
  883. LBSdata[26] = time.tt[4];
  884. LBSdata[27] = time.tt[5];
  885. }
  886. /**
  887. 操作指令(1B,上行0x01,)+SubCmd(1B)+LockID(4B)+Gate(1B)+ Voltage(1B)+LockStatus(1B)+
  888. MotoStatus (1B)+ 备用 (4B)+Ver (1B)+绝对时间(6B)
  889. */
  890. void LockStatusUpload(LockSNu8 locksnu8, uint8_t Locknum)
  891. {
  892. wsj(1); //问时间
  893. LockStatusData[0] = 0x01;//操作上行
  894. LockStatusData[1] = 0x01;//01锁信息上传 02旋钮破坏 03锁体破坏报警 04锁杆剪断报警 05锁杆打开报警 F2申请动态密码/申请开锁
  895. LockStatusData[2] = 0x00;//默认ID
  896. LockStatusData[3] = 0x00;
  897. if(Locknum==0x1)
  898. {
  899. LockStatusData[4] = locksnu8.L1snT8[0];//L1绑定的低字节>>4&0xff
  900. LockStatusData[5] = locksnu8.L1snT8[1];//L1绑定的低字节&0xff
  901. LockStatusData[8] = tt808.L1Lockstatus;//LockStatus
  902. }
  903. else if(Locknum==0x2)
  904. {
  905. LockStatusData[4] = locksnu8.L2snT8[0];
  906. LockStatusData[5] = locksnu8.L2snT8[1];
  907. LockStatusData[8] = tt808.L2Lockstatus;//LockStatus
  908. }
  909. else if(Locknum==0x3)
  910. {
  911. LockStatusData[4] = locksnu8.L3snT8[0];
  912. LockStatusData[5] = locksnu8.L3snT8[1];
  913. LockStatusData[8] = tt808.L3Lockstatus;//LockStatus
  914. }
  915. else if(Locknum==0x4)
  916. {
  917. LockStatusData[4] = locksnu8.L4snT8[0];
  918. LockStatusData[5] = locksnu8.L4snT8[1];
  919. LockStatusData[8] = tt808.L4Lockstatus;//LockStatus
  920. }
  921. LockStatusData[6] = 0x00;//Gate
  922. LockStatusData[7] = 0x00;//Voltage
  923. LockStatusData[9] = 0x00;//MotoStatus
  924. LockStatusData[10] = 0x00;//备用
  925. LockStatusData[11] = 0x00;//备用
  926. LockStatusData[12] = 0x00;//备用
  927. LockStatusData[13] = 0x00;//备用
  928. LockStatusData[14] = 0x00;//VER
  929. LockStatusData[15] = time.tt[0];//year
  930. LockStatusData[16] = time.tt[1];//month
  931. LockStatusData[17] = time.tt[2];//day
  932. LockStatusData[18] = time.tt[3]+DongbaquTime;//hour
  933. LockStatusData[19] = time.tt[4];//minute
  934. LockStatusData[20] = time.tt[5];//second
  935. tt808FsFunc(LockStatusData,21,XXIDwbsc);
  936. }
  937. uint32_t uploadtime = 0;
  938. void gettimeupload_Normal(void)
  939. {
  940. if(HAL_GetTick() - uploadtime >= 40000)//60000=1min
  941. {
  942. uploadtime = HAL_GetTick();
  943. Lbsprocess(); //test地址
  944. tt808FsFunc(LBSdata,28,XXIDzddz); //test地址
  945. if(L1bd)
  946. {
  947. LockStatusUpload(locksnu8,1);
  948. HAL_Delay(50);
  949. }
  950. if(L2bd)
  951. {
  952. LockStatusUpload(locksnu8,2);
  953. HAL_Delay(50);
  954. }
  955. if(L3bd)
  956. {
  957. LockStatusUpload(locksnu8,3);
  958. HAL_Delay(50);
  959. }
  960. if(L4bd)
  961. {
  962. LockStatusUpload(locksnu8,4);
  963. HAL_Delay(50);
  964. }
  965. }
  966. }
  967. void gettimeupload_Emergency(void)
  968. {
  969. Lbsprocess(); //test地址
  970. tt808FsFunc(LBSdata,28,XXIDzddz); //test地址
  971. if(L1bd && menu.current==4)
  972. {
  973. LockStatusUpload(locksnu8,1);
  974. }
  975. if(L2bd && menu.current==5)
  976. {
  977. LockStatusUpload(locksnu8,2);
  978. }
  979. if(L3bd && menu.current==6)
  980. {
  981. LockStatusUpload(locksnu8,3);
  982. }
  983. if(L4bd && menu.current==7)
  984. {
  985. LockStatusUpload(locksnu8,4);
  986. }
  987. refresh=true;
  988. }