tt808.c 29 KB

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