HgsTcpProc.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  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, sutNewSegmentPara.ManagerIP, 4);
  75. nowCPort = sutNewSegmentPara.ManagerPort;
  76. //if(GetStringIP2Bytes(nowPIP, sutProductPara.PIP)) SlwTrace(INF, "IP Para err1",1);
  77. memcpy(nowPIP,sutNewSegmentPara.PIP,4);
  78. nowPPort = 0xffff;
  79. //if(GetStringIP2Bytes(nowGIP, sutProductPara.GIP)) SlwTrace(INF, "IP Para err2",1);
  80. memcpy(nowGIP, sutNewSegmentPara.GIP,4);
  81. nowGPort = sutNewSegmentPara.GpsPort;
  82. }else if(status == 2)
  83. {//上报结果不需要值
  84. memset(nowCIP, 0, 4);
  85. memset(nowPIP, 0, 4);
  86. memset(nowGIP, 0, 4);
  87. nowCPort=0;nowPPort=0;nowGPort=0;
  88. }else{
  89. }
  90. for(j=0;j<4;j++) p[i++] = nowCIP[j];
  91. ds.Data.usData = nowCPort;
  92. p[i++] = ds.Data.ucData.b2;
  93. p[i++] = ds.Data.ucData.b1;
  94. for(j=0;j<4;j++) p[i++] = nowPIP[j];
  95. ds.Data.usData = nowPPort;
  96. p[i++] = ds.Data.ucData.b2;
  97. p[i++] = ds.Data.ucData.b1;
  98. for(j=0;j<4;j++) p[i++] = nowGIP[j];
  99. ds.Data.usData = nowGPort;
  100. p[i++] = ds.Data.ucData.b2;
  101. p[i++] = ds.Data.ucData.b1;
  102. }
  103. return i;
  104. }
  105. /**********************************************************************************************************************
  106. Type:1字节,决定Data的内容
  107. length:2字节 从data到checkSum的字节数
  108. Data[n]:根据实际数据
  109. checkSum:1字节 从头开始按字节累加到data为止每次累加的进位去掉
  110. ***********************************************************************************************************************/
  111. unsigned short SendTcpSeverPack(unsigned char *Buffer,unsigned char CMD,unsigned short Datalen)
  112. {
  113. unsigned short j,i=0;
  114. unsigned char *pBuf=Buffer,sum;
  115. SUTDS ds;
  116. pBuf[0]=CMD;
  117. ds.Data.usData = Datalen+1;
  118. pBuf[1]=ds.Data.ucData.b2;
  119. pBuf[2]=ds.Data.ucData.b1;
  120. sum=0;
  121. for(j=0;j<1+2+Datalen;j++) sum += pBuf[j];
  122. pBuf[3+Datalen]=sum;
  123. return (3+Datalen+1);
  124. }
  125. /**********************************************************************************************************************
  126. 格式:AT+ICCID
  127. +GETICCID:0x89860315402521836592
  128. +SCID:98680036904030021872
  129. ***********************************************************************************************************************/
  130. int ModemGetCCID(void)
  131. {
  132. int t;
  133. int i,len,ver;
  134. char buf[80],bufTemp[3];
  135. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  136. ver=0;
  137. for(i=0;i<5;i++){
  138. t=100;
  139. ModemSendAT("AT+ICCID\r\n");
  140. while(t--)
  141. {//^SCID: 89860316452001903429
  142. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData, sizeof(pMsg->MsgData))))
  143. {
  144. if(0==ModemStrCmp((char *)pMsg->MsgData,"^SCID:"))
  145. {
  146. memcpy(CCID, &pMsg->MsgData[7], sizeof(CCID));
  147. sprintf(buf, "[09]ICCID:%s[", CCID);
  148. bufTemp[0] = CCID[4];
  149. bufTemp[1] = CCID[5];
  150. bufTemp[2] = 0;
  151. switch(atoi(bufTemp))
  152. {
  153. case 1:
  154. case 9:thisYunYingShang = CHINA_UNICOM;
  155. strcat(buf, "CHINA_UNICOM]");
  156. break;
  157. case 0:
  158. case 2:
  159. case 7:thisYunYingShang = CHINA_MOBILE;
  160. strcat(buf, "CHINA_MOBILE]");
  161. break;
  162. case 3:
  163. case 6:
  164. case 8:
  165. case 11:thisYunYingShang = CHINA_TELECOM;
  166. strcat(buf, "CHINA_TELECOM]");
  167. break;
  168. default:strcat(buf, "UNKNOW-ICCID]");
  169. break;
  170. }
  171. SlwTrace(INF, buf,1);
  172. return 1;
  173. }
  174. }else os_dly_wait(1);
  175. }
  176. }
  177. SlwTrace(INF, "[09]Get CCID failed",1);
  178. return 0;
  179. }
  180. /**********************************************************************************************************************
  181. 开机发送CCID
  182. (unsigned char *Buffer,unsigned long PSN,unsigned char CMD,unsigned long PASS,unsigned char *PName,unsigned short CurVer,unsigned char *CCID);
  183. ***********************************************************************************************************************/
  184. void SendHgsData(void)
  185. {
  186. unsigned short len;
  187. unsigned char HgsBuf[60];
  188. HigosSendFlag +=1;
  189. len=SendTcpDataFill(&HgsBuf[3],0x12,0,0);//先填充数据段,后两参数没意义
  190. len=SendTcpSeverPack(HgsBuf,0x12,len);//再按协议格式打包
  191. M9507CSendTcpData(GPS_DATA_SOCKET, HgsBuf, len);
  192. PrintTcpData(HgsBuf,len);
  193. }
  194. /**********************************************************************************************************************
  195. 收到服务器返回后处理
  196. ***********************************************************************************************************************/
  197. void HigosInit(void)
  198. {
  199. #if(USE_HIGOS_PRO==1)
  200. tcpControl = 0;//先处理ManaTCP
  201. HigosSendFlag=0;
  202. HgsConnetCnt=0;
  203. HgsProcessResult=0;
  204. HgsConnetStatus=0;
  205. #else
  206. tcpControl=1;
  207. #endif
  208. }
  209. void HigosStartCnt(unsigned char long_short)
  210. {
  211. PocStartCnt=1;//打开计时
  212. PocTimeoutCnt=0;//从0开始计数
  213. if(long_short == 1)//long
  214. newCOUNT=POC_TIME_OUT_1;
  215. else
  216. newCOUNT=POC_TIME_OUT_2;
  217. HgsProcessResult=0;
  218. SlwTrace(INF, "\r\nStart cnt",1);
  219. }
  220. void HigosStopCnt(void)
  221. {
  222. #if(USE_HIGOS_PRO==1)
  223. PocStartCnt=0;//禁止计时
  224. PocTimeoutCnt=0;//从0开始计数
  225. SlwTrace(INF, "\r\nStop cnt",1);
  226. #endif
  227. }
  228. /************************************************
  229. 每10ms处理一次
  230. AT+ZIPSETUP=0,higos.f3322.net,12001
  231. +ZDNSGETIP:125.118.61.34
  232. **************************************************/
  233. #define TCP_RETRY_NUM 3
  234. void HigosTick(void)
  235. {
  236. static unsigned int sucSecCt=0;
  237. static unsigned char sucSteep=0;
  238. static unsigned char sucTcpCnt=TCP_RETRY_NUM;
  239. unsigned char ret;
  240. char buf[50];
  241. static STATUE psStatus = INVALID;
  242. #if(USE_HIGOS_PRO==0)
  243. return;
  244. #endif
  245. if(psStatus != sutGpsStatus.PPPStatus)
  246. {
  247. if(psStatus != OPEN &&
  248. sutGpsStatus.PPPStatus == OPEN)
  249. {//PPP从没打开变成打开了,此时开始认为所到网络条件都具备了
  250. if(sutPocStatus.Logined == 0)
  251. HigosStartCnt(1);
  252. }
  253. psStatus = sutGpsStatus.PPPStatus;
  254. }
  255. //===========以下控制每1.5秒执行一次============
  256. if(os_time_get() < sucSecCt) return;
  257. sucSecCt = os_time_get() + 100;
  258. if(sutGpsStatus.PPPStatus != OPEN) return;
  259. /////////////判定计时/////////////////
  260. if(PocStartCnt)
  261. {
  262. if(++PocTimeoutCnt >= newCOUNT)
  263. {
  264. SlwTrace(INF, "POC Login timeout",1);
  265. HigosStopCnt();
  266. //开启管理服务器登陆
  267. //先断开GPS吧
  268. sprintf(buf, "AT+TCPCLOSE=%d\r\n", GPS_DATA_SOCKET);
  269. ModemSendAT(buf);
  270. //1分钟后继续尝试
  271. if(HgsProcessResult==1)
  272. HigosStartCnt(0);//因连接TCP失败而导致未登陆管理服务器,短时间后重试
  273. HigosInit();
  274. }
  275. }
  276. if(tcpControl != 0) return;
  277. //---以下控制---
  278. if(++sucSteep>3)sucSteep=0;
  279. //----
  280. if(sucSteep==0)
  281. {
  282. if(++sucTcpCnt >= TCP_RETRY_NUM)
  283. {
  284. sucTcpCnt=0;
  285. if(HgsConnetCnt<3 && HgsConnetStatus==0)
  286. {
  287. sprintf(buf, "AT+TCPOPEN=%d,%d.%d.%d.%d:%d\r\n",
  288. GPS_DATA_SOCKET,
  289. sutNewSegmentPara.ManagerIP[0],
  290. sutNewSegmentPara.ManagerIP[1],
  291. sutNewSegmentPara.ManagerIP[2],
  292. sutNewSegmentPara.ManagerIP[3],
  293. sutNewSegmentPara.ManagerPort);
  294. ModemSendAT(buf);
  295. ++HgsConnetCnt;
  296. SlwTrace(INF, buf,0);
  297. }
  298. }
  299. }else if(1==sucSteep)
  300. {
  301. if(HgsConnetStatus)//已连接成功
  302. SendHgsData();
  303. }else if(2==sucSteep)
  304. {
  305. if(HigosSendFlag >=3 || //已发了三次了
  306. HgsConnetCnt >= 3 || //三次连接失败了
  307. HgsProcessResult == 2)//处理完成
  308. {
  309. if(HgsProcessResult != 2)
  310. HgsProcessResult=1;
  311. sprintf(buf, "AT+TCPCLOSE=%d\r\n", GPS_DATA_SOCKET);
  312. ModemSendAT(buf);
  313. os_dly_wait(1);
  314. tcpControl=1;//ManaTCP完毕,允许执行GPS处理
  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(memcmp(sutNewSegmentPara.PIP, newIP,4)!=0)
  389. {//有新交换IP
  390. IWDG_ReloadCounter();
  391. //1、保存起来
  392. memcmp(sutNewSegmentPara.PIP, newIP,4);
  393. SaveNewSegmentToFlash();
  394. //2、写到模块去
  395. sprintf(buf,"ip=%d.%d.%d.%d;id=%lu;pwd=%s;",sutNewSegmentPara.PIP[0],sutNewSegmentPara.PIP[1],sutNewSegmentPara.PIP[2],sutNewSegmentPara.PIP[3],
  396. sutProductPara.PSN,sutNewSegmentPara.HARDID);
  397. AscStrToHexStr(buf,buf1);
  398. ModemSendAT("AT+POC=010000");
  399. ModemSendAT(buf1);
  400. ModemSendAT("\r\n");
  401. //reset whole system
  402. SlwTrace(INF, "Reboot...",1);
  403. os_dly_wait(100);
  404. while(1);
  405. }else
  406. {
  407. sprintf(buf1,"Same_IP");
  408. status=0;
  409. goto EXIT;
  410. }
  411. EXIT:
  412. SlwTrace(INF, buf1,1);
  413. //成功拿到一包数据后,则认为完成一次处理
  414. if(sutPocStatus.Logined==0)
  415. HigosStartCnt(1);//如果未登陆要接着计数
  416. HgsProcessResult=2;
  417. }else if(type == 0x19)
  418. {
  419. #if(USE_CONFIG_FUN==1)
  420. AckStatus = *p++;
  421. sutConfig.g_ucConfigSerAckStatus=AckStatus;
  422. switch(AckStatus)
  423. {
  424. case 1://响应成功,可处理数据
  425. memcpy(newCip, p, 4);p+=4;
  426. ds.Data.ucData.b2 = *p++;
  427. ds.Data.ucData.b1 = *p++;
  428. newCPort=ds.Data.usData;
  429. memcpy(newPip, p, 4);p+=4;
  430. ds.Data.ucData.b2 = *p++;
  431. ds.Data.ucData.b1 = *p++;
  432. newPPort=ds.Data.usData;
  433. memcpy(newGip, p, 4);p+=4;
  434. ds.Data.ucData.b2 = *p++;
  435. ds.Data.ucData.b1 = *p++;
  436. newGPort=ds.Data.usData;
  437. sprintf(buf1, "CIP:%d.%d.%d.%d,%d PIP:%d.%d.%d.%d,%d GIP:%d.%d.%d.%d,%d",
  438. newCip[0],newCip[1],newCip[2],newCip[3],newCPort,
  439. newPip[0],newPip[1],newPip[2],newCip[3],newPPort,
  440. newGip[0],newGip[1],newGip[2],newGip[3],newGPort);
  441. SlwTrace(INF, buf1, 1);
  442. //检测CIP是否为全0 IP
  443. zeroNum=0;
  444. for(i=0;i<4;i++) if(newCip[i] == 0) zeroNum++;
  445. if(zeroNum <=1 && newCPort)//只有1个或没有0,认为IP有效
  446. {
  447. if( 0!=memcmp(newCip, sutNewSegmentPara.ManagerIP, 4) ||
  448. newCPort != sutNewSegmentPara.ManagerPort)
  449. {
  450. SlwTrace(INF, "CIP Update",1);
  451. }else SlwTrace(INF, "CIP No change",1);
  452. }
  453. //检测PIP是否为全0 IP
  454. zeroNum=0;
  455. for(i=0;i<4;i++) if(newPip[i] == 0) zeroNum++;
  456. if(zeroNum <=1)//只有1个或没有0,认为IP有效
  457. {
  458. sprintf(buf, "%d.%d.%d.%d",newPip[0],newPip[1],newPip[2],newPip[3]);
  459. if(0!=strcmp(buf, sutProductPara.PIP))
  460. {
  461. SlwTrace(INF, "PIP Update",1);
  462. }else SlwTrace(INF, "PIP No change",1);
  463. }
  464. //检测GIP是否为全0 IP
  465. zeroNum=0;
  466. for(i=0;i<4;i++) if(newGip[i] == 0) zeroNum++;
  467. if(zeroNum <=1 && newGPort)//只有1个或没有0,认为IP有效
  468. {
  469. sprintf(buf, "%d.%d.%d.%d",newGip[0],newGip[1],newGip[2],newGip[3]);
  470. if(0!=strcmp(buf, sutProductPara.GIP) ||
  471. newGPort != sutProductPara.GpsPort)
  472. {
  473. SlwTrace(INF, "GIP Update",1);
  474. }else SlwTrace(INF, "GIP No change",1);
  475. }
  476. sutConfig.g_ucConfigStatus=2;//上报更新结果
  477. sutConfig.g_ucConfigValue=1;//完成配置
  478. sutConfig.g_ubConfigFinished=1;
  479. break;
  480. case 2://服务器无此PSN
  481. SlwTrace(INF, "\r\nNo PSN in server",1);
  482. break;
  483. case 3://CCID不匹配
  484. SlwTrace(INF, "\r\nCCID no fitted",1);
  485. break;
  486. case 4://新旧IP一致
  487. SlwTrace(INF, "\r\nAll para no change",1);
  488. break;
  489. default://保留
  490. break;
  491. }
  492. #endif
  493. }
  494. }
  495. #if(USE_CONFIG_FUN==1)
  496. void SerConfigSend(void)
  497. {
  498. unsigned short len;
  499. unsigned char HgsBuf[80];
  500. len=SendTcpDataFill(&HgsBuf[3],0x19,sutConfig.g_ucConfigStatus,sutConfig.g_ucConfigValue);//先填充数据段,后两参数没意义
  501. len=SendTcpSeverPack(HgsBuf,0x19,len);//再按协议格式打包
  502. M9507CSendTcpData(CONFIG_SER_SOCKET, HgsBuf, len);
  503. PrintTcpData(HgsBuf,len);
  504. }
  505. void ConfigCtrHandle(void)
  506. {
  507. static unsigned char Cnt,thisStatus=0,timeout=0;
  508. char buf[50],needAt;
  509. if(sutConfig.g_ubConfigFlag==0) return;
  510. if(sutConfig.g_ubConfigFinished) return;
  511. if(++Cnt < 99) return;
  512. if(timeout++ > 60)
  513. {
  514. CONFIG_EXIT:
  515. //////////////////////////////////////////
  516. if(sutGpsStatus.PPPStatus != OPEN)
  517. {
  518. SlwTrace(INF, "PPP Failed",1);
  519. sprintf(buf,"B2A6BAC5CAA7B0DC");
  520. }else if(sutConfig.g_ubConfigTcpStatus==0)
  521. {
  522. SlwTrace(INF, "Tcp Failed",1);
  523. sprintf(buf,"C1ACBDD3CAA7B0DC");
  524. }else if(sutConfig.g_ucTcpSendDateTime >=3)
  525. {
  526. SlwTrace(INF, "Tcp no fit data",1);
  527. sprintf(buf,"CFECD3A6CEDED0A7");
  528. }else{
  529. SlwTrace(INF, "Access ok",1);
  530. sprintf(buf,"B7C3CECACDEAB3C9");
  531. }
  532. strcat(buf, "2C00CDCBB3F6C5E4D6C3");
  533. MeSpeak(ENCODE_GBK, buf, 1);
  534. //////////////////////////////////////////
  535. if(sutConfig.g_ubConfigTcpStatus)
  536. {
  537. os_dly_wait(100);
  538. sprintf(buf, "AT+TCPCLOSE=%d\r\n", CONFIG_SER_SOCKET);
  539. ModemSendAT(buf);
  540. }
  541. memset((unsigned char *)&sutConfig, 0, sizeof(CONFIG_SER_DEF));
  542. timeout=0;
  543. return;
  544. }
  545. Cnt=0;
  546. needAt=0;
  547. if(++thisStatus > 2) thisStatus=0;
  548. switch(thisStatus)
  549. {
  550. case 0://检测ppp
  551. if(sutGpsStatus.PPPStatus == OPEN) sprintf(buf, "AT+TCPSTATUS=%d\r\n", CONFIG_SER_SOCKET);
  552. else sprintf(buf, "AT+POC_PPP\r\n");
  553. needAt=1;
  554. break;
  555. case 1://连接TCP
  556. if(sutGpsStatus.PPPStatus != OPEN) break;
  557. if(sutConfig.g_ucTcpRetryNum++ >= CONFIG_TCP_RETRY_CNT)
  558. {
  559. sutConfig.g_ucTcpRetryNum =0;
  560. if(sutConfig.g_ubConfigTcpStatus == 0)//未连接成功
  561. {//发起连接
  562. if(sutConfig.g_ucTcpConnectTime < CONFIG_TCP_MAX_CONNECT)
  563. {//连接次数未超标
  564. sprintf(buf, "AT+TCPOPEN=%d,%d.%d.%d.%d:%d\r\n",
  565. CONFIG_SER_SOCKET,
  566. sutNewSegmentPara.ConfigSerIP[0],
  567. sutNewSegmentPara.ConfigSerIP[1],
  568. sutNewSegmentPara.ConfigSerIP[2],
  569. sutNewSegmentPara.ConfigSerIP[3],
  570. sutNewSegmentPara.ConfigSerPort);
  571. needAt=1;
  572. sutConfig.g_ucTcpConnectTime++;
  573. }else goto CONFIG_EXIT;
  574. }
  575. }
  576. break;
  577. case 2://发送数据
  578. if(sutGpsStatus.PPPStatus != OPEN) break;
  579. if(sutConfig.g_ubConfigTcpStatus==0) break;
  580. if(sutConfig.g_ucTcpSendDateTime++ < 3 ||
  581. sutConfig.g_ubConfigFinished)//收到服务器应答并处理完成后,应答结果,完成交互
  582. {
  583. SerConfigSend();
  584. }else goto CONFIG_EXIT;
  585. break;
  586. }
  587. if(needAt)
  588. {
  589. SlwTrace(INF, buf,0);
  590. ModemSendAT(buf);
  591. }
  592. if(sutConfig.g_ubConfigFinished) goto CONFIG_EXIT;
  593. }
  594. #endif
  595. #define PRINTF_MAX_LEN 70
  596. void PrintTcpData(unsigned char *tcpData, unsigned short len)
  597. {
  598. char buf[PRINTF_MAX_LEN*2+10];
  599. char temp[2];
  600. unsigned char thisLen,i;
  601. thisLen = PRINTF_MAX_LEN;
  602. if(len > thisLen) len = thisLen;
  603. sprintf(buf, "TcpS[%d]:",len);
  604. for(i=0;i<len;i++)
  605. {
  606. sprintf(temp, "%02x",tcpData[i]);
  607. strcat(buf,temp);
  608. }
  609. SlwTrace(INF, buf,1);
  610. }