TSGpsProcess.c 28 KB

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