HgsTcpProc.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. /********************************************************************************
  2. * File Name: HgsTcpProc.c
  3. * Function Describe:The HgsTcpProc for the system
  4. * Relate Module:
  5. * Explain: Hardware version is
  6. * Writer: wuzhao
  7. * Date: 2016.12.8
  8. *******************************************************************************/
  9. //--------------------------------------------------------------------------------
  10. #include "includes.h"
  11. #if(USE_CONFIG_FUN==1)
  12. CONFIG_SER_DEF sutConfig;
  13. #endif
  14. #define POC_TIME_OUT_1 180 //seconds
  15. #define POC_TIME_OUT_2 60 //TCP连接失败或发送登陆包超三次后重新按此时间计时
  16. //负载均衡思想
  17. //目的,后台管理会给终端分配所属交换服务器
  18. //终端处理方法:
  19. //1、每次开机都会访问管理服务器ManaIP,如果成功则获取到非0的IP,检测是否与本地原PIP一致,如果不一致,则重置模块参数,并保存新PIP到本地,然后重启整机系统
  20. //2、如果开机后登陆不上(判定A)交换IP,则启动登陆管理服务器获取新IP,如果与本地一致,不改变本地参数,继续登陆交换服务器,如果一致,则更新并复位整机系统
  21. //3、如果成功登陆过后,然后掉线后再也登陆不上(判定B)交换服务器,则启动登陆管理服务器获取新IP,如果与本地一致,不改变本地参数,继续登陆交换服务器,如果一致,则更新并复位整机系统
  22. //判定A:即未登陆状态,从配置完POC参数后开始计时(PocTimeoutCnt),如果登录成功则重置PocTimeoutCnt计数,且不再计数,如果掉线后则再次清PocTimeoutCnt且开始计时,超过3分钟(待定)则判定成功
  23. //判定B:与判定A后半部分类似,即从掉线后开始计时
  24. //注意,执行访问管理服务器时,我们就不处理GPS了。因为此模块查询TCP状态返回不带SOCKET,且代码模式如果更改会比较复杂
  25. unsigned char CCID[20];
  26. unsigned char HigosSendFlag;//发送login包的次数
  27. unsigned char HgsConnetCnt;//发起连接次数
  28. unsigned char HgsConnetStatus;//tcp连接状态
  29. unsigned char HgsProcessResult;//0未知道结果或没测试 1测试不成功, 2测试通过
  30. unsigned char PocStartCnt;
  31. unsigned short PocTimeoutCnt,newCOUNT;
  32. //load part
  33. unsigned char tcpControl;
  34. //根据不同的cmd往buffer填充相应的值
  35. //当前支持cmd = 0x12 0x19
  36. unsigned short SendTcpDataFill(unsigned char *buffer, unsigned char cmd,unsigned char status,unsigned char value)
  37. {
  38. unsigned char *p = buffer;
  39. unsigned short i,j;
  40. unsigned char nowCIP[4],nowPIP[4],nowGIP[4];
  41. unsigned short nowCPort,nowPPort,nowGPort;
  42. SUTDL dl;
  43. SUTDS ds;
  44. i=0;
  45. //PSN
  46. dl.Data.ulData = sutProductPara.PSN;
  47. p[i++] = dl.Data.ucData.b4;
  48. p[i++] = dl.Data.ucData.b3;
  49. p[i++] = dl.Data.ucData.b2;
  50. p[i++] = dl.Data.ucData.b1;
  51. //PASS
  52. if(cmd == 0x12)
  53. {
  54. dl.Data.ulData = 0;
  55. p[i++] = dl.Data.ucData.b4;
  56. p[i++] = dl.Data.ucData.b3;
  57. p[i++] = dl.Data.ucData.b2;
  58. p[i++] = dl.Data.ucData.b1;
  59. }
  60. //PName
  61. for(j=0;j<8;j++) p[i++]= sutProductPara.ProductName[j];
  62. //CurVer
  63. ds.Data.usData = sutProductPara.ProductVersion;
  64. p[i++] = ds.Data.ucData.b2;
  65. p[i++] = ds.Data.ucData.b1;
  66. //CCID
  67. for(j=0;j<20;j++) p[i++]= CCID[j];
  68. if(cmd == 0x19)
  69. {
  70. p[i++] = status;
  71. p[i++] = value;
  72. if(status == 1)
  73. {//上报详情
  74. memcpy(nowCIP, sutProductPara.ManagerIP, 4);
  75. nowCPort = sutProductPara.ManagerPort;
  76. if(GetStringIP2Bytes(nowPIP, sutProductPara.PIP)) SlwTrace(INF, "IP Para err1",1);
  77. nowPPort = 0xffff;
  78. if(GetStringIP2Bytes(nowGIP, sutProductPara.GIP)) SlwTrace(INF, "IP Para err2",1);
  79. nowGPort = sutProductPara.GpsPort;
  80. }else if(status == 2)
  81. {//上报结果不需要值
  82. memset(nowCIP, 0, 4);
  83. memset(nowPIP, 0, 4);
  84. memset(nowGIP, 0, 4);
  85. nowCPort=0;nowPPort=0;nowGPort=0;
  86. }else{
  87. }
  88. for(j=0;j<4;j++) p[i++] = nowCIP[j];
  89. ds.Data.usData = nowCPort;
  90. p[i++] = ds.Data.ucData.b2;
  91. p[i++] = ds.Data.ucData.b1;
  92. for(j=0;j<4;j++) p[i++] = nowPIP[j];
  93. ds.Data.usData = nowPPort;
  94. p[i++] = ds.Data.ucData.b2;
  95. p[i++] = ds.Data.ucData.b1;
  96. for(j=0;j<4;j++) p[i++] = nowGIP[j];
  97. ds.Data.usData = nowGPort;
  98. p[i++] = ds.Data.ucData.b2;
  99. p[i++] = ds.Data.ucData.b1;
  100. }
  101. return i;
  102. }
  103. /**********************************************************************************************************************
  104. Type:1字节,决定Data的内容
  105. length:2字节 从data到checkSum的字节数
  106. Data[n]:根据实际数据
  107. checkSum:1字节 从头开始按字节累加到data为止每次累加的进位去掉
  108. ***********************************************************************************************************************/
  109. unsigned short SendTcpSeverPack(unsigned char *Buffer,unsigned char CMD,unsigned short Datalen)
  110. {
  111. unsigned short j,i=0;
  112. unsigned char *pBuf=Buffer,sum;
  113. SUTDS ds;
  114. pBuf[0]=CMD;
  115. ds.Data.usData = Datalen+1;
  116. pBuf[1]=ds.Data.ucData.b2;
  117. pBuf[2]=ds.Data.ucData.b1;
  118. sum=0;
  119. for(j=0;j<1+2+Datalen;j++) sum += pBuf[j];
  120. pBuf[3+Datalen]=sum;
  121. return (3+Datalen+1);
  122. }
  123. /**********************************************************************************************************************
  124. 格式:AT+ICCID
  125. +GETICCID:0x89860315402521836592
  126. +SCID:98680036904030021872
  127. ***********************************************************************************************************************/
  128. int ModemGetCCID(void)
  129. {
  130. int t;
  131. int i,len,ver;
  132. char buf[80],bufTemp[3];
  133. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  134. ver=0;
  135. for(i=0;i<5;i++){
  136. t=100;
  137. ModemSendAT("AT+ICCID\r\n");
  138. while(t--)
  139. {//^SCID: 89860316452001903429
  140. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData, sizeof(pMsg->MsgData))))
  141. {
  142. if(0==ModemStrCmp((char *)pMsg->MsgData,"^SCID:"))
  143. {
  144. memcpy(CCID, &pMsg->MsgData[7], sizeof(CCID));
  145. sprintf(buf, "[09]ICCID:%s[", CCID);
  146. bufTemp[0] = CCID[4];
  147. bufTemp[1] = CCID[5];
  148. bufTemp[2] = 0;
  149. switch(atoi(bufTemp))
  150. {
  151. case 1:
  152. case 9:thisYunYingShang = CHINA_UNICOM;
  153. strcat(buf, "CHINA_UNICOM]");
  154. break;
  155. case 0:
  156. case 2:
  157. case 7:thisYunYingShang = CHINA_MOBILE;
  158. strcat(buf, "CHINA_MOBILE]");
  159. break;
  160. case 3:
  161. case 6:
  162. case 8:
  163. case 11:thisYunYingShang = CHINA_TELECOM;
  164. strcat(buf, "CHINA_TELECOM]");
  165. break;
  166. default:strcat(buf, "UNKNOW-ICCID]");
  167. break;
  168. }
  169. SlwTrace(INF, buf,1);
  170. return 1;
  171. }
  172. }else os_dly_wait(1);
  173. }
  174. }
  175. SlwTrace(INF, "[09]Get CCID failed",1);
  176. return 0;
  177. }
  178. /**********************************************************************************************************************
  179. 开机发送CCID
  180. (unsigned char *Buffer,unsigned long PSN,unsigned char CMD,unsigned long PASS,unsigned char *PName,unsigned short CurVer,unsigned char *CCID);
  181. ***********************************************************************************************************************/
  182. void SendHgsData(void)
  183. {
  184. unsigned short len;
  185. unsigned char HgsBuf[60];
  186. HigosSendFlag +=1;
  187. len=SendTcpDataFill(&HgsBuf[3],0x12,0,0);//先填充数据段,后两参数没意义
  188. len=SendTcpSeverPack(HgsBuf,0x12,len);//再按协议格式打包
  189. M9507CSendTcpData(GPS_DATA_SOCKET, HgsBuf, len);
  190. PrintTcpData(HgsBuf,len);
  191. }
  192. /**********************************************************************************************************************
  193. 收到服务器返回后处理
  194. ***********************************************************************************************************************/
  195. void HigosInit(void)
  196. {
  197. #if(USE_HIGOS_PRO==1)
  198. tcpControl = 0;//先处理ManaTCP
  199. HigosSendFlag=0;
  200. HgsConnetCnt=0;
  201. HgsProcessResult=0;
  202. HgsConnetStatus=0;
  203. #else
  204. tcpControl=1;
  205. #endif
  206. }
  207. void HigosStartCnt(unsigned char long_short)
  208. {
  209. PocStartCnt=1;//打开计时
  210. PocTimeoutCnt=0;//从0开始计数
  211. if(long_short == 1)//long
  212. newCOUNT=POC_TIME_OUT_1;
  213. else
  214. newCOUNT=POC_TIME_OUT_2;
  215. HgsProcessResult=0;
  216. SlwTrace(INF, "\r\nStart cnt",1);
  217. }
  218. void HigosStopCnt(void)
  219. {
  220. #if(USE_HIGOS_PRO==1)
  221. PocStartCnt=0;//禁止计时
  222. PocTimeoutCnt=0;//从0开始计数
  223. SlwTrace(INF, "\r\nStop cnt",1);
  224. #endif
  225. }
  226. /************************************************
  227. 每10ms处理一次
  228. AT+ZIPSETUP=0,higos.f3322.net,12001
  229. +ZDNSGETIP:125.118.61.34
  230. **************************************************/
  231. #define TCP_RETRY_NUM 3
  232. void HigosTick(void)
  233. {
  234. static unsigned char sucSecCt=0;
  235. static unsigned char sucSteep=0;
  236. static unsigned char sucTcpCnt=TCP_RETRY_NUM;
  237. unsigned char ret;
  238. char buf[50];
  239. static STATUE psStatus = INVALID;
  240. #if(USE_HIGOS_PRO==0)
  241. return;
  242. #endif
  243. if(psStatus != sutGpsStatus.PPPStatus)
  244. {
  245. if(psStatus != OPEN &&
  246. sutGpsStatus.PPPStatus == OPEN)
  247. {//PPP从没打开变成打开了,此时开始认为所到网络条件都具备了
  248. if(sutPocStatus.Logined == 0)
  249. HigosStartCnt(1);
  250. }
  251. psStatus = sutGpsStatus.PPPStatus;
  252. }
  253. //===========以下控制每1.5秒执行一次============
  254. if(++sucSecCt>99)sucSecCt=0;
  255. else return;
  256. if(sutGpsStatus.PPPStatus != OPEN) return;
  257. /////////////判定计时/////////////////
  258. if(PocStartCnt)
  259. {
  260. if(++PocTimeoutCnt >= newCOUNT)
  261. {
  262. SlwTrace(INF, "POC Login timeout",1);
  263. HigosStopCnt();
  264. //开启管理服务器登陆
  265. //先断开GPS吧
  266. sprintf(buf, "AT+TCPCLOSE=%d\r\n", GPS_DATA_SOCKET);
  267. ModemSendAT(buf);
  268. //1分钟后继续尝试
  269. if(HgsProcessResult==1)
  270. HigosStartCnt(0);//因连接TCP失败而导致未登陆管理服务器,短时间后重试
  271. HigosInit();
  272. }
  273. }
  274. if(tcpControl != 0) return;
  275. //---以下控制---
  276. if(++sucSteep>3)sucSteep=0;
  277. //----
  278. if(sucSteep==0)
  279. {
  280. if(++sucTcpCnt >= TCP_RETRY_NUM)
  281. {
  282. sucTcpCnt=0;
  283. if(HgsConnetCnt<3 && HgsConnetStatus==0)
  284. {
  285. sprintf(buf, "AT+TCPOPEN=%d,%d.%d.%d.%d:%d\r\n",
  286. GPS_DATA_SOCKET,
  287. sutProductPara.ManagerIP[0],
  288. sutProductPara.ManagerIP[1],
  289. sutProductPara.ManagerIP[2],
  290. sutProductPara.ManagerIP[3],
  291. sutProductPara.ManagerPort);
  292. ModemSendAT(buf);
  293. ++HgsConnetCnt;
  294. SlwTrace(INF, buf,0);
  295. }
  296. }
  297. }else if(1==sucSteep)
  298. {
  299. if(HgsConnetStatus)//已连接成功
  300. SendHgsData();
  301. }else if(2==sucSteep)
  302. {
  303. if(HigosSendFlag >=3 || //已发了三次了
  304. HgsConnetCnt >= 3 || //三次连接失败了
  305. HgsProcessResult == 2)//处理完成
  306. {
  307. if(HgsProcessResult != 2)
  308. HgsProcessResult=1;
  309. sprintf(buf, "AT+TCPCLOSE=%d\r\n", GPS_DATA_SOCKET);
  310. ModemSendAT(buf);
  311. os_dly_wait(1);
  312. tcpControl=1;//ManaTCP完毕,允许执行GPS处理
  313. sutConfig.g_ubConfigFlag=0;
  314. sutConfig.g_usConfigCnt=0;
  315. }
  316. }
  317. }
  318. void Hgs_Data_RecvHandle(char *data, unsigned short len)
  319. {
  320. unsigned short i;
  321. unsigned char sum,type,zerocnt;
  322. unsigned short thisLen;
  323. unsigned char newIP[4];
  324. char buf[60];
  325. char buf1[120];
  326. char *p=data;
  327. unsigned char status;
  328. unsigned char Right,AckStatus;
  329. unsigned char newCip[4],newPip[4],newGip[4];
  330. unsigned short newCPort,newPPort,newGPort;
  331. SUTDS ds;
  332. unsigned char zeroNum;
  333. status=0;
  334. if(tcpControl != 0 && tcpControl != 2) return;
  335. //check load data
  336. type = *p++;
  337. thisLen = *p++;
  338. thisLen <<= 8;
  339. thisLen &= 0xff00;
  340. thisLen |= *p++;
  341. if((1+2+thisLen) != len)
  342. {
  343. sprintf(buf1, "Len err");
  344. status=1;
  345. goto EXIT;
  346. }
  347. sum = 0;
  348. for(i=0;i<thisLen+2;i++) sum += data[i];
  349. if(sum != data[len -1])
  350. {
  351. sprintf(buf1, "Sum err");
  352. status=2;
  353. goto EXIT;
  354. }
  355. if(type != 0x12 && type != 0x19)
  356. {
  357. sprintf(buf1, "Type unSupport");
  358. status=3;
  359. goto EXIT;
  360. }
  361. //收到正常的应答包
  362. if(type == 0x12)
  363. {
  364. Right = *p++;
  365. if(0xEA != Right)
  366. {
  367. sprintf(buf1, "Right err");
  368. status=4;
  369. goto EXIT;
  370. }
  371. HigosStopCnt();
  372. memcpy(newIP, data+13, 4);
  373. sprintf(buf, "NewIP:%d.%d.%d.%d",newIP[0],newIP[1],newIP[2],newIP[3]);
  374. SlwTrace(INF, buf,1);
  375. //如果不全为0,也不匹配原来的IP,则更新并启动新IP连接
  376. zerocnt=0;
  377. for(i=0;i<4;i++)
  378. {
  379. if(newIP[i] == 0) zerocnt++;
  380. }
  381. if(zerocnt >= 2)
  382. {
  383. SlwTrace(INF, "err_IP",1);
  384. status=5;
  385. goto EXIT;
  386. }
  387. sprintf(buf, "%d.%d.%d.%d", newIP[0],newIP[1],newIP[2],newIP[3]);
  388. if(strcmp(sutProductPara.PIP,buf) != 0)
  389. {//有新交换IP
  390. IWDG_ReloadCounter();
  391. //1、保存起来
  392. sprintf(sutProductPara.PIP, "%d.%d.%d.%d", newIP[0],newIP[1],newIP[2],newIP[3]);
  393. SaveProductParaToFlash("HGS_IP");
  394. //2、写到模块去
  395. sprintf(buf,"id=%lu;ip=%s;pwd=%s;",sutProductPara.PSN,sutProductPara.PIP,sutProductPara.MEID);
  396. AscStrToHexStr(buf,buf1);
  397. ModemSendAT("AT+POC=010000");
  398. ModemSendAT(buf1);
  399. ModemSendAT("\r\n");
  400. //reset whole system
  401. SlwTrace(INF, "Reboot...",1);
  402. os_dly_wait(100);
  403. while(1);
  404. }else
  405. {
  406. sprintf(buf1,"Same_IP");
  407. status=0;
  408. goto EXIT;
  409. }
  410. EXIT:
  411. SlwTrace(INF, buf1,1);
  412. //成功拿到一包数据后,则认为完成一次处理
  413. if(sutPocStatus.Logined==0)
  414. HigosStartCnt(1);//如果未登陆要接着计数
  415. HgsProcessResult=2;
  416. }else if(type == 0x19)
  417. {
  418. #if(USE_CONFIG_FUN==1)
  419. AckStatus = *p++;
  420. sutConfig.g_ucConfigSerAckStatus=AckStatus;
  421. switch(AckStatus)
  422. {
  423. case 1://响应成功,可处理数据
  424. memcpy(newCip, p, 4);p+=4;
  425. ds.Data.ucData.b2 = *p++;
  426. ds.Data.ucData.b1 = *p++;
  427. newCPort=ds.Data.usData;
  428. memcpy(newPip, p, 4);p+=4;
  429. ds.Data.ucData.b2 = *p++;
  430. ds.Data.ucData.b1 = *p++;
  431. newPPort=ds.Data.usData;
  432. memcpy(newGip, p, 4);p+=4;
  433. ds.Data.ucData.b2 = *p++;
  434. ds.Data.ucData.b1 = *p++;
  435. newGPort=ds.Data.usData;
  436. sprintf(buf1, "CIP:%d.%d.%d.%d,%d PIP:%d.%d.%d.%d,%d GIP:%d.%d.%d.%d,%d",
  437. newCip[0],newCip[1],newCip[2],newCip[3],newCPort,
  438. newPip[0],newPip[1],newPip[2],newCip[3],newPPort,
  439. newGip[0],newGip[1],newGip[2],newGip[3],newGPort);
  440. SlwTrace(INF, buf1, 1);
  441. //检测CIP是否为全0 IP
  442. zeroNum=0;
  443. for(i=0;i<4;i++) if(newCip[i] == 0) zeroNum++;
  444. if(zeroNum <=1 && newCPort)//只有1个或没有0,认为IP有效
  445. {
  446. if( 0!=memcmp(newCip, sutProductPara.ManagerIP, 4) ||
  447. newCPort != sutProductPara.ManagerPort)
  448. {
  449. SlwTrace(INF, "CIP Update",1);
  450. }else SlwTrace(INF, "CIP No change",1);
  451. }
  452. //检测PIP是否为全0 IP
  453. zeroNum=0;
  454. for(i=0;i<4;i++) if(newPip[i] == 0) zeroNum++;
  455. if(zeroNum <=1)//只有1个或没有0,认为IP有效
  456. {
  457. sprintf(buf, "%d.%d.%d.%d",newPip[0],newPip[1],newPip[2],newPip[3]);
  458. if(0!=strcmp(buf, sutProductPara.PIP))
  459. {
  460. SlwTrace(INF, "PIP Update",1);
  461. }else SlwTrace(INF, "PIP No change",1);
  462. }
  463. //检测GIP是否为全0 IP
  464. zeroNum=0;
  465. for(i=0;i<4;i++) if(newGip[i] == 0) zeroNum++;
  466. if(zeroNum <=1 && newGPort)//只有1个或没有0,认为IP有效
  467. {
  468. sprintf(buf, "%d.%d.%d.%d",newGip[0],newGip[1],newGip[2],newGip[3]);
  469. if(0!=strcmp(buf, sutProductPara.GIP) ||
  470. newGPort != sutProductPara.GpsPort)
  471. {
  472. SlwTrace(INF, "GIP Update",1);
  473. }else SlwTrace(INF, "GIP No change",1);
  474. }
  475. sutConfig.g_ucConfigStatus=2;//上报更新结果
  476. sutConfig.g_ucConfigValue=1;//完成配置
  477. sutConfig.g_ubConfigFinished=1;
  478. break;
  479. case 2://服务器无此PSN
  480. SlwTrace(INF, "\r\nNo PSN in server",1);
  481. break;
  482. case 3://CCID不匹配
  483. SlwTrace(INF, "\r\nCCID no fitted",1);
  484. break;
  485. case 4://新旧IP一致
  486. SlwTrace(INF, "\r\nAll para no change",1);
  487. break;
  488. default://保留
  489. break;
  490. }
  491. #endif
  492. }
  493. }
  494. #if(USE_CONFIG_FUN==1)
  495. void SerConfigSend(void)
  496. {
  497. unsigned short len;
  498. unsigned char HgsBuf[80];
  499. len=SendTcpDataFill(&HgsBuf[3],0x19,sutConfig.g_ucConfigStatus,sutConfig.g_ucConfigValue);//先填充数据段,后两参数没意义
  500. len=SendTcpSeverPack(HgsBuf,0x19,len);//再按协议格式打包
  501. M9507CSendTcpData(CONFIG_SER_SOCKET, HgsBuf, len);
  502. PrintTcpData(HgsBuf,len);
  503. }
  504. void ConfigCtrHandle(void)
  505. {
  506. static unsigned char Cnt,thisStatus=0,timeout=0;
  507. char buf[50],needAt;
  508. if(sutConfig.g_ubConfigFlag==0) return;
  509. if(sutConfig.g_ubConfigFinished) return;
  510. if(++Cnt < 99) return;
  511. if(timeout++ > 60)
  512. {
  513. CONFIG_EXIT:
  514. //////////////////////////////////////////
  515. GuiClearRect(0,65,LCD_WIDTH-1,81);
  516. GuiShowBmp(30,34,"logo.bmp");
  517. if(sutGpsStatus.PPPStatus != OPEN)
  518. {
  519. SlwTrace(INF, "PPP Failed",1);
  520. //sprintf(buf,"B2A6BAC5CAA7B0DC");
  521. GuiShowStr(42, 55, "拨号失败!",1);
  522. }else if(sutConfig.g_ubConfigTcpStatus==0)
  523. {
  524. SlwTrace(INF, "Tcp Failed",1);
  525. //sprintf(buf,"C1ACBDD3CAA7B0DC");
  526. GuiShowStr(42, 55, "连接失败!",1);
  527. }else if(sutConfig.g_ucTcpSendDateTime >=3)
  528. {
  529. SlwTrace(INF, "Tcp no fit data",1);
  530. //sprintf(buf,"CFECD3A6CEDED0A7");
  531. GuiShowStr(42, 55, "响应无效!",1);
  532. }else{
  533. SlwTrace(INF, "Access ok",1);
  534. //sprintf(buf,"B7C3CECACDEAB3C9");
  535. GuiShowStr(42, 55, "访问完成!",1);
  536. }
  537. //strcat(buf, "2CCDCBB3F6C5E4D6C3");
  538. GuiShowStr(42, 80, "退出配置!",1);
  539. //MeSpeak(ENCODE_GBK, buf, 1);
  540. SlwTrace(INF, "Quit config",1);
  541. //////////////////////////////////////////
  542. if(sutConfig.g_ubConfigTcpStatus)
  543. {
  544. os_dly_wait(100);
  545. sprintf(buf, "AT+TCPCLOSE=%d\r\n", CONFIG_SER_SOCKET);
  546. ModemSendAT(buf);
  547. }
  548. memset((unsigned char *)&sutConfig, 0, sizeof(CONFIG_SER_DEF));
  549. timeout=0;
  550. return;
  551. }
  552. Cnt=0;
  553. needAt=0;
  554. if(++thisStatus > 2) thisStatus=0;
  555. switch(thisStatus)
  556. {
  557. case 0://检测ppp
  558. if(sutGpsStatus.PPPStatus == OPEN) sprintf(buf, "AT+TCPSTATUS=%d\r\n", CONFIG_SER_SOCKET);
  559. else sprintf(buf, "AT+POC_PPP\r\n");
  560. needAt=1;
  561. break;
  562. case 1://连接TCP
  563. if(sutGpsStatus.PPPStatus != OPEN) break;
  564. if(sutConfig.g_ucTcpRetryNum++ >= CONFIG_TCP_RETRY_CNT)
  565. {
  566. sutConfig.g_ucTcpRetryNum =0;
  567. if(sutConfig.g_ubConfigTcpStatus == 0)//未连接成功
  568. {//发起连接
  569. if(sutConfig.g_ucTcpConnectTime < CONFIG_TCP_MAX_CONNECT)
  570. {//连接次数未超标
  571. sprintf(buf, "AT+TCPOPEN=%d,%d.%d.%d.%d:%d\r\n",
  572. CONFIG_SER_SOCKET,
  573. sutProductPara.ConfigSerIP[0],
  574. sutProductPara.ConfigSerIP[1],
  575. sutProductPara.ConfigSerIP[2],
  576. sutProductPara.ConfigSerIP[3],
  577. sutProductPara.ConfigSerPort);
  578. needAt=1;
  579. sutConfig.g_ucTcpConnectTime++;
  580. }else goto CONFIG_EXIT;
  581. }
  582. }
  583. break;
  584. case 2://发送数据
  585. if(sutGpsStatus.PPPStatus != OPEN) break;
  586. if(sutConfig.g_ubConfigTcpStatus==0) break;
  587. if(sutConfig.g_ucTcpSendDateTime++ < 3 ||
  588. sutConfig.g_ubConfigFinished)//收到服务器应答并处理完成后,应答结果,完成交互
  589. {
  590. SerConfigSend();
  591. }else goto CONFIG_EXIT;
  592. break;
  593. }
  594. if(needAt)
  595. {
  596. SlwTrace(INF, buf,0);
  597. ModemSendAT(buf);
  598. }
  599. if(sutConfig.g_ubConfigFinished) goto CONFIG_EXIT;
  600. }
  601. #endif
  602. #define PRINTF_MAX_LEN 70
  603. void PrintTcpData(unsigned char *tcpData, unsigned short len)
  604. {
  605. char buf[PRINTF_MAX_LEN*2+10];
  606. char temp[2];
  607. unsigned char thisLen,i;
  608. thisLen = PRINTF_MAX_LEN;
  609. if(len > thisLen) len = thisLen;
  610. sprintf(buf, "TcpS[%d]:",len);
  611. for(i=0;i<len;i++)
  612. {
  613. sprintf(temp, "%02x",tcpData[i]);
  614. strcat(buf,temp);
  615. }
  616. SlwTrace(INF, buf,1);
  617. }