TcpProcess.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. #include "includes.h"
  2. WIFISTATUE WifiStatue;
  3. DEVICELOGIN DeviceLogin;
  4. SERVERRESP ServerResp;
  5. unsigned char HeartTickCt;
  6. unsigned char HeartTimeOut;
  7. /************************************************************
  8. 状态信息汇报
  9. StaueSendPosition
  10. 发送位置数据
  11. Cmd=0x0200
  12. 总长度=
  13. ***********************************************************************************/
  14. void TSStatueSendPosition(short cmd)
  15. {
  16. int i;
  17. int len;
  18. unsigned char buf[400];//150
  19. char temp[3];
  20. char printfbuf[20];
  21. switch(cmd)
  22. {
  23. case TS_LOCATION_INFORMATION_REPORTING: //状态上传
  24. len=TSTcpPacket(buf,sutProductPara.PSN,TS_LOCATION_INFORMATION_REPORTING,(unsigned char *)&Device_Up,sizeof(SUT_UP));
  25. HeartTickCt=0;
  26. break;
  27. case TS_TERMINAL_LOGIN: //登录包
  28. SlwTrace(INF,"----登录----\r\n");
  29. memset(&DeviceLogin,0,sizeof(DeviceLogin));
  30. DeviceLogin.DeviceSN=sutProductPara.PSN;
  31. len=TSTcpPacket(buf,sutProductPara.PSN,TS_TERMINAL_LOGIN,(unsigned char *)&DeviceLogin,sizeof(DEVICELOGIN));
  32. HeartTickCt=0;
  33. break;
  34. case TS_TERMINAL_HEARTBEAT: //心跳包
  35. SlwTrace(INF,"---心跳----\r\n");
  36. len=TSTcpPacket(buf,sutProductPara.PSN,TS_TERMINAL_HEARTBEAT,0,0);
  37. break;
  38. default:
  39. break;
  40. }
  41. /////////////////////////////////////
  42. SlwTrace(INF,"/**********start***********/\r\n");
  43. snprintf(printfbuf,sizeof(printfbuf),"LEN====%d\r\n",len);
  44. SlwTrace(INF,printfbuf);
  45. for(i=0;i<len;i++){
  46. FEED_EXTWATCHDOG();
  47. sprintf(temp, "%02x",buf[i]);
  48. temp[2]=0;
  49. SlwTrace(INF,temp);
  50. }
  51. SlwTrace(INF," \r\n");
  52. buf[len]=0x0d;
  53. buf[len+1]=0x0a;
  54. buf[len+2]=0x0;
  55. SlwTrace(INF,"/**********end***********/\r\n");
  56. if(sutProductPara.ConnectType==1)ModemSendData(buf,len);
  57. if(sutProductPara.ConnectType==0)WiredSendTcpData(buf,len);
  58. }
  59. /*************************************************************************************
  60. *
  61. **************************************************************************************/
  62. // replace 0x7d 0x01 with 0x7d and 0x7d 0x02 with 0x7e 接收
  63. //长度不会变大,只会变小或不变
  64. int reduce(unsigned char *pData,int DataLen)
  65. {
  66. unsigned char *p = pData;
  67. int data_len=0;
  68. int i;
  69. if(DataLen==0) return 0;
  70. for(i=0;i<DataLen-1;i++)
  71. {
  72. if(pData[i] == 0x7d && pData[i+1] == 0x01)
  73. {
  74. *p++ = 0x7d;i++;
  75. }else if(pData[i] == 0x7d && pData[i+1] == 0x02)
  76. {
  77. *p++ = 0x7e;i++;
  78. }else *p++=pData[i];
  79. data_len++;
  80. }
  81. return data_len;
  82. }
  83. // loop every character, replace 0x7d with 0x7d 0x01 and 0x7e with 0x7d 0x02 发送
  84. int escapse(unsigned char *pData,int DataLen) {
  85. unsigned char *p= (unsigned char *)malloc(DataLen +300); //*2
  86. unsigned char * q = p;
  87. int data_len = 0;
  88. int i;
  89. if (DataLen == 0) {
  90. return 0;
  91. }
  92. memset(p, 0, DataLen+300); //*2
  93. for (i = 0; i < DataLen; i ++) {
  94. if (pData[i] == 0x7d) {
  95. *q ++ = 0x7d;
  96. *q ++ = 0x01;
  97. data_len += 2;
  98. } else if (pData[i] == 0x7e) {
  99. *q ++ = 0x7d;
  100. *q ++ = 0x02;
  101. data_len += 2;
  102. } else {
  103. *q ++ = pData[i];
  104. data_len += 1;
  105. }
  106. }
  107. memcpy(pData, p, data_len);
  108. free(p);
  109. DataLen = data_len;
  110. //free(p);
  111. return DataLen;
  112. }
  113. //从厂商编号到用户数据依次累加的累加和,取累加的档�8位作为校验码
  114. unsigned char TSGetCheckSum(unsigned char *pData,int len)
  115. {
  116. int i;
  117. unsigned char sum= pData[1]; //sum=0;
  118. for(i=1;i<len-1;i++){
  119. sum=sum^pData[i+1];
  120. }
  121. return sum;
  122. }
  123. //判断大小端
  124. int Check_sys()
  125. {
  126. union Un
  127. {
  128. char c;
  129. int i;
  130. }un;
  131. un.i = 1;
  132. return un.c;
  133. }
  134. /**********************
  135. **消息头12字节,消息体属性2个字节,这两个字节的16位。低14位是消息体长度
  136. sutProductPara.APN
  137. **************************/
  138. int TSTcpPacket(unsigned char *Buffer,unsigned long PSN,unsigned short ID,unsigned char *pData,int DataLen)
  139. {
  140. static unsigned short liushiID=0;
  141. unsigned char *pBuf=Buffer,sum;
  142. int j,flag = 0,i=0;
  143. int talpage=1,MSnum = 0;
  144. char Psnsv[12];
  145. static unsigned short snum = 1;
  146. unsigned short Len=DataLen+6;
  147. unsigned short pageItem=DataLen+12;
  148. snprintf(Psnsv, sizeof(Psnsv),"%08u",(unsigned int)PSN);
  149. pBuf[i++]=0x7e;
  150. pBuf[i++]=(ID>>8)&0xff;
  151. pBuf[i++]=ID&0xff;
  152. //消息体属性
  153. pBuf[i++]=DataLen &0x3f;
  154. pBuf[i++]=DataLen &0xff;
  155. //PSN
  156. for(j=0;j<8;j++){
  157. pBuf[i++]=Psnsv[j];
  158. }
  159. //消息流水号
  160. pBuf[i++] = (liushiID>>8)&0xff;
  161. pBuf[i++] = liushiID&0xff;
  162. liushiID++;
  163. if(liushiID>65533){
  164. liushiID=0;
  165. }
  166. if(pData!=NULL)
  167. {
  168. //snum++;
  169. //消息包封装项
  170. //msgPacket.msgPacketID=0x30;
  171. //msgPacket.msgTotalCount=0x30;
  172. //pBuf[i++] = msgPacket.msgPacketID;
  173. //pBuf[i++] = msgPacket.msgTotalCount;
  174. //MSnum++;
  175. //包封装项 4
  176. for(j=0;j<DataLen;j++)
  177. {//0
  178. pBuf[i++]= pData[j];
  179. }
  180. }
  181. sum = TSGetCheckSum(pBuf,i);
  182. pBuf[i++] = sum;
  183. //对整体数据,除sum进行转义
  184. i=escapse(&pBuf[1],i-1);//头的7E不转义
  185. i++;
  186. pBuf[i++] = 0x7e;
  187. return i;
  188. }
  189. //从source查找长度为targetLen目标的target,找到后返回目标段后一字节的索引,没找到返回-1,source结束为sourceEndIndicator
  190. //witchOne: 找第几个目标
  191. //targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2)
  192. short FindTargetIndex(char *source, char sourceEndIndicator, char *target, unsigned char targetLen,unsigned char witchOne)
  193. {
  194. unsigned short targetIndex;
  195. unsigned char targetNum;
  196. targetIndex=0;
  197. targetNum=0;
  198. while(*source!=sourceEndIndicator){
  199. if(0==memcmp(source, target, targetLen))
  200. {//找到了
  201. targetNum++;
  202. if(targetNum == witchOne)
  203. return (targetIndex+targetLen);
  204. }
  205. source++;
  206. targetIndex++;
  207. }
  208. return -1;
  209. }
  210. /**********************************
  211. 将TCP数据解析入结构体。
  212. **************************************/
  213. void TcpDataPack(unsigned char *pMsg)
  214. {
  215. //1、异或判断整包数据是否正确
  216. //LED[3]
  217. Device_Down.Led[0]=pMsg[15];
  218. Device_Down.Led[1]=pMsg[16];
  219. Device_Down.Led[2]=pMsg[17];
  220. //beep
  221. Device_Down.Beep=pMsg[18];
  222. if(Device_Down.Led[0]==1)WARN_LED1_HIGH;
  223. else WARN_LED1_LOW;
  224. if(Device_Down.Led[1]==1)WARN_LED2_HIGH;
  225. else WARN_LED2_LOW;
  226. if(Device_Down.Led[2]==1)WARN_LED3_HIGH;
  227. else WARN_LED3_LOW;
  228. if(Device_Down.Beep==1)WARN_BEEP_HIGH;
  229. else WARN_BEEP_LOW;
  230. //Rigister
  231. memcpy(&Device_Down.sut_device_write,&pMsg[19],sizeof(SUT_DEVICE_WRITE)*32);
  232. }
  233. /************************************************************************************************/
  234. void ESP8285_TCP_RecvHandle(unsigned char *pMsg,unsigned short tempLen)
  235. {
  236. char buf[20];
  237. char result[10];
  238. unsigned short cmd,ackCmd,smsLen;
  239. unsigned char Result,i,buBiaoResponsed;
  240. short targetIndex;
  241. short z=0;
  242. //////////处理布标类型指令
  243. cmd = (pMsg[1]<<8) | (pMsg[2]&0xff);
  244. buBiaoResponsed=1;
  245. sprintf(buf, "\r\ncmd=%04x\r\n", cmd);
  246. SlwTrace(INF, buf);
  247. //7E 8100 000A 000166000016 0250 0100 00 20161118165030 E07E 成功
  248. switch(cmd)
  249. {//布标命令返回
  250. case TS_TERMINAL_CONTROL://
  251. //解析数据包入结构体
  252. SlwTrace(INF,"/**************TCP data*************************/\r\n");
  253. SlwTrace(INF,"\r\n");
  254. for(z=0;z<tempLen;z++){
  255. //printf("%02x",pMsg[z]);
  256. sprintf(buf,"%02x",pMsg[z]);
  257. SlwTrace(INF, buf);
  258. }
  259. SlwTrace(INF,"\r\n");
  260. SlwTrace(INF,"/**************TCP data End*************************/\r\n");
  261. TcpDataPack(pMsg);
  262. ProcessSetControl();
  263. break;
  264. case TS_PLATFORM_LOGIN_ANSWER:
  265. //登录应答
  266. /*********************************************************************/
  267. sut_sys_status.Logined=pMsg[4];
  268. ServerStatus=OPENED;
  269. break;
  270. case TS_TERMINAL_HEARTBEAT_ANSWER: //心跳应答
  271. if(sut_sys_status.Logined==1) HeartTimeOut=20;
  272. break;
  273. default:
  274. buBiaoResponsed=0;
  275. break;
  276. }
  277. }
  278. void TcpProcess(unsigned char *pMsg,unsigned int ret)
  279. {
  280. short targetIndex;
  281. unsigned short tempLen;
  282. sut_sys_status.SetSlaveing=1;
  283. if(sutProductPara.ConnectType==1)
  284. {
  285. //2、解包数据 无线
  286. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1)))
  287. {
  288. tempLen = atoi(&pMsg[targetIndex]);
  289. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":",1,1)))
  290. {
  291. //走布标判断
  292. if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e)
  293. {//是布标协议,进行转义
  294. tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1);
  295. //
  296. ESP8285_TCP_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen);
  297. }else
  298. {
  299. SlwTrace(INF, "Unknown Protocol");
  300. }
  301. }
  302. }
  303. }else{
  304. //2、解包数据 有线
  305. //走布标判断
  306. if(pMsg[0] == 0x7e && pMsg[ret-1] == 0x7e)
  307. {//是布标协议,进行转义
  308. tempLen=reduce((unsigned char *)&pMsg[1], ret-1);
  309. //
  310. ESP8285_TCP_RecvHandle((unsigned char *)&pMsg[0],ret);
  311. }else
  312. {
  313. SlwTrace(INF, "Unknown Protocol");
  314. }
  315. }
  316. sut_sys_status.SetSlaveing=0;
  317. }
  318. void TcpProcess2(char *pMsg)
  319. {
  320. short targetIndex;
  321. unsigned short tempLen;
  322. //2、解包数据 无线
  323. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1)))
  324. {
  325. tempLen = atoi(&pMsg[targetIndex]);
  326. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":",1,1)))
  327. {
  328. //走布标判断
  329. if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e)
  330. {//是布标协议,进行转义
  331. tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1);
  332. //
  333. ESP8285_TCP_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen);
  334. }else
  335. {
  336. SlwTrace(INF, "Unknown Protocol");
  337. }
  338. }
  339. }
  340. }
  341. void Tcptick( void )
  342. {
  343. static char step;
  344. static int sucSecCt=0;
  345. static char LoginTryCt=0;
  346. static char ReLoginTryct=0;
  347. // static char HeartTickCt=0;
  348. //===========以下控制每秒执行一次============
  349. if(os_time_get() < sucSecCt) return;
  350. sucSecCt=os_time_get()+100;
  351. ///////////////////////////////////////////////////////////////////////////////////////
  352. if(sut_sys_status.Logined==0 && WifiStatue==CONNECTOK)//链接正常且未登录
  353. {
  354. /***********未登录时候发送登录包*****************/
  355. if(ReLoginTryct>3){
  356. /************登录未成功,每2分钟请求一次************/
  357. if(LoginTryCt++>20){
  358. TSStatueSendPosition(TS_TERMINAL_LOGIN);
  359. }
  360. }else if(++LoginTryCt>10){
  361. LoginTryCt=0;
  362. ReLoginTryct++;
  363. TSStatueSendPosition(TS_TERMINAL_LOGIN);
  364. }
  365. }else if(sut_sys_status.Logined==1 && WifiStatue==CONNECTOK){
  366. /***********定时15S发送心跳包*****************/
  367. if(HeartTickCt++>15){
  368. TSStatueSendPosition(TS_TERMINAL_HEARTBEAT);
  369. HeartTickCt=0;
  370. HeartTimeOut=0;
  371. }
  372. if(HeartTimeOut--==0)WifiStatue=WIFIINVALID; //心跳超时
  373. }else{
  374. ///////////////////链接异常////////////////////////////////////////重新链接
  375. WifiStatue=WIFIINVALID;
  376. }
  377. }