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

📄 sendsms.cpp

📁 一个在linux下连接Sybase数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "SendSms.hpp"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

unsigned long long StringTimeToInt(char *pDateTime)
{
	if(0==pDateTime||0==*pDateTime)
		return 0;
	unsigned long Time=time(0);
	tm *ptm=localtime((const long *)&Time);
	tm TM;
//	memset(&TM,0,sizeof(tm));
	memcpy(&TM,ptm,sizeof(TM));
	sscanf(pDateTime,"%d.%d.%d %d:%d:%d",&TM.tm_year,&TM.tm_mon,&TM.tm_mday,&TM.tm_hour,&TM.tm_min,&TM.tm_sec);
	TM.tm_year-=1900;
	--TM.tm_mon;
	return mktime(&TM);
}
unsigned long SendSms::GetTime()
{
	unsigned long Time=time(0);
	tm *ptm=localtime((const long *)&Time);
	return mktime(ptm);
}

SendSms::SendSms()
{
	memset(ret,0,sizeof(ret));

	memset(MaxStrategy,0,sizeof(MaxStrategy));
	memset(MaxSTable,0,sizeof(MaxSTable));
	memset(MaxSendRecord,0,sizeof(MaxSendRecord));

	memset(&SendRecord,0,sizeof(SendRecord));
	memset(&STable,0,sizeof(STable));
	memset(&Strategy,0,sizeof(Strategy));

	memset(StrategyState,0,sizeof(StrategyState));
	memset(STableState,0,sizeof(STableState));
	memset(SendRecordState,0,sizeof(SendRecordState));

	memset(SAlarmsTable,0,sizeof(SAlarmsTable));
	memset(TypeState,0,sizeof(TypeState));

	pEndSendRecord=MaxSendRecord;

	Cfg.SetFileName("./Config.ini");
	Cfg.ReadFileConfig();
	MaxTime=Cfg.MaxTime;
	pLogFile=fopen("SMLog.log","wr+");
	Init();
}
SendSms::~SendSms()
{
	if(pLogFile)fclose(pLogFile);
	disconnectDb(0);
}

unsigned long SendSms::OnTime(TimerEvent *Event)
{
	SendMessage((SMS*)Event->lpvoid);
	return 0;
}
int SendSms::SendMessage(SMS *pSMS)
{
	if(!pSMS)
		return -1;
	static unsigned long MaxSN=atoi(GsmRecv[0].ser)+1;
	GSMOntime Sms;
	memset(&Sms,0,sizeof(Sms));
	memcpy(Sms.ACCOUNT,"joyit//zyj",10);
	memcpy(Sms.CALLED,pSMS->Strategy.MSISDN_AlarmList,sizeof(pSMS->Strategy.MSISDN_AlarmList));
	memcpy(Sms.CONTENT,pSMS->STable.Info,sizeof(Sms.CONTENT));
	sprintf(Sms.SRVPARAM,"%04d",(int)MaxSN);
	sprintf(Sms.SENDTIME,"%d",(int)time(0));
	Sms.CALLEDTYPE=1;
	strcpy(Sms.CURSRVDT,"joyit");
	Sms.RESENDCOUNT=2;
	disconnectDb(0);
	connectDb("sa","","JoyitServer");
	int ret=::SendGSMOntime(&Sms,0);
	if(0==ret)
	{
		SMS *pMs=(SMS*)malloc(sizeof(SMS));
		if(pMs)
		{
			memcpy(pMs,pSMS,sizeof(SMS));
			AManage.Add(MaxSN++,pMs,Cfg.MaxTime);
		}
#if TEST
		printf("告警表处理成功 type=%d:%s\n",(int)pSMS->STable.AlarmCode.type,getLastError());
#endif
	}
	else
	{
		fprintf(pLogFile,"%s--SendGSMOntime function Error%s\n",GetCurrTime(),getLastError());
	}
	disconnectDb(0);
	return 0;
}
int SendSms::Init()
{	
	disconnectDb(0);
	connectDb("sa","","JoyitServer");
	GetRecord();
	InitStrategy();
	InitRecvTable();
	InitAlarmsTable();
	return 1;
}
int SendSms::GetRecord()
{
//	unsigned long long DateTime[2];
	while(ReadSMSendRecord()==1)
	{
		memcpy(&MaxSendRecord[SendRecord.InfoType&15],&SendRecord,sizeof(SendRecord));
/*		DateTime[0]=StringTimeToInt(MaxSendRecord[SendRecord.InfoType&15].SendTime);
		DateTime[1]=StringTimeToInt(SendRecord.SendTime);
		if(DateTime[0]<DateTime[1])
		{
			SendRecordState[SendRecord.InfoType&15]=1;
			memcpy(&MaxSendRecord[SendRecord.InfoType&15],&SendRecord,sizeof(SendRecord));
		}
*/
	}
	return 0;
}
char * SendSms::GetCurrTime()
{
	static char Time[30];
	long tm=time(0);
	struct tm *p=localtime(&tm);
	sprintf(Time,"%04d-%02d-%02d %02d:%02d:%02d\0",p->tm_year+1900,p->tm_mon+1,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
	return Time;
}
int SendSms::Run()
{
	do
	{
		Explore();
		sleep(Cfg.MainTime);
		CarryOut();
	}while(GetExit());
	return 0;
}
int SendSms::WriteRealtimeStatus()
{
	RealTimeStatus TimeStatus;
	memset(&TimeStatus,0,sizeof(RealTimeStatus));
	TimeStatus.NEavailability=1;
	memcpy(TimeStatus.UpdateTime,GetCurrTime(),sizeof(TimeStatus.UpdateTime));
	memcpy(TimeStatus.NEname,Cfg.NEname,sizeof(Cfg.NEname));//strlen(Cfg.NeName)+1);
	TimeStatus.NEid=Cfg.NEid;
	memcpy(TimeStatus.NEname,Cfg.NEname,sizeof(TimeStatus.NEname));
	::WriteRealtimeStatus(&TimeStatus);
	CommitWork();
	return 0;
}

int SendSms::DisposeAlarmsTable()
{
	return 0;
}

int SendSms::DisposeRecordTable()
{
	return 0;
}

int SendSms::DisposeStrategyTable()
{
	return 0;
}
int SendSms::DistributeStrategy(SMS *pSMS)
{
	switch(pSMS->Strategy.AlarmMode)
	{
	case 0:
		{
			if(TypeState[pSMS->STable.AlarmCode.type])
			{
#if TEST
								printf("上一封短信还没发送完,丢弃!!TYPE=%d\n",(int)pSMS->STable.AlarmCode.type);
#endif
				return 0;
			}
			memcpy(&SAlarmsTable[pSMS->STable.AlarmCode.type],pSMS,sizeof(SMS));
			SAlarmsTable[pSMS->STable.AlarmCode.type].Count=time(0)+Strategy.DelayTime*60;
			TypeState[pSMS->STable.AlarmCode.type]=1;
#if TEST
				printf("告警表已提交,将会根据策略表表决:type=%d\n",(int)pSMS->STable.AlarmCode.type);
#endif
		}
		break;
	case 1:
		if(!CountDispose(pSMS))
			return 0;
		break;
	default:
		return -2;
	}
	return -1;
}

int SendSms::Construe()
{
	for(int i=0;i<16;i++)
	{
		if(1==STableState[i])
		{
			STableState[i]=0;
			unsigned long long DateTime[2];
			DateTime[0]=StringTimeToInt(MaxSTable[i].DateTime);
			DateTime[1]=StringTimeToInt(MaxSendRecord[i].SendTime);
			if(DateTime[1]<DateTime[0])
			{
				SMS Sms;
				memcpy(&Sms.STable,&MaxSTable[i],sizeof(AlarmsTable));
				memcpy(&Sms.Strategy,&MaxStrategy[i],sizeof(SendStrategy));
				if(GetTime()-StringTimeToInt(Sms.STable.DateTime)<MaxTime||GetTime()<StringTimeToInt(Sms.STable.DateTime))
				{
					DistributeStrategy(&Sms);
				}
			}
		}
	}
	return DisposeAlarmsTable();
}
int SendSms::ReadAlarmsTable()
{
	if(1==ret[0])
		ret[0]=readAlarmsTable(&STable,0,0);
	else
		ret[0]=readAlarmsTable(&STable,1,0);
	if(ret[0]==Cfg.ErrConnect)
	{
		Init();
	}
	return ret[0];
}
int SendSms::ReadSMSendStrategy()
{	
	if(1==ret[1])
		ret[1]=::ReadSMSendStrategy(&Strategy,0,0);
	else
		ret[1]=::ReadSMSendStrategy(&Strategy,1,0);
	return ret[1];
}
int SendSms::ReadSMSendRecord()
{
	if(1==ret[2])
		ret[2]=::ReadSMSendRecord(&SendRecord,0,0);
	else
		ret[2]=::ReadSMSendRecord(&SendRecord,1,0);
	return ret[2];
}
int SendSms::ReadGSMRecvTable()
{
	if(1==ret[3])
		ret[3]=::ReadGSMRecvTable(GsmRecv,0,0);
	else
		ret[3]=::ReadGSMRecvTable(GsmRecv,1,0);
	return ret[3];

}

GSMOntime* SendSms::ReadGSMOntime()
{
	static GSMOntime pOntime;
	if(1==ret[4])
		ret[4]=::ReadGSMOntime(&pOntime, 0,0);
	else
		ret[4]=::ReadGSMOntime(&pOntime,1,0);
	return ret[4]==1?&pOntime:0;
}
void SendSms::Explore()
{
	unsigned long long DateTime[2];
	while(ReadAlarmsTable()==1)
	{
		DateTime[0]=StringTimeToInt(MaxSTable[STable.AlarmCode.type].DateTime);
		DateTime[1]=StringTimeToInt(STable.DateTime);
		if(DateTime[0]<DateTime[1])
		{
			memcpy(&MaxSTable[STable.AlarmCode.type],&STable,sizeof(MaxSTable[STable.AlarmCode.type]));
			Dispatch(&STable);
		}
	}
	vector<GSMRECV> GSMRecv;
	while(ReadGSMRecvTable()==1)
	{
		int SN[2];
		SN[0]=atoi(GsmRecv[0].ser);
		SN[1]=atoi(GsmRecv[1].ser);
		if(SN[0]>SN[1])
		{
			memcpy(&GsmRecv[1],GsmRecv,sizeof(GsmRecv[0]));
			GSMRecv.push_back(GsmRecv[0]);
		}
	}
	CommitWork();
	vector<GSMRECV>::iterator lp;
    for(lp = GSMRecv.begin(); lp != GSMRecv.end();lp++)
    {
    	if(1==lp->mtype)
    	{
    		WriteSendRecord(atoi(lp->ser));
    	}
		else
		{
			fprintf(pLogFile,"%s --SMS Send error",GetCurrTime());
#if TEST
			printf("短信发送失败,并不写入结果表\n");
#endif
			void *lpTemp=(AManage-atoi(lp->ser));
			if(lpTemp)free(lpTemp);
		}
    }
}
int SendSms::Dispatch(AlarmsTable *pTable)
{
	unsigned long DateTime[2];
	DateTime[0]=StringTimeToInt(pTable->DateTime);
	DateTime[1]=StringTimeToInt(MaxSendRecord[pTable->AlarmCode.type].SendTime);
	if(DateTime[0]>DateTime[1])
	{
		memcpy(&SAlarmsTable[pTable->AlarmCode.type].ATable,pTable,sizeof(*pTable));
		Apportion(&SAlarmsTable[pTable->AlarmCode.type]);
	}
	return 0;
}
int SendSms::Apportion(_SAlarmsTable *pSAlarmsTable)
{
	switch(MaxStrategy[pSAlarmsTable->ATable.AlarmCode.type].AlarmMode)
	{
	case 0:
		{
			if(pSAlarmsTable->Count)
			{
#if TEST
				printf("丢失:一个没完成的操作TYPE=%d\n",(int)pSAlarmsTable->ATable.AlarmCode.type);
#endif
				return -1;
			}
			
			if(MaxStrategy[pSAlarmsTable->ATable.AlarmCode.type].MSISDN_AlarmList[0]==0)
				return -2;
			pSAlarmsTable->Count=time(0)+MaxStrategy[pSAlarmsTable->ATable.AlarmCode.type].DelayTime*60;
		}
		break; 
	case 1:
		{
			pSAlarmsTable->Count++;
		}
	}
	return 0;
}
void SendSms::CarryOut()
{
	for(int i=0;i<16;i++)
	{
		if(SAlarmsTable[i].Count)
		{

⌨️ 快捷键说明

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