TSGpsProcess.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  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. REGISTRATION Regist;
  16. AVL_MSG_BODY_ATTRIB msgBodyAttrib;
  17. MSG_HEAD msghead;
  18. MSG_PACKET msgPacket;
  19. AUTH auth;
  20. SIM SimData;
  21. SUT_LCDGPS_SEND_DATA sutLcdGpsSendData;
  22. //从厂商编号到用户数据依次累加的累加和,取累加的档�8位作为校验码
  23. unsigned char TSGetCheckSum(unsigned char *pData,int len)
  24. {
  25. int i;
  26. unsigned char sum= pData[1];
  27. for(i=1;i<len-1;i++)
  28. sum=sum^pData[i+1];
  29. return sum;
  30. }
  31. /*************************************************************************************
  32. *
  33. **************************************************************************************/
  34. // replace 0x7d 0x01 with 0x7d and 0x7d 0x02 with 0x7e 接收
  35. //长度不会变大,只会变小或不变
  36. int reduce(unsigned char *pData,int DataLen)
  37. {
  38. unsigned char *p = pData;
  39. int data_len=0;
  40. int i;
  41. if(DataLen==0) return 0;
  42. for(i=0;i<DataLen-1;i++)
  43. {
  44. if(pData[i] == 0x7d && pData[i+1] == 0x01)
  45. {
  46. *p++ = 0x7d;i++;
  47. }else if(pData[i] == 0x7d && pData[i+1] == 0x02)
  48. {
  49. *p++ = 0x7e;i++;
  50. }else *p++=pData[i];
  51. data_len++;
  52. }
  53. return data_len;
  54. }
  55. // loop every character, replace 0x7d with 0x7d 0x01 and 0x7e with 0x7d 0x02 发送
  56. int escapse(unsigned char *pData,int DataLen) {
  57. unsigned char *p= (unsigned char *)malloc(DataLen * 2);
  58. unsigned char * q = p;
  59. int data_len = 0;
  60. int i;
  61. if (DataLen == 0) {
  62. return 0;
  63. }
  64. memset(p, 0, DataLen * 2);
  65. for (i = 0; i < DataLen; i ++) {
  66. if (pData[i] == 0x7d) {
  67. *q ++ = 0x7d;
  68. *q ++ = 0x01;
  69. data_len += 2;
  70. } else if (pData[i] == 0x7e) {
  71. *q ++ = 0x7d;
  72. *q ++ = 0x02;
  73. data_len += 2;
  74. } else {
  75. *q ++ = pData[i];
  76. data_len += 1;
  77. }
  78. }
  79. memcpy(pData, p, data_len);
  80. free(p);
  81. DataLen = data_len;
  82. //free(p);
  83. return DataLen;
  84. }
  85. /******************************************************/
  86. int* TenToTwo(int Datalen)
  87. {
  88. static int c[10]={0};
  89. int i=0;
  90. do {
  91. c[i++]=Datalen%2;
  92. Datalen/=2;
  93. } while(Datalen!=0);
  94. return c;
  95. }
  96. /**********************
  97. **消息头12字节,消息体属性2个字节,这两个字节的16位。低10位是消息体长度
  98. 因此消息消息最长小于1024字节,Bit13是分包标志,看终端发到平台一个消息,可能很长,一个消息体发不完,分包发出去那么
  99. Bit12置为1,消息头长度变成16字节,消息头的后4个字节为消息包分装项内容,总共
  100. 有多少个包,这次发送的消息包是分包中的第几个消息包
  101. sutProductPara.APN
  102. **************************/
  103. int TSGpsPacket(unsigned char *Buffer,unsigned long PSN,unsigned short ID,unsigned char *pData,int DataLen)
  104. {
  105. static unsigned short liushiID=0;
  106. unsigned char *pBuf=Buffer,sum;
  107. int j,flag = 0,i=0;
  108. int talpage=1,MSnum = 0;
  109. char Psnsv[11];
  110. static unsigned short snum = 1;
  111. unsigned short Len=DataLen+6;
  112. unsigned short pageItem=DataLen+12;
  113. sprintf(Psnsv,"%010u",(unsigned int)PSN);
  114. pBuf[i++]=0x7e;
  115. pBuf[i++]=(ID>>8)&0xff;
  116. pBuf[i++]=ID&0xff;
  117. //消息体属性
  118. msgBodyAttrib.EncrypType=NO_ENCRYP;//NO_ENCRYP;
  119. msgBodyAttrib.msgBodyLength=(DataLen);
  120. pBuf[i++]=msgBodyAttrib.EncrypType;
  121. pBuf[i++]=msgBodyAttrib.msgBodyLength;
  122. //SIM卡号
  123. if(sutNewSegmentPara.SIMFlag!=1){
  124. pBuf[i++]=0; //
  125. for (j=0;j<10;j+=2)
  126. {
  127. pBuf[i++]=(Psnsv[j]<<4)|(Psnsv[j+1]&0x0F);
  128. }
  129. }else{
  130. for(j=0;j<6;j++){
  131. pBuf[i++]=SimData.SIM[j];
  132. }
  133. }
  134. //消息流水号
  135. pBuf[i++] = (liushiID>>8)&0xff;
  136. pBuf[i++] = liushiID&0xff;
  137. liushiID++;
  138. if(pData!=NULL)
  139. {
  140. //snum++;
  141. //消息包封装项
  142. //msgPacket.msgPacketID=0x30;
  143. //msgPacket.msgTotalCount=0x30;
  144. //pBuf[i++] = msgPacket.msgPacketID;
  145. //pBuf[i++] = msgPacket.msgTotalCount;
  146. //MSnum++;
  147. //包封装项 4
  148. for(j=0;j<DataLen;j++)
  149. {//0
  150. pBuf[i++]= pData[j];
  151. }
  152. }
  153. sum = TSGetCheckSum(pBuf,i);
  154. pBuf[i++] = sum;
  155. //对整体数据,除sum进行转义
  156. i=escapse(&pBuf[1],i-1);//头的7E不转义
  157. i++;
  158. pBuf[i++] = 0x7e;
  159. return i;
  160. }
  161. /************************************************************
  162. 位置信息汇报
  163. *************************************************************/
  164. /**********************************************************************************
  165. GpsSendPosition
  166. 发送位置数据
  167. Head(2) Cmd(2) Len(2) PSN(4) GpsData(34) Check(1) End(1)
  168. Cmd=0x0200
  169. 总长度=2+2+2+40=46
  170. ***********************************************************************************/
  171. void TSGpsSendPosition(void)
  172. {
  173. int i;
  174. int len;
  175. char tmp[5];
  176. char buf[150];
  177. unsigned char GpsBuf[50];
  178. len=TSGpsPacket(GpsBuf,sutProductPara.PSN,0x0200,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  179. //sprintf(buf,"AT+ZIPSEND=0,%d\r",len);
  180. sprintf(buf,"AT^IPSEND=1,%d\r",len);//+ 1?
  181. ModemSendAT(buf);
  182. ModemSendData(GpsBuf,len);
  183. strcpy(buf,"SendGpsD:");
  184. for(i=0;i<len;i++){
  185. sprintf(tmp,"%02x,",GpsBuf[i]);
  186. strcat(buf,tmp);
  187. }
  188. //strcat(buf,"\r\n");
  189. SlwTrace(INF,buf,1);
  190. }
  191. /*******************************************************
  192. GPRMC信息,与,之间的子信息处理,存储到相应的结构体中元素中
  193. *******************************************************/
  194. void TSGPS_GPRMC_Handle(unsigned char *ch,unsigned char ch1) //1处
  195. {
  196. unsigned char x,y;
  197. // send_byte('d');
  198. switch(ch1)
  199. {
  200. case 0: //时间
  201. for(x=0,y=0;x<8;x++)
  202. {
  203. if(x==2||x==5){ sutGpsInfo.Time[x]=0x3a;}
  204. else sutGpsInfo.Time[x]=ch[y++];
  205. }
  206. // send_byte(time[7]);
  207. break;
  208. case 1: //状态
  209. sutGpsInfo.Status=ch[0];
  210. break;
  211. case 2: //纬度
  212. for(x=10,y=0;x<17;x++)
  213. {
  214. if(x==12||x==15) {}
  215. else sutGpsInfo.Location[x]=ch[y++];
  216. }
  217. break;
  218. case 3: //南北纬
  219. sutGpsInfo.Location[9]=ch[0];
  220. break;
  221. case 4: //经度
  222. for(x=1,y=0;x<8;x++){
  223. if(x==4||x==7){}
  224. else sutGpsInfo.Location[x]=ch[y++];
  225. }
  226. break;
  227. case 5: //东西经
  228. sutGpsInfo.Location[0]=ch[0];
  229. break;
  230. case 6: //航速
  231. for(x=0;x<6;x++){
  232. sutGpsInfo.Speed[x+1]=ch[x];
  233. }
  234. sutGpsInfo.Speed[6]=0x20;
  235. sutGpsInfo.Speed[7]=0x20;
  236. break;
  237. case 7: //信息自己定义
  238. break;
  239. case 8: //信息自己定义
  240. break;
  241. case 9: //信息自己定义
  242. break;
  243. case 10: //信息自己定义
  244. break;
  245. case 11: //信息自己定义
  246. break;
  247. default:break;
  248. }
  249. }
  250. /*******************************************************
  251. 处理GPRMC信息
  252. *******************************************************/
  253. void TSGPS_GPRMC_Alysis(char *RMC_Data) //2处
  254. {
  255. unsigned char i,j,k;
  256. unsigned char count;
  257. unsigned char temp[10];
  258. //send_byte('a');
  259. for(i=0;i<strlen(RMC_Data);)
  260. {
  261. switch(RMC_Data[i])
  262. {
  263. case '$':
  264. j=i++; //标记$的起始位置
  265. while(RMC_Data[i]!=',') //RMC_Data[i]==','时结束循环。
  266. {i++;}
  267. // uart1_sendbytes(GPRMC[RMC_Count].RMC_ID);
  268. break;
  269. case ',':
  270. j=i++; //标记,的起始位置
  271. while((RMC_Data[i]!=',')&&(RMC_Data[i]!='*')) //RMC_Data[i]==','或者=='*'时结束循环。
  272. {i++;}
  273. if(j+1!=i)
  274. {
  275. for(j=j+1,k=0;j<i;j++)
  276. {
  277. temp[k++]=RMC_Data[j];
  278. }
  279. temp[k]='\0';
  280. // send_byte(temp[0]);
  281. }
  282. else temp[0]='\0';
  283. // send_byte('c');
  284. TSGPS_GPRMC_Handle(temp,count++);
  285. break;
  286. case '*':
  287. i=strlen(RMC_Data); //处理完成,软件结束。
  288. break;
  289. default:break;
  290. }
  291. }
  292. // send_byte('e');
  293. }
  294. void TSGpsDataInit(void)
  295. {
  296. unsigned char *p;
  297. char buf2[20];
  298. p=(unsigned char *)&sutGpsSendData;
  299. memset(p, 0, sizeof(SUT_GPS_SEND_DATA));
  300. p=(unsigned char *)&sutGpsInfo;
  301. memset(p, 0, sizeof(SUT_GPS_INF));
  302. //sutGpsInfo.SendTime=15;
  303. sutGpsInfo.isGpsAuthOk = 0;//未鉴权
  304. }
  305. /*************************************************************************
  306. *检查GPS 服务器发过来的数据包是否正确
  307. 非法 返回0
  308. 合法 返回命令码
  309. **************************************************************************/
  310. //"7e8300 000c 000009771810000001 4130313233343536373839 b87e"
  311. unsigned char TSGpsServerCheckPack(unsigned char *data,unsigned short DataLen)//3处
  312. {
  313. unsigned char cmd;
  314. unsigned short len;
  315. unsigned long PSN;
  316. //判断数据包的包头是否正确
  317. // escapse(data,DataLen);
  318. if(data[0]!=TSGPS_PACK_HEAD)return 0;
  319. //判断数据包的校验是否正确
  320. if(data[DataLen-2] != TSGetCheckSum(data,DataLen-2))
  321. return 255;
  322. //判断数据包的结尾是否正确
  323. if(data[DataLen-1] != TSGPS_PACK_END)
  324. return 255;
  325. //获取数据包的长度 并判断长度是否正确
  326. len=(unsigned short)data[3]*256+data[4];
  327. if(DataLen!=(len+5))return 255;
  328. // //判断终端编号是否正确
  329. // PSN=(unsigned long)data[5]<<24;
  330. // PSN+=(unsigned long)data[6]<<16;
  331. // PSN+=(unsigned long)data[7]<<8;
  332. // PSN+=(unsigned long)data[8];
  333. // if(PSN!=sutNetPara.PSN) return 0;
  334. //解析当前命令
  335. cmd = data[2];
  336. sutGpsInfo.HostCmd = cmd;
  337. return cmd;
  338. }
  339. /**************************************************************************************************
  340. * // TS_PROID 440000
  341. // TS_CITYID 440300
  342. 车牌D4C1423738583134
  343. ***************************************************************************************************/
  344. void TSMakeSendData(void)
  345. {
  346. int i,len;
  347. static int Table1[20]={0};
  348. static int Temp[8];
  349. static int Temp1[4];
  350. const unsigned char acTemp[]=
  351. {
  352. 0x34,0x31,0x30,0x30,0x30,//制造商ID Regist.Manufacturers
  353. 0x32,0x30,0x31,0x34,0x30,0x34,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //终端型号Regist.TerMod
  354. 0x65,0x30,0x30,0x72, //终端IDRegist.TerID
  355. };
  356. const unsigned char TSacTemp[]={0xD4,0xC1,0x42,0x37,0x38,0x58,0x31,0x34};
  357. Regist.proID =((sutNewSegmentPara.proID>>8)&0xff);
  358. Regist.proID =(sutNewSegmentPara.proID&0xff);
  359. Regist.CityID = ((sutNewSegmentPara.CityID>>24)&0xffff);
  360. Regist.CityID = ((sutNewSegmentPara.CityID>>16)&0xffff);
  361. Regist.CityID = ((sutNewSegmentPara.CityID>>8)&0xffff);
  362. Regist.CityID = (sutNewSegmentPara.CityID&0xffff);
  363. for(i = 0; i < 5; i++)
  364. Regist.Manufacturers[i] = sutNewSegmentPara.Manufacturers[i];
  365. for(i = 0; i < 20; i++)
  366. {
  367. if((i<20)&&(sutNewSegmentPara.TerMod[i]!='0')) Regist.TerMod[i]= sutNewSegmentPara.TerMod[i];
  368. else Regist.TerMod[i]=0x00;
  369. }
  370. for(i = 0; i < 4; i++)
  371. {
  372. sscanf(sutNewSegmentPara.TerID+2*i,"%2x",&Temp1[i]);
  373. Regist.TerID[i]= Temp1[i];
  374. }
  375. Regist.PlateColor=sutNewSegmentPara.PlateColor;//
  376. for(i = 0; i < 8; i++)
  377. {
  378. sscanf(sutNewSegmentPara.Plate+2*i,"%2x",&Temp[i]);
  379. Regist.Plate[i] = Temp[i];
  380. }
  381. }
  382. /************************************************************
  383. 终端注册、注销
  384. *3431303030制作商ID
  385. 3230313430340000000000000000000000000000终端型号
  386. 30303030313131 终端ID
  387. *************************************************************/
  388. uint32_t Process_TSRegistration(char* buf, uint32_t len)
  389. {
  390. unsigned char SendBuf[100];
  391. unsigned short PacketLen;
  392. if(sutNewSegmentPara.Select==1) TSMakeSendData();
  393. else TSRegData(sutProductPara.PSN);
  394. //REGISTRATION Regist;
  395. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_REGISTRATION,(unsigned char *)&Regist,sizeof(REGISTRATION));
  396. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  397. return len;
  398. }
  399. void Registration(void)
  400. {
  401. SlwTrace(INF, "Registration",1);
  402. if(sutNewSegmentPara.SIMFlag){SIMReg();}
  403. TSRegData(sutProductPara.PSN);
  404. }
  405. void RegistrationLogout(void)
  406. {
  407. unsigned char SendBuf[100];
  408. unsigned short PacketLen;
  409. unsigned char *data=NULL;
  410. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_CANCELLATION,data,0);
  411. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  412. }
  413. /************************************************************
  414. 终端鉴权
  415. *************************************************************/
  416. void Authentication(void)
  417. {
  418. unsigned char SendBuf[100];
  419. unsigned short PacketLen;
  420. unsigned char temp[27];
  421. SlwTrace(INF, "Authentication!",1);
  422. memset(temp,0,sizeof(temp));
  423. memcpy(temp,(unsigned char *)&sutNewSegmentPara.AutH,sizeof(sutNewSegmentPara.AutH));
  424. memcpy(&temp[sizeof(sutNewSegmentPara.AutH)],CCID,sizeof(CCID));
  425. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_AUTHENTICATION,temp,sizeof(temp));//实际是返回的鉴权信息
  426. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  427. }
  428. //以下
  429. uint32_t Process_TSAuthentication(char* buf, uint32_t len)
  430. {
  431. unsigned char SendBuf[100];
  432. unsigned short PacketLen;
  433. TSMakeGpsSendData();
  434. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_AUTHENTICATION,(unsigned char *)&auth,sizeof(AUTH));
  435. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  436. return len;
  437. }
  438. /************************************************************
  439. 位置信息查询
  440. *************************************************************/
  441. uint32_t Process_TSCenterGetPos_rsp(unsigned char* buf, unsigned short len)
  442. {
  443. unsigned char SendBuf[100];
  444. unsigned short PacketLen;
  445. TSMakeGpsSendData();
  446. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_LOCATION_INFORMATION_INQUIRY,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  447. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  448. return 0;
  449. }
  450. uint32_t Process_TSClient_rsp(char* buf, unsigned short len)
  451. {
  452. if(!sutGpsInfo.isServerLogin){
  453. sutGpsInfo.isServerLogin=1;
  454. SlwTrace(INF,"[Gps Logined]",1);
  455. }
  456. return 0;
  457. }
  458. /**************************************************************************************************
  459. *看下 如果一直发注册信息会如何
  460. ***************************************************************************************************/
  461. void TSGpsTimingSendPos(void)
  462. {
  463. unsigned char SendBuf[100];
  464. unsigned short PacketLen;
  465. TSMakeGpsSendData();
  466. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_LOCATION_INFORMATION_REPORTING,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  467. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  468. }
  469. /***********************************************************************************
  470. *服务器设置主动上报时间
  471. *数据格式
  472. HEAD1 HEAD2 CMD LEN1 LEN2 PSN1 PSN2 PSN3 PSN4 X1 X2 CHECK END
  473. 29 29 34 00 08 PSN[4] X1 X2 CHECK 0D
  474. time=X1*256+X2
  475. ***********************************************************************************/
  476. uint32_t Process_TSCenterGetPosTimerout(char* buf, uint32_t len)
  477. {
  478. return len;
  479. }
  480. /************************************************************
  481. 建立好连接后,向平台发送终端鉴权消息进行鉴权、建立链接
  482. *************************************************************/
  483. /************************************************************
  484. 连接建立和终端鉴权成功后,终端周期性向平台发送终端心跳信息,拼图收到后
  485. 向终端发送平台通用应答消息,发送周期由终端参数指定、链接维持
  486. *************************************************************/
  487. uint32_t Process_TSPlatformAnswer(char* buf, uint32_t len)
  488. {
  489. unsigned char SendBuf[100];
  490. unsigned short PacketLen;
  491. TSMakeGpsSendData();
  492. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_PLATFORM_UNIVERSAL_ANSWER,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  493. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  494. return 0;
  495. }
  496. uint32_t Process_TSTerminalHeartbeat(char* buf, uint32_t len)
  497. {
  498. unsigned char SendBuf[100];
  499. unsigned short PacketLen;
  500. TSMakeGpsSendData();
  501. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_HEARTBEAT,(unsigned char *)&sutGpsSendData,sizeof(SUT_GPS_SEND_DATA));
  502. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  503. return 0;
  504. }
  505. void TS_SendHeartTick(void)
  506. {
  507. unsigned char SendBuf[100];
  508. unsigned short PacketLen;
  509. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_HEARTBEAT,0,0);
  510. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  511. }
  512. /*********************************************************
  513. *************************************************************/
  514. unsigned long power(int base, int times)
  515. {
  516. int i;
  517. unsigned long rslt = 1;
  518. for(i=0; i<times; i++){
  519. rslt *= base;
  520. }
  521. return rslt;
  522. }
  523. /********************************************************
  524. BCD转10进制
  525. ********************************************************/
  526. unsigned long BCDtoDec(const unsigned char *bcd, int length)
  527. {
  528. int i, tmp;
  529. unsigned long dec = 0;
  530. for(i=0; i<length; i++)
  531. {
  532. tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);
  533. dec += tmp * power(100, length-1-i);
  534. }
  535. return dec;
  536. }
  537. /********************************************************
  538. 10进制转BCD
  539. ********************************************************/
  540. int DectoBCD(int Dec, unsigned char *Bcd, int length)
  541. {
  542. int i;
  543. int temp;
  544. for(i=length-1; i>=0; i--)
  545. {
  546. temp = Dec%100;
  547. Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
  548. Dec /= 100;
  549. }
  550. return 0;
  551. }
  552. void AscStrTurnHexStr(char *AscStr, char *HexStr)
  553. {
  554. char *pAscStr=AscStr;
  555. int i=4;
  556. unsigned char d,h,l;
  557. while(i){
  558. d=(unsigned char)*pAscStr++;
  559. l=d&0x0f;
  560. h=d>>4;
  561. *HexStr++=AscToHex(h);
  562. *HexStr++=AscToHex(l);
  563. i--;
  564. }
  565. *HexStr=0;
  566. }
  567. void MakeGpsSendData(void)
  568. {
  569. char buf[12];
  570. unsigned char *data=(unsigned char *)&sutLcdGpsSendData;
  571. memset(data, 0, sizeof(SUT_LCDGPS_SEND_DATA));
  572. data[0] = (sutGpsInfo.latitue>>24)&0xFF;
  573. data[1] = (sutGpsInfo.latitue>>16)&0xFF;
  574. data[2] = (sutGpsInfo.latitue>>8)&0xFF;
  575. data[3] = (sutGpsInfo.latitue)&0xFF;
  576. data[4] = (sutGpsInfo.longitue>>24)&0xFF;
  577. data[5] = (sutGpsInfo.longitue>>16)&0xFF;
  578. data[6] = (sutGpsInfo.longitue>>8)&0xFF;
  579. data[7] = (sutGpsInfo.longitue)&0xFF;
  580. // sprintf(buf,"%d",sutGpsInfo.latitue);
  581. // SlwTrace(INF,buf,1);
  582. // buf[0]=0;
  583. // sprintf(buf,"%d",sutGpsInfo.longitue);
  584. // SlwTrace(INF,buf,1);
  585. }
  586. /*****************************************************
  587. 深圳北纬22.33 东经114.07
  588. 经过试验数据比较准确,但是东西南北不知道
  589. ******************************************************/
  590. void GetCoordinates(unsigned char type)
  591. {
  592. //type 0 UI时调用
  593. // 1 上传时调用
  594. char buf[10];
  595. char buf0[10]={0};
  596. char buf1[8];
  597. char buf2[4]={0};
  598. char temp[3];
  599. char temp1[3];
  600. char temp2[5];
  601. char temp3[5];
  602. int i,num,num1,w,j;
  603. double Jnum1,Jnum2,Jnum3;//有小数位 8位有效
  604. double Wnum1,Wnum2,Wnum3;//有小数位 8位有效
  605. MakeGpsSendData();
  606. AscStrTurnHexStr((char *)sutLcdGpsSendData.JJJJ,buf1);
  607. memset(temp, 0, sizeof(temp));
  608. for(i=0;i<3;i++) temp[i]=buf1[i];
  609. j=atoi(temp);
  610. memset(temp2, 0, sizeof(temp2));
  611. for(i=0;i<6;i++) temp2[i]=buf1[i+3];
  612. num=atoi(temp2);
  613. Jnum1=num/1000;
  614. Jnum1 /=60;
  615. Jnum2 = (num%1000)*60;
  616. Jnum2 /=3600000;
  617. Jnum3=Jnum1+Jnum2;
  618. sutGpsInfo.testJD = j*1000000+Jnum3*1000000;//上传时使用
  619. AscStrTurnHexStr((char *)sutLcdGpsSendData.WWWW,buf2);
  620. for(i=0;i<3;i++) temp1[i]=buf2[i];
  621. w=atoi(temp1);
  622. for(i=0;i<6;i++) temp3[i]=buf2[i+3];
  623. num1=atoi(temp3);
  624. Wnum1=num1/1000;
  625. Wnum1 /=60;
  626. Wnum2 = (num1%1000)*60;
  627. Wnum2 /=3600000;
  628. Wnum3=Wnum1+Wnum2;
  629. sutGpsInfo.testWD = w*1000000+Wnum3*1000000;
  630. }
  631. //#define GPS_DEBUG_GPS_SEND_DATA
  632. /***************************************************************************
  633. *MakeGpsSendData
  634. 根据sutGpsInfo生成sutGpsSendData
  635. ****************************************************************************/
  636. void TSMakeGpsSendData(void)//5处
  637. {
  638. char sv[17];
  639. char data[3];
  640. char buf[10];
  641. int buf1[3];
  642. int j,temp,num;
  643. char *pTemp;
  644. char WWWW[5];
  645. static int Table[4]={0};
  646. static int Table1[4]={0};
  647. sutGpsSendData.Time[0] = sutGpsInfo.year;
  648. sutGpsSendData.Time[1] = sutGpsInfo.month;
  649. sutGpsSendData.Time[2] = sutGpsInfo.day;
  650. sutGpsSendData.Time[3] = sutGpsInfo.hour;
  651. sutGpsSendData.Time[4] = sutGpsInfo.minu;
  652. sutGpsSendData.Time[5] = sutGpsInfo.sec;
  653. sutGpsSendData.St=0x00;
  654. if(sutGpsInfo.isGpsValid)
  655. {//wjl 1121
  656. sutGpsSendData.status |=(0x01<<24);//ACC
  657. sutGpsSendData.status |=(0x01<<25);//定位标志
  658. sutGpsSendData.status |=(0x01<<28);//运营状态
  659. }else sutGpsSendData.status=0;
  660. sutGpsSendData.Mileag=((sutGpsInfo.StatisticsMile>>8)&0xFF)|(((sutGpsInfo.StatisticsMile)&0xFF)<<8);
  661. sutGpsSendData.SSFF=((sutGpsInfo.speed>>8)&0xFF)|(((sutGpsInfo.speed)&0xFF)<<8);
  662. sutGpsSendData.Acpect=sutGpsInfo.aspect;
  663. GetCoordinates(1);
  664. sutGpsSendData.WWWW[0] = sutGpsInfo.testWD>>24;
  665. sutGpsSendData.WWWW[1] = sutGpsInfo.testWD>>16;
  666. sutGpsSendData.WWWW[2] = sutGpsInfo.testWD>>8;
  667. sutGpsSendData.WWWW[3] = sutGpsInfo.testWD;
  668. sutGpsSendData.JJJJ[0] = sutGpsInfo.testJD>>24;
  669. sutGpsSendData.JJJJ[1] = sutGpsInfo.testJD>>16;
  670. sutGpsSendData.JJJJ[2] = sutGpsInfo.testJD>>8;
  671. sutGpsSendData.JJJJ[3] = sutGpsInfo.testJD;
  672. }
  673. void TSRegData(unsigned long PSN){
  674. int i;
  675. static int Temp1[7];
  676. static int Table1[20]={0};
  677. static int Temp[8];
  678. unsigned char SendBuf[100];
  679. unsigned short PacketLen,data1,data2,data3,data4;
  680. Regist.proID=0;
  681. Regist.CityID=0;
  682. for(i = 0; i < 5; i++) Regist.Manufacturers[i] = 0;
  683. for(i = 0; i < 20; i++) Regist.TerMod[i]= 0x00;
  684. Regist.TerID[0]=(unsigned char)((PSN>>24)&0xff);//没出来显示乱码
  685. Regist.TerID[1]=(unsigned char)((PSN>>16)&0xff);
  686. Regist.TerID[2]=(unsigned char)((PSN>>8)&0xff);
  687. Regist.TerID[3]=(unsigned char)(PSN&0xff);
  688. for(i = 0; i < 3; i++) Regist.TerID[i+4]= 0x00;
  689. Regist.PlateColor=0;
  690. for(i = 0; i < 8; i++) Regist.Plate[i] = 0x00;
  691. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_REGISTRATION,(unsigned char *)&Regist,sizeof(REGISTRATION));
  692. MC8332ModemSendTcpData(GPS_DATA_SOCKET,SendBuf,PacketLen);
  693. }
  694. void SIMReg(void)
  695. {
  696. int i;
  697. static int Table1[6]={0};
  698. for(i = 0; i < 6; i++){
  699. sscanf(sutNewSegmentPara.SIM+2*i,"%2x",&Table1[i]);
  700. SimData.SIM[i]= Table1[i];
  701. }
  702. }