⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprsproc.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C), 2005, TopBond Tech. Co., Ltd.
* File name:       GPRSPROC.CPP
* Module name:     数据在GPRS通道中进行透明传输的模块
* Author/Date:     WuHuan  06/02/14 
* Version:         Ver 1.0
* Description:     建立GPRS数据透明传输通道,并进行无线数据传输系列函数的.CPP文件
* Others:          如有改动,请在下面的历史记录登记,谢谢合作!

------------------History-----------------------------
* Modifier/Date:    wuhuan 02.06.23 11:40
* Modify Reason:    显示心跳报文的系列号
* Modification:     把HIdx设为静态变量,增加把HIdx置0的语句;
------------------------------------------------------
* Modifier/Date:    //修订人及修订日期
* Modify Reason:    //修订原因
* Modification:     //修订的内容和位置的简要说明
------------------------------------------------------

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <time.h>
#include <dos.h>
#include <math.h>
#include "etr_ppp.h"
#include "gprs.h"
#include "RS232X3.h"
#include "etr232i.h"
#include "readini.h"
#include "tcpclnt.h"
#include "gprsproc.h"
#include "tmrisr.h"
#include "macrodef.h"
#include "cmdproc.h"

//#include "fileio.h"
//////////////////////////for keypad
#include "keymenu.h"

#define	  BUFSIZE	     180     //一次读入数据缓冲区的最大字节数
#define   WAITTICK     200

//#define   MAXTCPFAILCNT     3

//下列外部变量或数组的原型声明见MAIN.CPP文件
extern struct  SERVER_ID        Svr_ID;
extern int     ComIdx, BaudIdx, HeartBeat, TalkTime;
extern int     TaskFlg;
extern int DTUAddress[3];

/////////////////////////////////
char SIMNum[21];
char CenterName[21];
char StationName[21];
int  DCportnum[4];
char InitWaterLevel[6];
////////////////////////////////
//unsigned char TCPClosedCnt;


Runmode Rm=eb;
Conmode Cm=duplex;

//extern unsigned char TCPClosedCnt;

extern int Num_of_thr[2]; 
extern int Ivtime[2];
extern int DataWakeUp[2];   //add by wuhuan 2006.7.28 19:48
extern int TimingWakeUp[2];
extern int IvtimeWakeUp[2];
extern ThRWAKEUPSTRUCT ThrWakeUp[2][8];


TCP_STATE  TCP_Running( )
{     
	  char EndTimeBuf[10]; 
	               
    CONN_STATE	   TCPState = CLOSED;
         // keep TCP connection
       if (Rm==ms)
       {	
       	if (Cm==duplex) 		
         {       	
             TCPManager[1]->Running( );
             TCPState = TCPManager[0]->Running( );
         }
         else  //单工
         	{
           	 TCPState = TCPManager[0]->Running( );
           	 
           	 if(TCPManager[1]->GetConnState()!=CLOSED)
               TCPManager[1]->Close();
             
          }        
         
       }
       else if (Rm==eb)
       {	
       	 	if(Cm==duplex)       		
           {  
         	        TCPState =TCPManager[0]->Running( );
                   if  (TCPState !=  OPEN)
                       {TCPState = TCPManager[1]->Running( );}
                    else  TCPManager[1]->Running( );
       
           }
           else
           {
           	         	
                    if  ((TCPManager[0]->GetConnState()==CLOSED)&&(TCPManager[1]->GetConnState()!=CLOSED))
                      	
                       { TCPState = TCPManager[1]->Running( );}
                    
                    else if  ((TCPManager[0]->GetConnState()!=CLOSED)&&(TCPManager[1]->GetConnState()==CLOSED))
                      	
                       { TCPState = TCPManager[0]->Running( );  }
                     
                     else if ((TCPManager[0]->GetConnState()==CLOSED)&&(TCPManager[1]->GetConnState()==CLOSED))
           	         {
           	           		TCPState =CLOSED;
                          TCPManager[0]->Running( ); 
                          TCPManager[1]->Running( ); 
                 
                     }                             
                       
                    else
                    {
                    		  TCPState = TCPManager[0]->Running( );
                         if (TCPState ==OPEN)  TCPManager[1]->Close();
                     		 else
                     		 {
                     		  	TCPState = TCPManager[1]->Running( );
                     		   if  (TCPState==OPEN) TCPManager[0]->Close();
                     		 }	
                          
                    		  	
                    }
        	
           	}	
           	
           	
       }
	 	
	 	if(TCPState==CLOSED) 
	 	{    
          /*TCPClosedCnt++;
       	  if( TCPClosedCnt >= MAXTCPFAILCNT )  
       	  {  
              CloseAllTCPConn( );      	         	
	            TaskFlg = NeedInitUART;
       	  	  TCPClosedCnt= 0;  
       	  }*/   
       	  
        return TCPCLOSED; 
    }      
    else if(TCPState==OPEN)    
    {  	
    	  //TCPClosedCnt = 0;	    
    	  if(Timer10sCnt>=1000)
   		   {	   
   		    	 Timer10sCnt = 0;         	
   		    	 if(GetKPState==LOCK) printf("TCP Conn is OK!\n");  

   		   } 
   		     
   		   return TCPOPEN;
   	}
   	else if(TCPState==START)
   	{
 	      return  TCPSTART;  
 	  }
 	  else 
 	  {     	  		  
       return  TCPFAIL; 
    }
    
}

////////////////////////////////////////////////////////////////////////
//从应用服务端接收控制指令

unsigned char     RecFrom ; 
int Get_from_Svr(unsigned char *CmdDataBuf)
{     
	  int  len = 0; 

    // read Data from tcp connection
    len = TCPManager[0]->ReadData( CmdDataBuf, BUFSIZE );
    if(len>0)
    {
	       CmdDataBuf[len]='\0';
	       if(GetKPState==LOCK) printf( "Svr1_to_Modem:%s\n", CmdDataBuf);    	
       	 RecFrom = APPSERVER1;
       	 TCPManager[0]->SetTimeoutCnt( HeartBeat );
       	 TCPManager[0]->SetTalkTimeoutCnt( TalkTime );
       	 return len;
    }	   
    else len = TCPManager[1]->ReadData( CmdDataBuf, BUFSIZE );
         if(len>0)
         {
	            CmdDataBuf[len]='\0';
	            if(GetKPState==LOCK) printf("Svr2_to_Modem:%s\n", CmdDataBuf);          	
       	      RecFrom = APPSERVER2;
       	      TCPManager[1]->SetTimeoutCnt( HeartBeat );
       	      TCPManager[1]->SetTalkTimeoutCnt( TalkTime );
       	      return len;
         }
       
	  return  0; 	     
}

//////////////////////////////////////////////////////////////////////
//把数据发送到应用服务端

int Send_to_Svr( unsigned char *PutOutTemBuff, int len )
{
                                   
    if( len > 0 )                                   // RS232 data available
	  {
	       PutOutTemBuff[len]='\0';
	       if(GetKPState==LOCK) printf( "Modem_to_Svr:%s\n", PutOutTemBuff );
	               	 	
	       TCPManager[0]->WriteData( PutOutTemBuff, len );    // forward data to remote by TCP
	       TCPManager[1]->WriteData( PutOutTemBuff, len );    // forward data to remote by TCP
	       
	       TCPManager[0]->SetTimeoutCnt( HeartBeat );	
	       TCPManager[1]->SetTimeoutCnt( HeartBeat );	    

	       TCPManager[0]->SetTalkTimeoutCnt( TalkTime );	
	       TCPManager[1]->SetTalkTimeoutCnt( TalkTime );	                 
	  }
	         
	  //PutOutTemBuff[0]='\0';       
	  return  len;        
}	          

int Send_to_Single_Svr( unsigned char *PutOutTemBuff, unsigned char center, int len )
{  
	  int i;  //add by wuhuan 2006.5.24 
	  static unsigned long  StartWaitToSendTick1 = 0;
    static unsigned long  StartWaitToSendTick2 = 0;
	    	 
                                   
    if( len > 0 )                                   // RS232 data available
	  {
	       PutOutTemBuff[len]='\0';
	       
	       if(center==APPSERVER1)       	 	
	       {
	       	  if(clock( ) < (StartWaitToSendTick1 + WAITTICK))  return -999  ;
	       	  	
	       	  i = TCPManager[0]->WriteData( PutOutTemBuff, len );    // forward data to remote by TCP
	       	  
	       	  TCPManager[0]->SetTimeoutCnt( HeartBeat );
	       	  TCPManager[0]->SetTalkTimeoutCnt( TalkTime );	
	       	  
	          if(i>0) 
	          {	                  	 
	          	 if(GetKPState==LOCK) printf( "Modem_to_Svr1:%s\n", PutOutTemBuff );
	          }
	          else 
	          {  	          	 
	          	 StartWaitToSendTick1=clock( );
	          	 if(GetKPState==LOCK) printf( "Modem_to_Svr1: FAIL!\n");
	          }
	       }
	       else  if(center==APPSERVER2) 
	       {	
	       	  if(clock( ) < (StartWaitToSendTick2 + WAITTICK))  return -999  ;
	       	  	
	          i = TCPManager[1]->WriteData( PutOutTemBuff, len );    // forward data to remote by TCP	 
	                
	    	    TCPManager[1]->SetTimeoutCnt( HeartBeat );	
	          TCPManager[1]->SetTalkTimeoutCnt( TalkTime );
	          
	          if(i>0) 
	          {

	          	 if(GetKPState==LOCK) printf( "Modem_to_Svr2:%s\n", PutOutTemBuff );
	          }
	          else 
	          {
	          	 StartWaitToSendTick2=clock( );
	          	 if(GetKPState==LOCK) printf( "Modem_to_Svr2: FAIL!\n");
	          }
	       }              
	  }
	         
	  //PutOutTemBuff[0]='\0';    modify by wuhan 2006.5.24
	  
	  //return  len;  modify by wuhan 2006.5.24
	  
	  return  i;   //add by wuhuan 2006.5.24    
}

/////////////////////////////////////////////////////////////////////
//定时发送心跳包,维持TCP的连接
	       
int HeartBeat_Proc( )
{  		
	  int           r;
		unsigned char i;
		unsigned char k,len;
	  unsigned char j, checksum = 0;
	  unsigned char cs_bytecount;	  
	  unsigned char HeatBeatBuf[80];
	  
    for(i=0; i<2; i++)
    {    
    	  checksum = 0;
    	  if( TCPManager[i]->IsTimeout( )&&(TCPManager[i]->GetConnState( )==OPEN) )   // timeout processing
	      { 	       		  
		        HeatBeatBuf[0]= 0x68; 
		        HeatBeatBuf[1]= DTUAddress[0]; 
		        HeatBeatBuf[2]= DTUAddress[1];   
		        HeatBeatBuf[3]= 0x00;
		        HeatBeatBuf[4]= 0x68;
		        
		        HeatBeatBuf[5]= 0x91;  //心跳报文的功能码
		        
		        HeatBeatBuf[6]= 0x08;  //数据区部分共占8个字节
		        
		        HeatBeatBuf[7]= Rm;
		        HeatBeatBuf[8]= Cm;
		        HeatBeatBuf[9]= i;
		        
		        len = strlen(CenterName);
		        for(k=0; k<len; k++)
		          HeatBeatBuf[10+k]=CenterName[k];
		        for(k=0; k<20-len; k++)
		          HeatBeatBuf[10+len+k]=0x00;

		        len = strlen(StationName);
		        for(k=0; k<len; k++)
		          HeatBeatBuf[30+k]=StationName[k];
		        for(k=0; k<20-len; k++)
		          HeatBeatBuf[30+len+k]=0x00;	  
		        
		        len= strlen(SIMNum);
		        for(k=0; k<len; k++)
		          HeatBeatBuf[50+k]=SIMNum[k];     
		        
		        HeatBeatBuf[61]= DCportnum[0];
		        HeatBeatBuf[62]= DCportnum[1];
		        HeatBeatBuf[63]= DCportnum[2];
		        HeatBeatBuf[64]= DCportnum[3];
		        
		        for(k=0; k<6; k++)
		          HeatBeatBuf[65+k]= 0x00;  // 不足8个字节的整数倍补0x00
  		        
	          /////////////////////////////计算校验和  
		        cs_bytecount = HeatBeatBuf[6]*8 + 7;
		        for( j=0; j < cs_bytecount; j++ )
	 	        checksum += HeatBeatBuf[j];   
	 	
	 	        HeatBeatBuf[cs_bytecount]= checksum; //存放校验和的数值
	 	
	     	    HeatBeatBuf[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志	
	     	    
	     	    HeatBeatBuf[cs_bytecount+2]='\0';
	          
	          r = TCPManager[i]->WriteData( HeatBeatBuf, cs_bytecount+2 );
	          if(r<0) 
	          {
	          	 //TCPManager[i]->Close( );
	          	 if(GetKPState==LOCK) printf("HeartBeat Fail......./n");
	             //NB_Delay(1000);
	          }
	          else TCPManager[i]->SetTimeoutCnt( HeartBeat );
	          
	      }   
	   // NB_Delay(1);
	  }

	  
	  return 1;	  	  
}
	     	  		     

int GetIniPara( char *FileName, char *Group )
{
   if( ReadIni.GetField( FileName, Group, "RemoteIP", 0, Svr_ID.IPStr ) )
      strcpy( Svr_ID.IPStr, "61.183.111.107" );
   if( ReadIni.GetField( FileName, Group, "RemotePort", 0, Svr_ID.Port ) )
      Svr_ID.Port = 2008;
   if( ReadIni.GetField( FileName, Group, "COM", 0, ComIdx ) )
      ComIdx = 2;
   if( ReadIni.GetField( FileName, Group, "BaudIdx", 0, BaudIdx ) )
      BaudIdx = 12;
   if( ReadIni.GetField( FileName, Group, "HeartBeat", 0, HeartBeat ) )
      HeartBeat = 1200;
   return 0;
   
}

int GetGMSendIniPara( char *FileName )
{  
	 //////////////////////////////////////////	 	  
	 	  
	 if( ReadIni.GetField( FileName, "[Info]", "SIMNum", 0, SIMNum ) )
	 	   strcpy( SIMNum, "13988888888" );
	 if( ReadIni.GetField( FileName, "[Info]", "CenterName", 0, CenterName ) )
	 	   strcpy( CenterName , "中国" );
	 if( ReadIni.GetField( FileName, "[Info]", "StationName", 0, StationName) )
	 	   strcpy( StationName, "武汉" );	
	 if( ReadIni.GetField( FileName, "[Info]", "DCportnum0", 0, DCportnum[0]) )
	 	   DCportnum[0]=192;	
	 if( ReadIni.GetField( FileName, "[Info]", "DCportnum1", 0, DCportnum[1]) )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -