| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- #include "includes.h"
- WIFISTATUE WifiStatue;
- DEVICELOGIN DeviceLogin;
- SERVERRESP ServerResp;
- unsigned char HeartTickCt;
- unsigned char HeartTimeOut;
- /************************************************************
- 状态信息汇报
- StaueSendPosition
- 发送位置数据
- Cmd=0x0200
- 总长度=
- ***********************************************************************************/
- void TSStatueSendPosition(short cmd)
- {
- int i;
- int len;
- unsigned char buf[400];//150
- char temp[3];
- char printfbuf[20];
- switch(cmd)
- {
- case TS_LOCATION_INFORMATION_REPORTING: //状态上传
-
- len=TSTcpPacket(buf,sutProductPara.PSN,TS_LOCATION_INFORMATION_REPORTING,(unsigned char *)&Device_Up,sizeof(SUT_UP));
- HeartTickCt=0;
- break;
- case TS_TERMINAL_LOGIN: //登录包
- SlwTrace(INF,"----登录----\r\n");
- memset(&DeviceLogin,0,sizeof(DeviceLogin));
- DeviceLogin.DeviceSN=sutProductPara.PSN;
- len=TSTcpPacket(buf,sutProductPara.PSN,TS_TERMINAL_LOGIN,(unsigned char *)&DeviceLogin,sizeof(DEVICELOGIN));
- HeartTickCt=0;
- break;
- case TS_TERMINAL_HEARTBEAT: //心跳包
- SlwTrace(INF,"---心跳----\r\n");
- len=TSTcpPacket(buf,sutProductPara.PSN,TS_TERMINAL_HEARTBEAT,0,0);
-
- break;
-
- default:
-
- break;
- }
- /////////////////////////////////////
- SlwTrace(INF,"/**********start***********/\r\n");
- snprintf(printfbuf,sizeof(printfbuf),"LEN====%d\r\n",len);
- SlwTrace(INF,printfbuf);
-
- for(i=0;i<len;i++){
- FEED_EXTWATCHDOG();
- sprintf(temp, "%02x",buf[i]);
- temp[2]=0;
- SlwTrace(INF,temp);
- }
- SlwTrace(INF," \r\n");
- buf[len]=0x0d;
- buf[len+1]=0x0a;
- buf[len+2]=0x0;
- SlwTrace(INF,"/**********end***********/\r\n");
- if(sutProductPara.ConnectType==1)ModemSendData(buf,len);
- if(sutProductPara.ConnectType==0)WiredSendTcpData(buf,len);
- }
- /*************************************************************************************
- *
- **************************************************************************************/
- // replace 0x7d 0x01 with 0x7d and 0x7d 0x02 with 0x7e 接收
- //长度不会变大,只会变小或不变
- int reduce(unsigned char *pData,int DataLen)
- {
- unsigned char *p = pData;
- int data_len=0;
- int i;
-
- if(DataLen==0) return 0;
- for(i=0;i<DataLen-1;i++)
- {
- if(pData[i] == 0x7d && pData[i+1] == 0x01)
- {
- *p++ = 0x7d;i++;
- }else if(pData[i] == 0x7d && pData[i+1] == 0x02)
- {
- *p++ = 0x7e;i++;
- }else *p++=pData[i];
- data_len++;
- }
-
- return data_len;
- }
- // loop every character, replace 0x7d with 0x7d 0x01 and 0x7e with 0x7d 0x02 发送
- int escapse(unsigned char *pData,int DataLen) {
-
- unsigned char *p= (unsigned char *)malloc(DataLen +300); //*2
- unsigned char * q = p;
- int data_len = 0;
- int i;
-
- if (DataLen == 0) {
- return 0;
- }
-
- memset(p, 0, DataLen+300); //*2
-
- for (i = 0; i < DataLen; i ++) {
- if (pData[i] == 0x7d) {
- *q ++ = 0x7d;
- *q ++ = 0x01;
- data_len += 2;
- } else if (pData[i] == 0x7e) {
- *q ++ = 0x7d;
- *q ++ = 0x02;
- data_len += 2;
- } else {
- *q ++ = pData[i];
- data_len += 1;
- }
- }
- memcpy(pData, p, data_len);
- free(p);
- DataLen = data_len;
- //free(p);
- return DataLen;
- }
- //从厂商编号到用户数据依次累加的累加和,取累加的档�8位作为校验码
- unsigned char TSGetCheckSum(unsigned char *pData,int len)
- {
- int i;
- unsigned char sum= pData[1]; //sum=0;
- for(i=1;i<len-1;i++){
- sum=sum^pData[i+1];
- }
- return sum;
- }
- //判断大小端
- int Check_sys()
- {
- union Un
- {
- char c;
- int i;
- }un;
- un.i = 1;
- return un.c;
- }
- /**********************
- **消息头12字节,消息体属性2个字节,这两个字节的16位。低14位是消息体长度
- sutProductPara.APN
- **************************/
- int TSTcpPacket(unsigned char *Buffer,unsigned long PSN,unsigned short ID,unsigned char *pData,int DataLen)
- {
- static unsigned short liushiID=0;
- unsigned char *pBuf=Buffer,sum;
- int j,flag = 0,i=0;
- int talpage=1,MSnum = 0;
- char Psnsv[12];
- static unsigned short snum = 1;
- unsigned short Len=DataLen+6;
- unsigned short pageItem=DataLen+12;
- snprintf(Psnsv, sizeof(Psnsv),"%08u",(unsigned int)PSN);
- pBuf[i++]=0x7e;
-
- pBuf[i++]=(ID>>8)&0xff;
-
- pBuf[i++]=ID&0xff;
-
- //消息体属性
- pBuf[i++]=DataLen &0x3f;
- pBuf[i++]=DataLen &0xff;
-
- //PSN
- for(j=0;j<8;j++){
-
- pBuf[i++]=Psnsv[j];
-
- }
-
- //消息流水号
- pBuf[i++] = (liushiID>>8)&0xff;
- pBuf[i++] = liushiID&0xff;
- liushiID++;
- if(liushiID>65533){
- liushiID=0;
- }
- if(pData!=NULL)
- {
- //snum++;
- //消息包封装项
- //msgPacket.msgPacketID=0x30;
- //msgPacket.msgTotalCount=0x30;
- //pBuf[i++] = msgPacket.msgPacketID;
- //pBuf[i++] = msgPacket.msgTotalCount;
- //MSnum++;
- //包封装项 4
- for(j=0;j<DataLen;j++)
- {//0
- pBuf[i++]= pData[j];
- }
- }
- sum = TSGetCheckSum(pBuf,i);
- pBuf[i++] = sum;
- //对整体数据,除sum进行转义
- i=escapse(&pBuf[1],i-1);//头的7E不转义
- i++;
- pBuf[i++] = 0x7e;
- return i;
-
- }
- //从source查找长度为targetLen目标的target,找到后返回目标段后一字节的索引,没找到返回-1,source结束为sourceEndIndicator
- //witchOne: 找第几个目标
- //targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2)
- short FindTargetIndex(char *source, char sourceEndIndicator, char *target, unsigned char targetLen,unsigned char witchOne)
- {
- unsigned short targetIndex;
- unsigned char targetNum;
- targetIndex=0;
- targetNum=0;
-
- while(*source!=sourceEndIndicator){
-
- if(0==memcmp(source, target, targetLen))
- {//找到了
- targetNum++;
- if(targetNum == witchOne)
- return (targetIndex+targetLen);
- }
- source++;
- targetIndex++;
-
- }
- return -1;
- }
- /**********************************
- 将TCP数据解析入结构体。
- **************************************/
- void TcpDataPack(unsigned char *pMsg)
- {
- //1、异或判断整包数据是否正确
- //LED[3]
- Device_Down.Led[0]=pMsg[15];
- Device_Down.Led[1]=pMsg[16];
- Device_Down.Led[2]=pMsg[17];
- //beep
- Device_Down.Beep=pMsg[18];
-
- if(Device_Down.Led[0]==1)WARN_LED1_HIGH;
- else WARN_LED1_LOW;
- if(Device_Down.Led[1]==1)WARN_LED2_HIGH;
- else WARN_LED2_LOW;
- if(Device_Down.Led[2]==1)WARN_LED3_HIGH;
- else WARN_LED3_LOW;
-
- if(Device_Down.Beep==1)WARN_BEEP_HIGH;
- else WARN_BEEP_LOW;
-
- //Rigister
- memcpy(&Device_Down.sut_device_write,&pMsg[19],sizeof(SUT_DEVICE_WRITE)*32);
- }
- /************************************************************************************************/
- void ESP8285_TCP_RecvHandle(unsigned char *pMsg,unsigned short tempLen)
- {
-
- char buf[20];
- char result[10];
- unsigned short cmd,ackCmd,smsLen;
- unsigned char Result,i,buBiaoResponsed;
- short targetIndex;
- short z=0;
-
- //////////处理布标类型指令
- cmd = (pMsg[1]<<8) | (pMsg[2]&0xff);
- buBiaoResponsed=1;
- sprintf(buf, "\r\ncmd=%04x\r\n", cmd);
- SlwTrace(INF, buf);
- //7E 8100 000A 000166000016 0250 0100 00 20161118165030 E07E 成功
- switch(cmd)
- {//布标命令返回
-
- case TS_TERMINAL_CONTROL://
- //解析数据包入结构体
- SlwTrace(INF,"/**************TCP data*************************/\r\n");
- SlwTrace(INF,"\r\n");
- for(z=0;z<tempLen;z++){
- //printf("%02x",pMsg[z]);
- sprintf(buf,"%02x",pMsg[z]);
- SlwTrace(INF, buf);
- }
- SlwTrace(INF,"\r\n");
- SlwTrace(INF,"/**************TCP data End*************************/\r\n");
- TcpDataPack(pMsg);
- ProcessSetControl();
-
- break;
- case TS_PLATFORM_LOGIN_ANSWER:
- //登录应答
- /*********************************************************************/
- sut_sys_status.Logined=pMsg[4];
- ServerStatus=OPENED;
- break;
-
- case TS_TERMINAL_HEARTBEAT_ANSWER: //心跳应答
- if(sut_sys_status.Logined==1) HeartTimeOut=20;
- break;
-
- default:
- buBiaoResponsed=0;
- break;
- }
-
- }
- void TcpProcess(unsigned char *pMsg,unsigned int ret)
- {
- short targetIndex;
- unsigned short tempLen;
- sut_sys_status.SetSlaveing=1;
-
- if(sutProductPara.ConnectType==1)
- {
- //2、解包数据 无线
- if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1)))
- {
- tempLen = atoi(&pMsg[targetIndex]);
- if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":",1,1)))
- {
- //走布标判断
- if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e)
- {//是布标协议,进行转义
- tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1);
- //
- ESP8285_TCP_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen);
- }else
- {
- SlwTrace(INF, "Unknown Protocol");
- }
- }
- }
- }else{
- //2、解包数据 有线
- //走布标判断
- if(pMsg[0] == 0x7e && pMsg[ret-1] == 0x7e)
- {//是布标协议,进行转义
- tempLen=reduce((unsigned char *)&pMsg[1], ret-1);
- //
- ESP8285_TCP_RecvHandle((unsigned char *)&pMsg[0],ret);
- }else
- {
- SlwTrace(INF, "Unknown Protocol");
- }
- }
-
- sut_sys_status.SetSlaveing=0;
-
- }
-
-
- void TcpProcess2(char *pMsg)
- {
- short targetIndex;
- unsigned short tempLen;
- //2、解包数据 无线
- if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1)))
- {
- tempLen = atoi(&pMsg[targetIndex]);
- if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":",1,1)))
- {
- //走布标判断
- if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e)
- {//是布标协议,进行转义
- tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1);
- //
- ESP8285_TCP_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen);
- }else
- {
- SlwTrace(INF, "Unknown Protocol");
- }
- }
- }
-
- }
-
-
-
-
-
- void Tcptick( void )
- {
- static char step;
- static int sucSecCt=0;
- static char LoginTryCt=0;
- static char ReLoginTryct=0;
- // static char HeartTickCt=0;
-
-
- //===========以下控制每秒执行一次============
- if(os_time_get() < sucSecCt) return;
- sucSecCt=os_time_get()+100;
- ///////////////////////////////////////////////////////////////////////////////////////
-
- if(sut_sys_status.Logined==0 && WifiStatue==CONNECTOK)//链接正常且未登录
- {
- /***********未登录时候发送登录包*****************/
-
- if(ReLoginTryct>3){
- /************登录未成功,每2分钟请求一次************/
- if(LoginTryCt++>20){
-
- TSStatueSendPosition(TS_TERMINAL_LOGIN);
- }
-
- }else if(++LoginTryCt>10){
- LoginTryCt=0;
- ReLoginTryct++;
- TSStatueSendPosition(TS_TERMINAL_LOGIN);
- }
-
- }else if(sut_sys_status.Logined==1 && WifiStatue==CONNECTOK){
-
- /***********定时15S发送心跳包*****************/
- if(HeartTickCt++>15){
- TSStatueSendPosition(TS_TERMINAL_HEARTBEAT);
- HeartTickCt=0;
- HeartTimeOut=0;
- }
- if(HeartTimeOut--==0)WifiStatue=WIFIINVALID; //心跳超时
-
- }else{
- ///////////////////链接异常////////////////////////////////////////重新链接
- WifiStatue=WIFIINVALID;
-
- }
- }
|