?? sendsms.cpp
字號:
#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 + -