TSGpsProcess.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. /**********************************************************************************
  2. * File Name: TSGpsProcess.c
  3. * Function Describe:device for Gps Process for TS/T808
  4. * Relate Module:
  5. * Explain: 采用TCP或UDP格式传输
  6. * Writer: wuzhao
  7. * Date: 2015.12.14
  8. *外设类型:0x01,
  9. *命令类型:0x05
  10. ***********************************************************************************/
  11. #define THIS_FILE_ID 24
  12. //-------------------------------------------------------------------------------------------
  13. #include "includes.h"
  14. SUT_GPS_SEND_DATA sutGpsSendData;
  15. //SUT_PRODUCT_PARA TSsutProductPara;
  16. REGISTRATION Regist;
  17. AVL_MSG_BODY_ATTRIB msgBodyAttrib;
  18. MSG_HEAD msghead;
  19. MSG_PACKET msgPacket;
  20. AUTH auth;
  21. SIM SimData;
  22. unsigned int a;
  23. unsigned int b;
  24. char GPSDataBuf[8];
  25. char GPSDataBuf1[8];
  26. //*p_buf -- *m_data size -- m_size
  27. /**********************************************************************************
  28. GpsSendHead
  29. ***********************************************************************************/
  30. void TSGpsServerConect(void)
  31. {
  32. int len;
  33. unsigned char buf[100];
  34. unsigned char temp[5];
  35. SUTDS ds;
  36. SlwTrace(INF, "Device ACK",1);
  37. memcpy(temp, (unsigned char*)&sutFeed.feedliushuiID,2);
  38. ds.Data.usData=sutFeed.feedID;
  39. temp[2] = ds.Data.ucData.b2;
  40. temp[3] = ds.Data.ucData.b1;
  41. temp[4] = sutFeed.result;
  42. len=TSGpsPacket(buf,sutProductPara.PSN,TS_TERMINAL_UNIVERSAL_ANSWER,temp,sizeof(temp));
  43. MC8332ModemSendTcpData(GPS_DATA_SOCKET,buf,len);
  44. }
  45. //从厂商编号到用户数据依次累加的累加和,取累加的档�8位作为校验码
  46. unsigned char TSGetCheckSum(unsigned char *pData,int len)
  47. {
  48. int i;
  49. unsigned char sum= pData[1]; //sum=0;
  50. for(i=1;i<len-1;i++){
  51. sum=sum^pData[i+1];
  52. }
  53. return sum;
  54. }
  55. /*************************************************************************************
  56. *
  57. **************************************************************************************/
  58. // replace 0x7d 0x01 with 0x7d and 0x7d 0x02 with 0x7e 接收
  59. #if 1
  60. //长度不会变大
  61. int reduce(unsigned char *pData,int DataLen) {
  62. unsigned char *p= (unsigned char *)malloc(DataLen);
  63. unsigned char * q = p;
  64. int data_len = 0;
  65. int i;
  66. if (DataLen == 0) {
  67. return 0;
  68. }
  69. for (i = 0; i < DataLen - 1; i ++) {
  70. if (pData[i] == 0x7d && pData[i+1] == 0x01) {
  71. *q ++ = 0x7d;
  72. i++;
  73. } else if (pData[i] == 0x7d && pData[i+1] == 0x02) {
  74. *q ++ = 0x7e;
  75. i++;
  76. } else {
  77. *q ++ = pData[i];
  78. }
  79. data_len ++;
  80. }
  81. memcpy(pData, p, data_len);
  82. free(p);
  83. DataLen = data_len;
  84. //free(p);
  85. return DataLen;
  86. }
  87. #else
  88. int reduce(unsigned char *pData,int DataLen) {
  89. unsigned char *p= (unsigned char *)malloc(DataLen * 2);
  90. unsigned char * q = p;
  91. int data_len = 0;
  92. int i;
  93. if (DataLen == 0) {
  94. return 0;
  95. }
  96. for (i = 0; i < DataLen - 1; i ++) {
  97. if (pData[i] == 0x7d && pData[i+1] == 0x01) {
  98. *q ++ = 0x7d;
  99. } else if (pData[i] == 0x7d && pData[i+1] == 0x02) {
  100. *q ++ = 0x7e;
  101. } else {
  102. *q ++ = pData[i];
  103. }
  104. data_len ++;
  105. }
  106. memcpy(pData, p, data_len);
  107. free(p);
  108. DataLen = data_len;
  109. //free(p);
  110. return DataLen;
  111. }
  112. #endif
  113. // loop every character, replace 0x7d with 0x7d 0x01 and 0x7e with 0x7d 0x02 发送
  114. int escapse(unsigned char *pData,int DataLen) {
  115. unsigned char *p= (unsigned char *)malloc(DataLen * 2);
  116. unsigned char * q = p;
  117. int data_len = 0;
  118. int i;
  119. if (DataLen == 0) {
  120. return 0;
  121. }
  122. memset(p, 0, DataLen * 2);
  123. for (i = 0; i < DataLen; i ++) {
  124. if (pData[i] == 0x7d) {
  125. *q ++ = 0x7d;
  126. *q ++ = 0x01;
  127. data_len += 2;
  128. } else if (pData[i] == 0x7e) {
  129. *q ++ = 0x7d;
  130. *q ++ = 0x02;
  131. data_len += 2;
  132. } else {
  133. *q ++ = pData[i];
  134. data_len += 1;
  135. }
  136. }
  137. memcpy(pData, p, data_len);
  138. free(p);
  139. DataLen = data_len;
  140. //free(p);
  141. return DataLen;
  142. }
  143. /******************************************************/
  144. int* TenToTwo(int Datalen)
  145. {
  146. static int c[10]={0};
  147. int i=0;
  148. do {
  149. c[i++]=Datalen%2;
  150. Datalen/=2;
  151. } while(Datalen!=0);
  152. return c;
  153. }
  154. /**********************
  155. **消息头12字节,消息体属性2个字节,这两个字节的16位。低10位是消息体长度
  156. 因此消息消息最长小于1024字节,Bit13是分包标志,看终端发到平台一个消息,可能很长,一个消息体发不完,分包发出去那么
  157. Bit12置为1,消息头长度变成16字节,消息头的后4个字节为消息包分装项内容,总共
  158. 有多少个包,这次发送的消息包是分包中的第几个消息包
  159. sutProductPara.APN
  160. **************************/
  161. int TSGpsPacket(unsigned char *Buffer,unsigned long PSN,unsigned short ID,unsigned char *pData,int DataLen)
  162. {
  163. static unsigned short liushiID=0;
  164. unsigned char *pBuf=Buffer,sum;
  165. int j,flag = 0,i=0;
  166. int talpage=1,MSnum = 0;
  167. char Psnsv[11];
  168. static unsigned short snum = 1;
  169. unsigned short Len=DataLen+6;
  170. unsigned short pageItem=DataLen+12;
  171. sprintf(Psnsv,"%010u",(unsigned int)PSN);
  172. pBuf[i++]=0x7e;
  173. pBuf[i++]=(ID>>8)&0xff;
  174. pBuf[i++]=ID&0xff;
  175. //消息体属性
  176. msgBodyAttrib.EncrypType=NO_ENCRYP;//NO_ENCRYP;
  177. msgBodyAttrib.msgBodyLength=(DataLen);
  178. pBuf[i++]=msgBodyAttrib.EncrypType;
  179. pBuf[i++]=msgBodyAttrib.msgBodyLength;
  180. //SIM卡号
  181. if(sutProductPara.SIMFlag!=1){
  182. pBuf[i++]=0; //
  183. for (j=0;j<10;j+=2)
  184. {
  185. pBuf[i++]=(Psnsv[j]<<4)|(Psnsv[j+1]&0x0F);
  186. }
  187. }else{
  188. for(j=0;j<6;j++){
  189. pBuf[i++]=SimData.SIM[j];
  190. }
  191. }
  192. //消息流水号
  193. pBuf[i++] = (liushiID>>8)&0xff;
  194. pBuf[i++] = liushiID&0xff;
  195. liushiID++;
  196. if(pData!=NULL)
  197. {
  198. //snum++;
  199. //消息包封装项
  200. //msgPacket.msgPacketID=0x30;
  201. //msgPacket.msgTotalCount=0x30;
  202. //pBuf[i++] = msgPacket.msgPacketID;
  203. //pBuf[i++] = msgPacket.msgTotalCount;
  204. //MSnum++;
  205. //包封装项 4
  206. for(j=0;j<DataLen;j++)
  207. {//0
  208. pBuf[i++]= pData[j];
  209. }
  210. }
  211. sum = TSGetCheckSum(pBuf,i);
  212. pBuf[i++] = sum;
  213. //对整体数据,除sum进行转义
  214. i=escapse(&pBuf[1],i-1);//头的7E不转义
  215. i++;
  216. pBuf[i++] = 0x7e;
  217. return i;
  218. }
  219. /************************************************************
  220. 位置信息汇报
  221. *************************************************************/
  222. /**********************************************************************************
  223. GpsSendPosition
  224. 发送位置数据
  225. Head(2) Cmd(2) Len(2) PSN(4) GpsData(34) Check(1) End(1)
  226. Cmd=0x0200
  227. 总长度=2+2+2+40=46
  228. ***********************************************************************************/
  229. void TSGpsSendPosition(void)
  230. {
  231. int i;
  232. int len;
  233. char tmp[5];
  234. char buf[150];
  235. unsigned char GpsBuf[50];
  236. len=TSGpsPacket(GpsBuf,sutProductPara.PSN,0x0200,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  237. //sprintf(buf,"AT+ZIPSEND=0,%d\r",len);
  238. sprintf(buf,"AT^IPSEND=1,%d\r",len);//+ 1?
  239. ModemSendAT(buf);
  240. ModemSendData(GpsBuf,len);
  241. strcpy(buf,"SendGpsD:");
  242. for(i=0;i<len;i++){
  243. sprintf(tmp,"%02x,",GpsBuf[i]);
  244. strcat(buf,tmp);
  245. }
  246. SlwTrace(INF,buf,1);
  247. }
  248. /*******************************************************
  249. GPRMC信息,与,之间的子信息处理,存储到相应的结构体中元素中
  250. *******************************************************/
  251. void TSGPS_GPRMC_Handle(unsigned char *ch,unsigned char ch1) //1处
  252. {
  253. unsigned char x,y;
  254. // send_byte('d');
  255. switch(ch1)
  256. {
  257. case 0: //时间
  258. for(x=0,y=0;x<8;x++)
  259. {
  260. if(x==2||x==5){ sutGpsInfo.Time[x]=0x3a;}
  261. else sutGpsInfo.Time[x]=ch[y++];
  262. }
  263. // send_byte(time[7]);
  264. break;
  265. case 1: //状态
  266. sutGpsInfo.Status=ch[0];
  267. break;
  268. case 2: //纬度
  269. for(x=10,y=0;x<17;x++)
  270. {
  271. if(x==12||x==15) {}
  272. else sutGpsInfo.Location[x]=ch[y++];
  273. }
  274. break;
  275. case 3: //南北纬
  276. sutGpsInfo.Location[9]=ch[0];
  277. break;
  278. case 4: //经度
  279. for(x=1,y=0;x<8;x++){
  280. if(x==4||x==7){}
  281. else sutGpsInfo.Location[x]=ch[y++];
  282. }
  283. break;
  284. case 5: //东西经
  285. sutGpsInfo.Location[0]=ch[0];
  286. break;
  287. case 6: //航速
  288. for(x=0;x<6;x++){
  289. sutGpsInfo.Speed[x+1]=ch[x];
  290. }
  291. sutGpsInfo.Speed[6]=0x20;
  292. sutGpsInfo.Speed[7]=0x20;
  293. break;
  294. case 7: //信息自己定义
  295. break;
  296. case 8: //信息自己定义
  297. break;
  298. case 9: //信息自己定义
  299. break;
  300. case 10: //信息自己定义
  301. break;
  302. case 11: //信息自己定义
  303. break;
  304. default:break;
  305. }
  306. }
  307. /*******************************************************
  308. 处理GPRMC信息
  309. *******************************************************/
  310. void TSGPS_GPRMC_Alysis(char *RMC_Data) //2处
  311. {
  312. unsigned char i,j,k;
  313. unsigned char count;
  314. unsigned char temp[10];
  315. //send_byte('a');
  316. for(i=0;i<strlen(RMC_Data);)
  317. {
  318. switch(RMC_Data[i])
  319. {
  320. case '$':
  321. j=i++; //标记$的起始位置
  322. while(RMC_Data[i]!=',') //RMC_Data[i]==','时结束循环。
  323. {i++;}
  324. // uart1_sendbytes(GPRMC[RMC_Count].RMC_ID);
  325. break;
  326. case ',':
  327. j=i++; //标记,的起始位置
  328. while((RMC_Data[i]!=',')&&(RMC_Data[i]!='*')) //RMC_Data[i]==','或者=='*'时结束循环。
  329. {i++;}
  330. if(j+1!=i)
  331. {
  332. for(j=j+1,k=0;j<i;j++)
  333. {
  334. temp[k++]=RMC_Data[j];
  335. }
  336. temp[k]='\0';
  337. // send_byte(temp[0]);
  338. }
  339. else temp[0]='\0';
  340. // send_byte('c');
  341. TSGPS_GPRMC_Handle(temp,count++);
  342. break;
  343. case '*':
  344. i=strlen(RMC_Data); //处理完成,软件结束。
  345. break;
  346. default:break;
  347. }
  348. }
  349. // send_byte('e');
  350. }
  351. void TSGpsDataInit(void)
  352. {
  353. unsigned char *p;
  354. char buf2[20];
  355. p=(unsigned char *)&sutGpsSendData;
  356. memset(p, 0, sizeof(SUT_GPS_SEND_DATA));
  357. p=(unsigned char *)&sutGpsInfo;
  358. memset(p, 0, sizeof(SUT_GPS_INF));
  359. #if 1
  360. //sutGpsInfo.SendTime = sutProductPara.m_GPS_SendTime;
  361. sutGpsInfo.GPS_UploadTime = GPS_TimeTable[sutProductPara.m_GPS_TimeIndex];
  362. sprintf(buf2, "Gpstime=%d",sutGpsInfo.GPS_UploadTime);
  363. SlwTrace(INF, buf2,1);
  364. #else
  365. sutGpsInfo.SendTime=10;//默认主动上报时间间隔 单位为15秒
  366. sutGpsInfo.GPSSendTime=10;
  367. #endif
  368. sutGpsInfo.isGpsAuthOk = 0;//未鉴权
  369. }
  370. /*************************************************************************
  371. *检查GPS 服务器发过来的数据包是否正确
  372. 非法 返回0
  373. 合法 返回命令码
  374. **************************************************************************/
  375. //"7e8300 000c 000009771810000001 4130313233343536373839 b87e"
  376. unsigned char TSGpsServerCheckPack(unsigned char *data,unsigned short DataLen)//3处
  377. {
  378. unsigned char cmd;
  379. unsigned short len;
  380. unsigned long PSN;
  381. //判断数据包的包头是否正确
  382. // escapse(data,DataLen);
  383. if(data[0]!=TSGPS_PACK_HEAD)return 0;
  384. //判断数据包的校验是否正确
  385. if(data[DataLen-2] != TSGetCheckSum(data,DataLen-2))
  386. return 255;
  387. //判断数据包的结尾是否正确
  388. if(data[DataLen-1] != TSGPS_PACK_END)
  389. return 255;
  390. //获取数据包的长度 并判断长度是否正确
  391. len=(unsigned short)data[3]*256+data[4];
  392. if(DataLen!=(len+5))return 255;
  393. // //判断终端编号是否正确
  394. // PSN=(unsigned long)data[5]<<24;
  395. // PSN+=(unsigned long)data[6]<<16;
  396. // PSN+=(unsigned long)data[7]<<8;
  397. // PSN+=(unsigned long)data[8];
  398. // if(PSN!=sutNetPara.PSN) return 0;
  399. //解析当前命令
  400. cmd = data[2];
  401. sutGpsInfo.HostCmd = cmd;
  402. return cmd;
  403. }
  404. /**************************************************************************************************
  405. * // TS_PROID 440000
  406. // TS_CITYID 440300
  407. 车牌D4C1423738583134
  408. ***************************************************************************************************/
  409. void TSMakeSendData(void)
  410. {
  411. int i,len;
  412. // static int Table[20]={0};
  413. static int Table1[20]={0};
  414. static int Temp[8];
  415. static int Temp1[4];
  416. const unsigned char acTemp[]={
  417. 0x34,0x31,0x30,0x30,0x30,//制造商ID Regist.Manufacturers
  418. //32 30 31 34 30 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  419. 0x32,0x30,0x31,0x34,0x30,0x34,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //终端型号Regist.TerMod
  420. 0x65,0x30,0x30,0x72, //终端IDRegist.TerID
  421. };
  422. const unsigned char TSacTemp[]={
  423. 0xD4,0xC1,0x42,0x37,0x38,0x58,0x31,0x34,
  424. };
  425. // len = strlen(sutProductPara.REG);
  426. // if(!len){
  427. // Regist.CityID = ((TS_CITYID>>8)&0xffff);
  428. // Regist.CityID = (TS_CITYID&0xffff);
  429. // Regist.CityID = ((TS_CITYID>>24)&0xffff);
  430. // Regist.CityID = ((TS_CITYID>>16)&0xffff);
  431. //
  432. // Regist.proID =((TS_PROID>>8)&0xff);
  433. // Regist.proID =(TS_PROID&0xff);
  434. //
  435. // for(i = 0; i < 5; i++){
  436. // Regist.Manufacturers[i] = acTemp[i];
  437. // }
  438. // for(i = 0; i < 20; i++){
  439. // Regist.TerMod[i]= acTemp[i+5];
  440. // }
  441. // for(i = 0; i < 4; i++){
  442. // Regist.TerID[i]= acTemp[i+25];
  443. // }
  444. //
  445. // Regist.PlateColor=0x01;//未上牌取值为0
  446. // // 车牌颜色为0 表示车辆VIN
  447. // for(i = 0; i < 8; i++){//7会返回
  448. // Regist.Plate[i] = TSacTemp[i];
  449. // }
  450. // }else{
  451. Regist.proID =((sutProductPara.proID>>8)&0xff);
  452. Regist.proID =(sutProductPara.proID&0xff);
  453. Regist.CityID = ((sutProductPara.CityID>>24)&0xffff);
  454. Regist.CityID = ((sutProductPara.CityID>>16)&0xffff);
  455. Regist.CityID = ((sutProductPara.CityID>>8)&0xffff);
  456. Regist.CityID = (sutProductPara.CityID&0xffff);
  457. for(i = 0; i < 5; i++){
  458. Regist.Manufacturers[i] = sutProductPara.Manufacturers[i];
  459. }
  460. for(i = 0; i < 20; i++){
  461. //sscanf(sutProductPara.TerMod+2*i,"%2x",&Table1[i]);
  462. if((i<20)&&(sutProductPara.TerMod[i]!='0')){
  463. //sscanf(sutProductPara.TerMod+2*i,"%2x",&Table1[i]);
  464. Regist.TerMod[i]= sutProductPara.TerMod[i];
  465. }else{
  466. Regist.TerMod[i]=0x00;
  467. }
  468. }
  469. for(i = 0; i < 4; i++){
  470. sscanf(sutProductPara.TerID+2*i,"%2x",&Temp1[i]);
  471. Regist.TerID[i]= Temp1[i];
  472. }
  473. Regist.PlateColor=sutProductPara.PlateColor;//
  474. for(i = 0; i < 8; i++){
  475. sscanf(sutProductPara.Plate+2*i,"%2x",&Temp[i]);
  476. Regist.Plate[i] = Temp[i];
  477. }
  478. // }
  479. }
  480. /************************************************************
  481. 终端注册、注销
  482. *3431303030制作商ID
  483. 3230313430340000000000000000000000000000终端型号
  484. 30303030313131 终端ID
  485. *************************************************************/
  486. uint32_t Process_TSRegistration(char* buf, uint32_t len)
  487. {
  488. unsigned char SendBuf[100];
  489. unsigned short PacketLen;
  490. if(g_ucSelect==1){
  491. TSMakeSendData();
  492. }else{
  493. TSRegData(sutProductPara.PSN);
  494. }
  495. //REGISTRATION Regist;
  496. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_REGISTRATION,(unsigned char *)&Regist,sizeof(REGISTRATION));
  497. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  498. return len;
  499. }
  500. void Registration(void)
  501. {
  502. if(sutProductPara.SIMFlag){SIMReg();}
  503. #if 0
  504. if(sutProductPara.Select==1) TSMakeSendStrData(); // 串口注册
  505. else TSRegData(sutProductPara.PSN);
  506. #else
  507. TSRegData(sutProductPara.PSN);
  508. #endif
  509. }
  510. void RegistrationLogout(void)
  511. {
  512. unsigned char SendBuf[100];
  513. unsigned short PacketLen;
  514. unsigned char *data=NULL;
  515. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_CANCELLATION,data,0);
  516. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  517. }
  518. /************************************************************
  519. 终端鉴权
  520. *************************************************************/
  521. void Authentication(void)
  522. {
  523. unsigned char SendBuf[100];
  524. unsigned short PacketLen;
  525. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_AUTHENTICATION,(unsigned char *)&sutProductPara.AutH,sizeof(AUTH));//实际是返回的鉴权信息
  526. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  527. }
  528. //以下
  529. uint32_t Process_TSAuthentication(char* buf, uint32_t len)
  530. {
  531. unsigned char SendBuf[100];
  532. unsigned short PacketLen;
  533. TSMakeGpsSendData();
  534. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_AUTHENTICATION,(unsigned char *)&auth,sizeof(AUTH));
  535. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  536. return len;
  537. }
  538. /************************************************************
  539. 位置信息查询
  540. *************************************************************/
  541. uint32_t Process_TSCenterGetPos_rsp(unsigned char* buf, unsigned short len)
  542. {
  543. unsigned char SendBuf[100];
  544. unsigned short PacketLen;
  545. TSMakeGpsSendData();
  546. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_LOCATION_INFORMATION_INQUIRY,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  547. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  548. return 0;
  549. }
  550. uint32_t Process_TSClient_rsp(char* buf, unsigned short len)
  551. {
  552. if(!sutGpsInfo.isServerLogin){
  553. sutGpsInfo.isServerLogin=1;
  554. SlwTrace(INF,"[Gps Logined]",1);
  555. }
  556. return 0;
  557. }
  558. /**************************************************************************************************
  559. *看下 如果一直发注册信息会如何
  560. ***************************************************************************************************/
  561. void TSGpsTimingSendPos(void)
  562. {
  563. unsigned char SendBuf[100];
  564. unsigned short PacketLen;
  565. //if(sutGpsInfo.isGpsWork==0)return;
  566. TSMakeGpsSendData();
  567. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_LOCATION_INFORMATION_REPORTING,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  568. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  569. return ;
  570. }
  571. /***********************************************************************************
  572. *服务器设置主动上报时间
  573. *数据格式
  574. HEAD1 HEAD2 CMD LEN1 LEN2 PSN1 PSN2 PSN3 PSN4 X1 X2 CHECK END
  575. 29 29 34 00 08 PSN[4] X1 X2 CHECK 0D
  576. time=X1*256+X2
  577. ***********************************************************************************/
  578. uint32_t Process_TSCenterGetPosTimerout(char* buf, uint32_t len)
  579. {
  580. char SendBuf[100];
  581. unsigned short t;
  582. unsigned short PacketLen;
  583. //跳过终端序列号4 bytes
  584. //获取时间
  585. sutGpsInfo.GPS_UploadTime =((unsigned short)buf[9]&0xff<<8) + (unsigned short)buf[10]&0xff ;
  586. sprintf(SendBuf,"[GpsTime=%d]",sutGpsInfo.GPS_UploadTime);
  587. SlwTrace(INF,SendBuf,1);
  588. TSMakeGpsSendData();
  589. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_EVENT_REPORT,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  590. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  591. return len;
  592. }
  593. /************************************************************
  594. 建立好连接后,向平台发送终端鉴权消息进行鉴权、建立链接
  595. *************************************************************/
  596. /************************************************************
  597. 连接建立和终端鉴权成功后,终端周期性向平台发送终端心跳信息,拼图收到后
  598. 向终端发送平台通用应答消息,发送周期由终端参数指定、链接维持
  599. *************************************************************/
  600. uint32_t Process_TSPlatformAnswer(char* buf, uint32_t len)
  601. {
  602. unsigned char SendBuf[100];
  603. unsigned short PacketLen;
  604. TSMakeGpsSendData();
  605. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_PLATFORM_UNIVERSAL_ANSWER,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  606. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  607. return 0;
  608. }
  609. uint32_t Process_TSTerminalHeartbeat(char* buf, uint32_t len)
  610. {
  611. unsigned char SendBuf[100];
  612. unsigned short PacketLen;
  613. TSMakeGpsSendData();
  614. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_HEARTBEAT,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  615. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  616. return 0;
  617. }
  618. void TS_SendHeartTick(void)
  619. {
  620. unsigned char SendBuf[100];
  621. unsigned short PacketLen;
  622. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_HEARTBEAT,0,0);
  623. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  624. }
  625. /************************************************************
  626. 平台主发消息,终端主发消息
  627. *************************************************************/
  628. /******************************************************************************
  629. *目前服务器只做了:注册,取消注册,位置信息,鉴权消息
  630. *******************************************************************************/
  631. TSCmd_struct TSCmd_info[] =
  632. {
  633. {TS_TERMINAL_REGISTRATION, Process_TSRegistration},//终端注册
  634. // {TS_TERMINAL_REGISTRATION_REPLY, Process_TSRegistrationReply},//终端注册应答
  635. {TS_TERMINAL_AUTHENTICATION, Process_TSAuthentication},//鉴权
  636. // {TS_SETTING_TERMINAL_PARAMETERS, Process_TSParametersSet},
  637. {TS_LOCATION_INFORMATION_INQUIRY, Process_TSCenterGetPos_rsp},//位置查询
  638. // {XINGAN_PACKET_CENTER_CMD_GET_STAT, Process_XinganCenterGetStat_rsp},
  639. // {XINGAN_PACKET_CENTER_CMD_RESET, Process_XinganCenterReset_rsp},
  640. // {XINGAN_PACKET_CENTER_CMD_DEFAULT_SET, Process_XinganCenterDefaultSet_rsp},
  641. {TS_TERMINAL_HEARTBEAT, Process_TSCenterGetPosTimerout},
  642. // {XINGAN_PACKET_CENTER_CMD_GET_POS_LENOUT, Process_XinganCenterGetPosLenout},
  643. // {XINGAN_PACKET_CENTER_CMD_CLOSE_WARNING, Process_XinganCenterCloseWarning_rsp},
  644. // {XINGAN_PACKET_CENTER_CMD_OPEN_OIL_WAY, Process_XinganCenterOpenOilWay_rsp},
  645. // {XINGAN_PACKET_CENTER_CMD_CLOSE_OIL_WAY, Process_XinganCenterCloseOilWay_rsp},
  646. // {XINGAN_PACKET_CENTER_CMD_GET_VER, Process_XinganCenterGetVer_rsp},
  647. // {XINGAN_PACKET_CENTER_CMD_DIAL_CALL, Process_XinganCenterDialCall_rsp} ,
  648. // {XINGAN_PACKET_CENTER_CMD_HIGH_SPEED_WARNING, Process_XinganCenterHighSpeedWarning_rsp},
  649. // {XINGAN_PACKET_CENTER_CMD_STATISTICS_MILE, Process_XinganCenterStatisticsMile_rsp},
  650. // {XINGAN_PACKET_CENTER_CMD_UDP_IPPORT, Process_XinganCenterIPport_rsp},
  651. // {XINGAN_PACKET_CENTER_CMD_APN, Process_XinganCenterApn_rsp},
  652. //
  653. {TS_EVENT_REPORT, Process_TSClient_rsp},
  654. //
  655. // {XINGAN_PACKET_CLIENT_CMD_CONNECT, Process_XinganClientConnectReq},
  656. // {XINGAN_PACKET_CLIENT_SEND_POS_DATA, Process_XinganClientSendPosData},
  657. // {XINGAN_PACKET_CLIENT_CMD_SEND_WARNING_DATA, Process_XinganClientSendWarnData},
  658. //{TS_QUERY_TERMINAL_PARAMETERS, Process_TSParametersQuery},
  659. //{TS_TERMINAL_CONTROL, Process_TSTerminalContrl},
  660. {TS_PLATFORM_UNIVERSAL_ANSWER, Process_TSPlatformAnswer},
  661. {TS_TERMINAL_HEARTBEAT, Process_TSTerminalHeartbeat},
  662. };
  663. TSGPS_process_packet GetTSProcessFun(uint32_t Cmd)
  664. {
  665. uint32_t j;
  666. for(j=0;j<sizeof(TSCmd_info)/sizeof(TSCmd_struct);j++)
  667. {
  668. if(Cmd == TSCmd_info[j].cmd)
  669. {
  670. return TSCmd_info[j].process_packet;
  671. }
  672. }
  673. return NULL;
  674. }
  675. /***************************************************************
  676. 处理GPS服务器发过来的信息
  677. 返回:
  678. 无效消息 不处理 返回0
  679. 否则返回命令码
  680. ****************************************************************/
  681. unsigned char TSGpsServerProcess(unsigned char *data, unsigned short DataLen)//4处
  682. {
  683. unsigned char cmd;
  684. TSGPS_process_packet ProcessFun;
  685. cmd=TSGpsServerCheckPack(data,DataLen);
  686. if(255 == cmd) return 0;
  687. ProcessFun = GetTSProcessFun(cmd);
  688. if(ProcessFun !=NULL)
  689. {
  690. ProcessFun(data, DataLen);
  691. }
  692. return cmd;
  693. }
  694. /*********************************************************
  695. *************************************************************/
  696. unsigned long power(int base, int times)
  697. {
  698. int i;
  699. unsigned long rslt = 1;
  700. for(i=0; i<times; i++){
  701. rslt *= base;
  702. }
  703. return rslt;
  704. }
  705. /********************************************************
  706. BCD转10进制
  707. ********************************************************/
  708. unsigned long BCDtoDec(const unsigned char *bcd, int length)
  709. {
  710. int i, tmp;
  711. unsigned long dec = 0;
  712. for(i=0; i<length; i++)
  713. {
  714. tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);
  715. dec += tmp * power(100, length-1-i);
  716. }
  717. return dec;
  718. }
  719. /********************************************************
  720. 10进制转BCD
  721. ********************************************************/
  722. int DectoBCD(int Dec, unsigned char *Bcd, int length)
  723. {
  724. int i;
  725. int temp;
  726. for(i=length-1; i>=0; i--)
  727. {
  728. temp = Dec%100;
  729. Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
  730. Dec /= 100;
  731. }
  732. return 0;
  733. }
  734. //#define GPS_DEBUG_GPS_SEND_DATA
  735. /***************************************************************************
  736. *MakeGpsSendData
  737. 根据sutGpsInfo生成sutGpsSendData
  738. ****************************************************************************/
  739. void TSMakeGpsSendData(void)//5处
  740. {
  741. char sv[17];
  742. char data[3];
  743. char buf[10];
  744. int buf1[3];
  745. int j,temp,num;
  746. char *pTemp;
  747. char WWWW[5];
  748. static int Table[4]={0};
  749. static int Table1[4]={0};
  750. sutGpsSendData.Time[0] = sutGpsInfo.year;
  751. sutGpsSendData.Time[1] = sutGpsInfo.month;
  752. sutGpsSendData.Time[2] = sutGpsInfo.day;
  753. sutGpsSendData.Time[3] = sutGpsInfo.hour;
  754. sutGpsSendData.Time[4] = sutGpsInfo.minu;
  755. sutGpsSendData.Time[5] = sutGpsInfo.sec;
  756. sutGpsSendData.St=0x00;
  757. if(sutGpsInfo.isGpsValid)
  758. {//wjl 1121
  759. sutGpsSendData.status |=(0x01<<24);//ACC
  760. sutGpsSendData.status |=(0x01<<25);//定位标志
  761. sutGpsSendData.status |=(0x01<<28);//运营状态
  762. }else sutGpsSendData.status=0;
  763. sutGpsSendData.Mileag=((sutGpsInfo.StatisticsMile>>8)&0xFF)|(((sutGpsInfo.StatisticsMile)&0xFF)<<8);
  764. sutGpsSendData.SSFF=((sutGpsInfo.speed>>8)&0xFF)|(((sutGpsInfo.speed)&0xFF)<<8);
  765. sutGpsSendData.Acpect=sutGpsInfo.aspect;
  766. GetCoordinates(1);
  767. sutGpsSendData.WWWW[0] = sutGpsInfo.testWD>>24;
  768. sutGpsSendData.WWWW[1] = sutGpsInfo.testWD>>16;
  769. sutGpsSendData.WWWW[2] = sutGpsInfo.testWD>>8;
  770. sutGpsSendData.WWWW[3] = sutGpsInfo.testWD;
  771. sutGpsSendData.JJJJ[0] = sutGpsInfo.testJD>>24;
  772. sutGpsSendData.JJJJ[1] = sutGpsInfo.testJD>>16;
  773. sutGpsSendData.JJJJ[2] = sutGpsInfo.testJD>>8;
  774. sutGpsSendData.JJJJ[3] = sutGpsInfo.testJD;
  775. }
  776. void AscStrTurnHexStr(char *AscStr, char *HexStr)
  777. {
  778. char *pAscStr=AscStr;
  779. int i=4;
  780. unsigned char d,h,l;
  781. while(i){
  782. d=(unsigned char)*pAscStr++;
  783. l=d&0x0f;
  784. h=d>>4;
  785. *HexStr++=AscToHex(h);
  786. *HexStr++=AscToHex(l);
  787. i--;
  788. }
  789. *HexStr=0;
  790. }
  791. void getData(void)
  792. {
  793. // char buf[10];
  794. // char buf1[8];
  795. // char buf2[4]={0};
  796. // char temp[3];
  797. // char temp1[3];
  798. // char temp2[5];
  799. // char temp3[5];
  800. // char data[6];
  801. // char data1[6];
  802. // char data2[6];
  803. // int i,num,num1,j,w,Gdata,k;
  804. // double Jnum1,Jnum2,Jnum3;//有小数位 8位有效
  805. // double Wnum1,Wnum2,Wnum3;//有小数位 8位有效
  806. // char b[]="0123456789ABCDEF";
  807. // MakeGpsSendData();
  808. //// AscStrToHexStr((char *)sutLcdGpsSendData.JJJJ,buf1);
  809. // AscStrTurnHexStr((char *)sutLcdGpsSendData.JJJJ,buf1);
  810. // memset(temp, 0, sizeof(temp));
  811. // for(i=0;i<3;i++){
  812. // temp[i]=buf1[i];
  813. // }
  814. // j=atoi(temp);
  815. // memset(temp2, 0, sizeof(temp2));
  816. // for(i=0;i<6;i++){
  817. // temp2[i]=buf1[i+3];
  818. // }
  819. // num=atoi(temp2);
  820. // Jnum1=num/1000;
  821. // Jnum1 /=60;
  822. // Jnum2 = (num%1000)*60;
  823. // Jnum2 /=3600000;
  824. // Jnum3=Jnum1+Jnum2;
  825. //
  826. // //sutLcdGpsSendData.j=j*1000000+Jnum3*1000000;
  827. // sutLcdGpsSendData.j = (j+Jnum3)*1000000;
  828. // sprintf(buf,",%d,",sutLcdGpsSendData.j);
  829. // SlwTrace(INF,buf);
  830. // i =0;
  831. // k=6;
  832. // memset(data, 0, sizeof(data));
  833. // while(sutLcdGpsSendData.j>0){
  834. // data[i]=sutLcdGpsSendData.j%16;
  835. // GPSDataBuf[k]=b[data[i]];//data1
  836. // sutLcdGpsSendData.j=sutLcdGpsSendData.j/16;
  837. // k--;
  838. // i++;
  839. // }
  840. // SlwTrace(INF,GPSDataBuf);
  841. //// AscStrToHexStr((char *)sutLcdGpsSendData.WWWW,buf2);
  842. // AscStrTurnHexStr((char *)sutLcdGpsSendData.WWWW,buf2);
  843. // for(i=0;i<3;i++){
  844. // temp1[i]=buf2[i];
  845. // }
  846. // w=atoi(temp1);
  847. // for(i=0;i<6;i++){//5
  848. // temp3[i]=buf2[i+3];
  849. // }
  850. // num1=atoi(temp3);
  851. // Wnum1=num1/1000;
  852. // Wnum1 /=60;
  853. // Wnum2 = (num1%1000)*60;
  854. // Wnum2 /=3600000;
  855. // Wnum3=Wnum1+Wnum2;
  856. //
  857. // //sutLcdGpsSendData.W=w*1000000+Wnum3*1000000;
  858. // sutLcdGpsSendData.W=(w+Wnum3)*1000000;
  859. // buf[0]=0;
  860. // sprintf(buf,"%d",sutLcdGpsSendData.W);
  861. // SlwTrace(INF,buf);
  862. // i =0;
  863. // k=6;
  864. // data1[0]=0;
  865. // while(sutLcdGpsSendData.W>0){
  866. // data1[i]=sutLcdGpsSendData.W%16;
  867. // GPSDataBuf1[k]=b[data1[i]];//data1
  868. // sutLcdGpsSendData.W=sutLcdGpsSendData.W/16;
  869. // k--;
  870. // i++;
  871. // }
  872. // SlwTrace(INF,GPSDataBuf1);
  873. // buf[0]=0;
  874. // sprintf(buf,"%d",sutLcdGpsSendData.j);
  875. // SlwTrace(INF,buf);
  876. // buf[0]=0;
  877. // sprintf(buf,"%d",sutLcdGpsSendData.W);
  878. // SlwTrace(INF,buf);
  879. }
  880. void TSRegData(unsigned long PSN){
  881. int i;
  882. static int Temp1[7];
  883. static int Table1[20]={0};
  884. static int Temp[8];
  885. unsigned char SendBuf[100];
  886. unsigned short PacketLen,data1,data2,data3,data4;
  887. Regist.proID=0;
  888. Regist.CityID=0;
  889. for(i = 0; i < 5; i++) Regist.Manufacturers[i] = 0;
  890. for(i = 0; i < 20; i++) Regist.TerMod[i]= 0x00;
  891. Regist.TerID[0]=(unsigned char)((PSN>>24)&0xff);//没出来显示乱码
  892. Regist.TerID[1]=(unsigned char)((PSN>>16)&0xff);
  893. Regist.TerID[2]=(unsigned char)((PSN>>8)&0xff);
  894. Regist.TerID[3]=(unsigned char)(PSN&0xff);
  895. for(i = 0; i < 3; i++) Regist.TerID[i+4]= 0x00;
  896. Regist.PlateColor=0;
  897. for(i = 0; i < 8; i++) Regist.Plate[i] = 0x00;
  898. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_REGISTRATION,(unsigned char *)&Regist,sizeof(REGISTRATION));
  899. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  900. }
  901. void SIMReg(void)
  902. {
  903. int i;
  904. static int Table1[6]={0};
  905. for(i = 0; i < 6; i++){
  906. sscanf(sutProductPara.SIM+2*i,"%2x",&Table1[i]);
  907. SimData.SIM[i]= Table1[i];
  908. }
  909. }