TSGpsProcess.c 30 KB

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