📄 gprsproc.cpp
字号:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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 + -