123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- /********************************************************************************
- * File Name: GpsTask.c
- * Function Describe:The GpsTask for the system
- * Relate Module:
- * Explain: Hardware version is HS110C
- * Writer: ShiLiangWen
- * Date: 2015.4.12
- *******************************************************************************/
- #define THIS_FILE_ID 16
- //--------------------------------------------------------------------------------
- #include "includes.h"
- //OS_TID idGpsTask=0;
- //U64 stkGpsTask[GPS_TASK_STK_SIZE];
- SUT_GPS_STATUS sutGpsStatus;
- SUT_MESS sutMess;
- int g_iCSQ=-1;
- const unsigned short GPS_TimeTable[GPS_TABLE_NUM]={0,5,10,15,30,60,120,300};
- //const unsigned char GPS_TimeTable[]={5,10,15,30,60};
- //======================================
- static STATUE GpsServerStatus=CLOSE;
- unsigned char TimeFlag=1;//获取服务器时间标记
- unsigned char sucGpsSentTcpCt=0;//从启动发送到收到计数器
- unsigned char TeminalInfoRevOK=0;
- /*******************************************************************************
- 校验
- *******************************************************************************/
- unsigned char GetCheck(unsigned char *data, unsigned short datalen)
- {
- unsigned char ck=0;
- int i;
- for(i=0;i<datalen;i++){
- ck^=data[i];
- }
- return ck;
- }
- /*****************************************************************************
- *发送数据封包
- format: 0x29 0x29 CMD Len PSN[4] Data Check 0x0D
- Len=DataLen+6
- ******************************************************************************/
- int SendBufPack(char *pBuf,unsigned char cmd,unsigned short DataLen,unsigned char *data)
- {
- SUTDS ds;
- SUTDL dl;
- int i,j;
- if(DataLen>UART3_TX_BUFFER_SIZE)return 0;
- //包头
- pBuf[0]=0x29;//Head
- pBuf[1]=0x29;//Head
- pBuf[2]=cmd;//CMD
- //DataLen
- ds.Data.usData=DataLen+6;
- pBuf[3]=ds.Data.ucData.b2;
- pBuf[4]=ds.Data.ucData.b1;
- //PSN
- dl.Data.ulData=sutProductPara.PSN;
- pBuf[5]=dl.Data.ucData.b4;
- pBuf[6]=dl.Data.ucData.b3;
- pBuf[7]=dl.Data.ucData.b2;
- pBuf[8]=dl.Data.ucData.b1;
- //Data
- j=9;
- for(i=0;i<DataLen;i++){
- pBuf[j++]=data[i];
- }
- //check
- pBuf[j++]= GetCheck(TxBuffer3,(DataLen+6));
- pBuf[j++]=0x0D;
- return j;
- }
- /********************************************************************************************************
- *SendTick 发送心跳包
- *********************************************************************************************************/
- void SendTick(void)
- {
- int len;
- char AT[100];
- len=SendBufPack((char *)TxBuffer3,0,0,NULL);
-
- snprintf(AT, sizeof(AT),"AT+ZIPSEND=1,%d\r",len);
-
- ModemSendAT(AT);
- ModemSendData(TxBuffer3,len);
- }
- /*******************************************************************
- *GetCSQ
- ********************************************************************/
- int GetCSQ(char* msg)
- {//+CSQ: 29,56
- return atoi(&msg[6]);
- }
- int GetCCSQ(char* msg)
- {//+CCSQ: 29,56
- return atoi(&msg[7]);
- }
- /*******************************************************************
- *GetPPPStatus
- ********************************************************************/
- STATUE GetPPPStatus(char *msg)
- {//+POC_PPP:0
- //+POC_PPP:1
- if(msg[9]=='1')return OPEN;
- else return CLOSE;
- }
- STATUE GetGpsServerStatus(char *msg){
- if(ModemStrCmp(msg,"+RECV:")){
- if(msg[13]=='O' && msg[15]=='E' && msg[18]=='D'){ //OPENED
- return OPEN;
- }else{
- return CLOSE;
- }
- } else return INVALID;
- }
- /*******************************************************************
- *NetRecvMsgHandle
- ********************************************************************/
- int NetRecvMsgHandle(char *msg)
- {
- if(!ModemStrCmp(msg,"+ZIPRECV:0,"))//+ZIPRECV:0,10,XXXX
- return 0;
-
- }
- /*******************************************************************
- *GetIPStatus
- ********************************************************************/
- STATUE GetIPStatus(char *msg)
- {
- //if(ModemStrCmp(msg,"+ZIPSTATUS:")){ //+ZIPSTATUS: xxxx
- if(msg[12]=='E' && msg[14]=='T' && msg[22]=='D'){//+ZIPSTATUS: ESTABLISHED
- // if(TimeFlag==0){
- // ModeGetTime();//获取时间 文工说只有IP通了 才正确
- // TimeFlag+=1;
- // }
- return OPEN;
- }else if(msg[12]=='S' && msg[14]=='N' && msg[19]=='T'){//+ZIPSTATUS: SYN_SENT
- return SYN_SENT;
- }else{
- return CLOSE;
- }
- //}else return INVALID;
- }
- /*******************************************************************
- *GetIPStatusu
- ********************************************************************/
- STATUE GetIPStatusu(char *msg)
- {
- //if(ModemStrCmp(msg,"+ZIPSTATUSU:")){ //+ZIPSTATUSU: ESTABLISHED
- if(msg[13]=='E' && msg[15]=='T' && msg[23]=='D'){
- return OPEN;
- }else if(msg[13]=='S' && msg[15]=='N' && msg[20]=='T'){
- return SYN_SENT;
- }else{
- return CLOSE;
- }
- //}else return INVALID;
- }
- /*******************************************************************
- *GetCNUM
- 返回:0--未获取 1--获取成功
- ********************************************************************/
- int GetCNUM(void)
- {
- /*
- int timerout=300;
- int i,len;
- char *msg;
- INT8U err;
- int ct=100;
- while(timerout){
- timerout--;
- if(++ct>100){
- ct=0;
- ModemSendAT("AT+CNUM?\r\n");
- OSQFlush(ModemQ);
- }
-
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){
- if(ModemStrCmp(msg,"+CNUM:")){ //+CNUM:1064910139657
- len=strlen(&msg[6]);
- if(15==len){
- for(i=0;i<13;i++)sutProductPara.CNUM[i]=msg[6+i];
- sutNetPara.CNUM[13]=0;
- return 1;
- }
- }
- }
- }*/
- return 0;
- }
- /*******************************************************************
- *GetIPStatus
- 返回:0--未获取 1--获取成功
- ********************************************************************/
- int GetUIMID(void)
- {
- /*
- int timerout=300;
- int i,len;
- char *msg;
- INT8U err;
- int ct=100;
- while(timerout){
- timerout--;
- if(++ct>100){
- ct=0;
- ModemSendAT("AT+CIMI\r\n");
- OSQFlush(ModemQ);
- }
- msg = (char *)OSQPend(ModemQ, 1, &err);
- if(err==OS_ERR_NONE){
- if(ModemStrCmp(msg,"+CIMI:")){ //+CIMI: 460037590079119
- len=strlen(&msg[7]);
- if(17==len){
- for(i=0;i<15;i++)sutNetPara.UIMID[i]=msg[7+i];
- sutNetPara.UIMID[15]=0;
- return 1;
- }
- }
- }
- }
- */
- return 0;
- }
- void StartFeedBack(void)
- {
- if(sutFeed.feedBackStart==0) return;
- TSGpsServerConect();
- sutFeed.feedBackStart=0;
- }
- /*************************************************************
- *^IPRECV:1,端口,IP域名,远程服务端口,五socket 1--UDP 0--TCP
- *************************************************************/
- //+ZIPRECV:1,xxx,"7e8300 000c 000009771810000001 4130313233343536373839 b87e"
- void RecvModemData(char *msg)
- {
- int i;
- char *pData;
- unsigned short DataLen,temLen;
- unsigned char cmd;
- char tmp[5];
- char buf[100];
- DataLen=atoi((char *)&msg[11]);
- if(DataLen<10){ //+ZIPRECV:1,8,xxx
- pData=msg+13;
- }else if(DataLen<100){
- pData=msg+14;
- }else if(DataLen<1000){
- pData=msg+15;
- }else{//非法
- pData=msg+16;
- }
-
- snprintf(buf, sizeof(buf),"\r\nTcpRecv[%d]",DataLen);
- SlwTrace(INF,buf,1);
- #if 0 //0
- temLen = DataLen;
- if(temLen>30)temLen=30;
- buf[0]='<';buf[1]='<';buf[2]=0;
- for(i=0;i<temLen;i++){
- snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
- strcat(buf,tmp);
- }
- strcat(buf,"\r\n");
- SlwTrace(DEBUG,buf);
- #endif
- //处理
- cmd=TSGpsServerProcess((unsigned char *)pData,DataLen);
- g_ucModemSentTcpCt=0;
- }
- SUT_AUTHCTL sutGpsCtl;
- /***********************************************************
- *控制发送位置信息
- 此函数每秒执行一次
- ************************************************************/
- void GpsCtrlSendPos(void)
- {
- static unsigned char authTryTime=0;//发起鉴权次数,也代表连续失败多少次
- static unsigned short SendTime=0;
- static unsigned char IccidTick=60;
- static unsigned char EventTick=15;
- static unsigned char suctt;
- static unsigned short realTimeSecond=0xff00;
- char packetHadSend=0;
- static unsigned char sendLocation=0;
- uint32_t AvgSpeed;
- int i;
- static unsigned int susGpsTimingSendCt=0;//控制按时间发送
- char buf[30];
-
-
- //连续发3次未见成功,则断开链接并重启链接
- if(g_ucModemSentTcpCt>3){
- sutGpsInfo.isServerLogin=0;
- g_ucModemSentTcpCt=0;
- snprintf(buf, sizeof(buf), "AT+TCPCLOSE=%d\r", GPS_DATA_SOCKET);
- ModemSendAT(buf);
- sutGpsStatus.IPStatus=CLOSE;
- g_ucModemSentTcpCt=0;
- sutGpsInfo.isServerLogin=0;
- }
- //
- if(g_iCSQ==99 || sutGpsStatus.IPStatus!=OPEN || 0==sutGpsInfo.isServerLogin)
- {
- susGpsTimingSendCt=0;
- sucGpsSentTcpCt=15;//这里能让条件达到后,及时去注册或鉴权
- return;
- }
-
- //计算平均速度
- sutGpsInfo.speedbuf[4]=sutGpsInfo.speedbuf[3];
- sutGpsInfo.speedbuf[3]=sutGpsInfo.speedbuf[2];
- sutGpsInfo.speedbuf[2]=sutGpsInfo.speedbuf[1];
- sutGpsInfo.speedbuf[1]=sutGpsInfo.speedbuf[0];
- sutGpsInfo.speedbuf[0]=sutGpsInfo.speed;
- for(i=0;i<5;i++){
- AvgSpeed=sutGpsInfo.speedbuf[i];
- }
- AvgSpeed/=5;
- sutGpsInfo.AvgSpeed=AvgSpeed;
- ////////////////////////////////////////////////
- if(sutGpsInfo.isGpsAuthOk==0)
- {//鉴权失败
- if(++sucGpsSentTcpCt>=sutGpsCtl.reTryPerSeconds)//定时再去鉴权
- {//15秒
- sucGpsSentTcpCt=0;
- susGpsTimingSendCt=0;
- ///////////////////////////////
- //如果鉴权3次失败后则做一次注册请求
- if(sutPocStatus.Logined)
- {
- if(++authTryTime >= sutGpsCtl.reTryAuthTimes)
- {
- authTryTime=0;
- sutGpsCtl.reTryAuthTimes=3;
- sutGpsCtl.reTryPerSeconds=15;
- Registration();
- }else
- Authentication();
- }
- }
- return;//鉴权未成功的返回
- }else
- {
- if(g_ucModemSentTcpCt==0)
- {
- sucGpsSentTcpCt=0;
- g_ucModemSentTcpCt=0;
- }
- }
-
-
-
- //发送终端信息给服务器
- if(++IccidTick>60&&TeminalInfoRevOK==0)
- {
- IccidTick=0;
- buBiaoICCID(GPS_DATA_SOCKET);
- }
-
- if(EventTick++>15&&sutGpsInfo.Ts_Event_Chek==1){
- buSendEvent(GPS_DATA_SOCKET);
- sutGpsInfo.Ts_Event_Chek=0;
- }
-
- //鉴权成功并且定位上则定时发送位置包
- //---控制按时间间隔发送GPS位置
- sutGpsInfo.GPS_SecondCnt++;
-
- if(sutGpsInfo.isGpsValid && g_uiGpsStat)
- {//可以发位置包,检测时间是否到了
- if(sutGpsInfo.GPS_SecondCnt>=GPS_TimeTable[newPara.gpsTimeIndex])
- {
- sutGpsInfo.GPS_SecondCnt=0;
- sendLocation=1;
- }
- if(isSendDataEnable() && sendLocation != 0){
- sendLocation=0;
- TSGpsTimingSendPos();
- packetHadSend=1;//已发了数据包
- }
- }else
- {//没定位,不发位置包,则发心跳
- if(sutGpsInfo.GPS_SecondCnt >= 60)
- {
- if(isSendDataEnable()){
- sutGpsInfo.GPS_SecondCnt=0;
- TS_SendHeartTick();
- packetHadSend=1;//已发了数据包
- }
- }
- }
-
- if(++realTimeSecond > 180 && packetHadSend==0)
- {//180秒获取一次时间
- if(isSendDataEnable()){
- TS_ReqRealTime();
- realTimeSecond=0;
- }
- }
-
- if(++suctt >= 30)
- {
- suctt = 0;
- if(!g_uiGpsStat) SlwTrace(INF, "GPS close",1);
- }
- }
- STATUE GetIPNewStatus(char *msg, unsigned char socketNum)
- {//+TCPSTATUS:x:s [socket: status]
- //+TCPSTATUS:1:1
- //+TCPSTATUS:ERROR!
- STATUE sta=CLOSE;
- unsigned char thisSocket;
-
- thisSocket = atoi(&msg[11]);
- if(msg[13] == '1') sta = OPEN;
- else if(msg[13] == '0')sta = CLOSE;
-
- if(thisSocket == socketNum) return sta;
- else return INVALID;
- }
- void IPStatusAna(char *msg, unsigned char *socket, STATUE *status)
- {//+TCPSTATUS:x:s [socket: status]
- //+TCPSTATUS:1:1
- //+TCPSTATUS:ERROR!
- unsigned char thisSocket;
- STATUE sta=CLOSE;
-
- thisSocket=(unsigned char )atoi(&msg[11]);
- if('1'==msg[13]) sta=OPEN;
- else if('0' == msg[13]) sta=CLOSE;
-
- *socket=thisSocket;
- *status=sta;
- }
|