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

📄 hgsmsenddlg.cpp

📁 中国联通短信网络协议SGIP,可直接与联通短信网关相连
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
	     memset(sm,0,sizeof(sm));
		 length1/=2;
    	 memcpy(sm,graphic,length1);
		 //s.TP_udhi=64;
	}
	if(data_coding==8||data_coding==24||m_unicode)//unicode
	{
      length=AnsiToUnicode(sm,short_msg,1);
      s.sm_length=length*2;
	  memcpy(s.short_message,short_msg,2*length);
	}
	else//plain
	{
		s.sm_length=length1;
		memcpy(s.short_message,sm,length1);	
	}
	sprintf(buffer,"SEND:短信息测试:%s %s",ID,sm);
	buffer[100]='\0';
	xprintf(buffer,"OK");
	SaveSubmitSm(s);
}

void CHgsmsendDlg::ChangeReport(REPORT *rep,char *buffer)
{
	stocpy(&rep->sequence.code,buffer);
	stocpy(&rep->sequence.time,buffer+4);
	stocpy(&rep->sequence.sequence,buffer+8);
	rep->ReportType=buffer[12];
	memcpy(rep->UserNumber,buffer+13,21);rep->UserNumber[21]=0;
	rep->State=buffer[34];
	rep->ErrorCode=buffer[35];
	memcpy(rep->Reserve,buffer+36,8);rep->Reserve[8]=0;
}

void CHgsmsendDlg::ServerRead(char *buf, int length)
{
	HEADER h;
	REPORT report={0};
	char buffer[1024];
	char szTemp[1024];
	stocpy(&h.command_length,buf);
	stocpy(&h.command_id,buf+4);
	stocpy(&h.sequence.code,buf+8);
	stocpy(&h.sequence.time,buf+12);
	stocpy(&h.sequence.sequence,buf+16);
	switch (h.command_id) {
		case SGIP_BIND:
                sprintf(buffer,"SERVERREAD: BIND FROM %s",SERVER_ADR);
				xprintf(buffer,"OK");
                Bind_Resp(h.sequence);
			break;
		case SGIP_UNBIND:
			    sprintf(buffer,"SERVERREAD: UNBIND FROM %s",SERVER_ADR);
				xprintf(buffer,"连接中断");
				Unbind_Resp(h.sequence);
        		TcpSock.Clean();
            	break;
		case SGIP_UNBIND_RESP:
			    m_connect=1;
				sprintf(buffer,"SERVERREAD: UNBIND_RESP FROM %s",SERVER_ADR);
				xprintf(buffer,"OK");
				if(WantReset) {
					TcpReset();
					WantReset=0;
				}
			break;
        case SGIP_DELIVER:
			memset(szTemp,0,sizeof(szTemp));
			memcpy(szTemp,buf,length);
            Deliver_Resp(h.sequence);
			sprintf(buffer,"SERVERREAD: DELIVER FROM %s",SERVER_ADR);
			xprintf(buffer,"OK");
			SaveMoMessage(szTemp);
			DeliverProcess(szTemp);
			break;
        case SGIP_REPORT:
			sprintf(buffer,"SERVERREAD: REPORT FROM %s",SERVER_ADR);
			xprintf(buffer,"OK");
			ChangeReport(&report,buf+20);
			SaveReport(report);
			Report_Resp(h.sequence);
			break;
		case SGIP_USERRPT:
			sprintf(buffer,"SERVERREAD: USERRPT FROM %s",SERVER_ADR);
			xprintf(buffer,"OK");
			UserRpt_Resp(h.sequence);
			break;
		default :
			memset(buffer,0,sizeof(buffer));
			sprintf(buffer,"command id= %8x",h.command_id);
			xprintf(buffer,"OK");
		    break;
	}
}

void CHgsmsendDlg::DeliverProcess(char *buffer)
{
	char SPNumber[100];
	char UserNumber[100];
	char MessageCoding;
	char temp[100];
	int ContentLength;
	unsigned long MessageLength;
	char MessageContent[400];
    
	memset(temp,0,sizeof(temp));
	memset(UserNumber,0,sizeof(UserNumber));
	memcpy(UserNumber,buffer+20,21);
	memset(SPNumber,0,sizeof(SPNumber));
	memcpy(SPNumber,buffer+41,21);
	MessageCoding=buffer[64];
	stocpy(&MessageLength,buffer+65);
	memset(MessageContent,0,sizeof(MessageContent));
	if (MessageCoding==0x00) {
		ContentLength=MessageLength;
		memcpy(MessageContent,buffer+69,MessageLength);
	}
	else if (MessageCoding==0x08) {
		ContentLength=UnicodeToAnsi(buffer+69,MessageContent);
	}
	if (stricmp(SPNumber,SPNUMBER)==0) {
			if ((strcmp(MessageContent,"00000")==0)||(strcmp(MessageContent,"0000")==0)) {
				strcpy(temp,"HYD");
				strcpy(MessageContent,"0000");
		    	ToInfoServer(UserNumber,temp);
			}
	    	ToInfoServer(UserNumber,MessageContent);
	}else {
		sprintf(temp,"SPNUM=%s Message=%s",SPNumber,MessageContent);
		xprintf(temp,"ERROR!");
	}
}

void CHgsmsendDlg::To7199Server(char * UserNumber, char * Message)
{
	char szBuffer[1024];
	char buffer[1024];
	
	sprintf(szBuffer,"%c%c%s%s%c",STX,FOOTBALL,UserNumber+2,Message,ETX);
	AddParityChar((BYTE *)szBuffer);
	UdpSockUser.SocketSend(szBuffer,strlen(szBuffer),UDP_PORT_USER,SERVER_7199);
	sprintf(buffer,"SENDTO7199 :%s to %s",szBuffer,SERVER_7199);
	xprintf(buffer,"WAIT");
}

void CHgsmsendDlg::UdpPortUserRead(char *buf, int length, CString ip)
{
	char buffer[8192],temp[300];
	char szBuffer[1024];
	char FeeValue[100];
	char UserNum[100];
	char Message[1024];
	int  UserCount,ptr=0,len;
	UserAllStr uas;
	int MessageLen=0;
	BYTE FeeType=0;
	DEF_SENDPOCKET m_sendpocket;

	memset(buffer,0,sizeof(buffer));
	sprintf(buffer,"READ:message=%s length=%d from %s",buf,length,ip);
	buffer[100]=0;
	if (buf[1]==ACK) {
		if (ip!=SERVER_7199) return;
		xprintf("READ ACK FROM 7199SERVER","ACK");
	}
	else if (buf[1]==NAK) {
		if (ip!=SERVER_7199) return;
		xprintf("READ NAK FROM 7199SERVER","NAK");
	}
	else if (buf[1]==IDCALL) {
		memset(FeeValue,0,sizeof(FeeValue));
		memset(UserNum,0,sizeof(UserNum));
		memset(Message,0,sizeof(Message));
		memset(szBuffer,0,sizeof(szBuffer));
		FeeType=buf[2]-'0';
        memcpy(FeeValue,buf+3,6);
		memcpy(UserNum,buf+10,11);
        memcpy(szBuffer,buf+21,3);
		MessageLen=atoi(szBuffer);
		if(MessageLen>=1024||MessageLen<0) {
			return;
		}
        memcpy(Message,buf+24,MessageLen);
		memset(szBuffer,0,sizeof(szBuffer));
		sprintf(szBuffer,"86%s",UserNum);
		Submit_Sm(szBuffer,Message,FeeValue,FeeType);
		sprintf(szBuffer,"%c%c%c",STX,ACK,ETX);
		AddParityChar((BYTE *)szBuffer);
		UdpSockUser.SocketSend(szBuffer,strlen(szBuffer),UDP_PORT_USER,SERVER_7199);
		xprintf(buffer,"ACK");
		xprintf("SENDTO7199 ACK","ACK");
	} else if (buf[1]==GROUPCALL) {
		memset(FeeValue,0,sizeof(FeeValue));
		memset(&uas,0,sizeof(uas));
		memset(Message,0,sizeof(Message));
		memset(szBuffer,0,sizeof(szBuffer));
		FeeType=buf[2]-'0';
        memcpy(FeeValue,buf+3,6);
        memcpy(szBuffer,buf+9,3);
		UserCount=atoi(szBuffer);
		ptr=12;
		if(UserCount>=100) {
			UserCount=100;
		}
		for(int i=0;i<UserCount;i++) {
			ptr+=1;
			memset(szBuffer,0,sizeof(szBuffer));
			memcpy(szBuffer,buf+ptr,11);
			sprintf(uas.item[i].UserNumber,"86%s",szBuffer);
			ptr+=11;
		}
		memset(szBuffer,0,sizeof(szBuffer));
        memcpy(szBuffer,buf+ptr,3);
        ptr+=3;
		MessageLen=atoi(szBuffer);
		if(MessageLen>=1024||MessageLen<0) {
			return;
		}
        memcpy(Message,buf+ptr,MessageLen);
		Submit_Sm_All(uas,Message,FeeValue,UserCount,FeeType);
		sprintf(szBuffer,"%c%c%c",STX,ACK,ETX);
		AddParityChar((BYTE *)szBuffer);
		UdpSockUser.SocketSend(szBuffer,strlen(szBuffer),UDP_PORT_USER,SERVER_7199);
		xprintf(buffer,"ACK");
		xprintf("SENDTO7199SERVER ACK","ACK");
	}else if(buf[1]==ORDERCONT) {
	    memcpy(temp,buf+2,3);temp[3]=0;
		len=atoi(temp);
		memcpy((char *)&m_sendpocket,buf+5,len);
		sprintf(buffer,"READ:结构From UDP:%s",ip);
		xprintf(buffer,"OK");
		SendACK(ip);
		Submit_Sm_Cont(m_sendpocket);
		if (m_sendpocket.feetype==3) {
			m_sendpocket.feetype=9;
			Submit_Sm_Cont(m_sendpocket);
		}
	}else {
		xprintf("Unkonw message!","ERROR");
		return;
	}
}

void CHgsmsendDlg::ServerUnBind()
{
	long i;
	HEADER h;
	char buffer[1024];
    char temptime[100];
	memset(temptime,0,sizeof(temptime));
	memset(&h,0,sizeof(HEADER));
	h.command_length=20L;
	h.command_id=SGIP_UNBIND;
    h.sequence.code=SOURCODE;///源结点码。
	MakeTime(temptime);
	h.sequence.time=atol(temptime);
	h.sequence.sequence=sequence_number++;
	sequence_number%=0x10000000;
	i=0L;
	memset(sendstring,0,sizeof(sendstring));
    ltocpy(sendstring+i,h.command_length);
	i+=4L;
	ltocpy(sendstring+i,h.command_id);
	i+=4L;
	ltocpy(sendstring+i,h.sequence.code);
	i+=4L;
    ltocpy(sendstring+i,h.sequence.time);
	i+=4L;
	ltocpy(sendstring+i,h.sequence.sequence);
	i+=4L;
	sprintf(buffer,"SERVERSEND: UNBIND TO %s",SERVER_ADR);
	xprintf(buffer,"OK");
	m_connect=0;
   // TcpClient.SocketSend(sendstring,h.command_length,TCP_PORT,SERVER_ADR);
	Rsock.Send(sendstring,h.command_length);
}

void CHgsmsendDlg::Submit_Sm_All(UserAllStr UserAll, char *Message, char *FeeValue,int UserCount,BYTE FeeType)
{
	SUBMIT s;
	int length,Fee=0;
	char short_msg[8192],buffer[1024];
    char temptime[100];
	memset(temptime,0,sizeof(temptime));
	memset(&s,0,sizeof(SUBMIT));
	memset(buffer,0,sizeof(buffer));
	s.h.command_id=SGIP_SUBMIT;
    s.h.sequence.code=SOURCODE;///源结点码。
	MakeTime(temptime);
	s.h.sequence.time=atol(temptime);
	s.h.sequence.sequence=sequence_number++;
	sequence_number%=0x10000000;
    memset(short_msg,0,sizeof(short_msg));
    memset(s.ChargeNumber,0,sizeof(s.ChargeNumber));
	for (int i=0;i<UserCount;i++)
		strcpy(s.UserNumber[i],UserAll.item[i].UserNumber);
	s.UserCount=UserCount;
	s.MessageCoding=8;//unicode
	s.FeeType=FeeType;
	memcpy(s.CorpId,CORPID,5);
	strcpy(s.SPNumber,SPNUMBER);
	//memcpy(s.ServiceType,业务代码,strlen(业务代码));
	Fee=atoi(FeeValue);
	if(Fee>=100000||Fee<0) {
		return;
		xprintf("Fee Error!!!","Error");
	}
    sprintf(s.FeeValue,"%d",Fee);
    //sprintf(s.GivenValue,"%d",取值范围0-99999,赠送用户的话费,单位为分,由SP定义);
    s.AgentFlag=1;
	if(strnicmp(Message,"您已成功定制世界杯足球信息",strlen("您已成功定制世界杯足球信息"))==0) {
      s.MorelatetoMTFlag=0;

	}
	else
	{
	 s.MorelatetoMTFlag=2;

	}
    // s.Priority=0;优先级0-9从低到高,默认为0
    //sprintf((s.ExpireTime,"%02d%02d%02d%02d%02d%02d032+",短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值。时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中“tnnp”取固定值“032+”,即默认系统为北京时间);
    //sprintf(s.ScheduleTime,"02d%02d%02d%02d%02d%02d032+",短消息定时发送的时间,如果为空,表示立刻发送该短消息。时间内容为16个字符,格式为“yymmddhhmmsstnnp” ,其中“tnnp”取固定值“032+”,即默认系统为北京时间);
    s.ReportFlag=2;
    //s.TP_pid=GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9;
    //s.TP_udhi=GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9;
    //s.MessageType=0;信息类型:0-短消息信息
    //memcpy(s.Reserve,保留,扩展用);
    length=AnsiToUnicode(Message,short_msg,1);
	s.sm_length=length*2;
	if(s.sm_length>141)
	{
	  xprintf("TO 短信中心信息过长,信息被截短!!!!","ERROR!");
		memcpy(s.short_message,short_msg,140);
		s.sm_length=140;
	}
	else
	{   
	   memcpy(s.short_message,short_msg,s.sm_length);
	}
	SaveSubmitSm(s);
}

void CHgsmsendDlg::OnSysconfig() 
{
	WinExec("notepad.exe sgipini.ini",1);
}

void CHgsmsendDlg::ToInfoServer(char *UserNumber, char *Message)
{
	char szBuffer[1024],addr[100]={0},opt[100]={0},id[100]={0};
	char buffer[1024];
	char length[50];
	int len=0;
	len=strlen(Message);
	len+=strlen(UserNumber)-2;
	memset(length,0,sizeof(length));
	sprintf(length,"%03d",len);
	sprintf(szBuffer,"%c%c%s%s%s%c",STX,AUTOMO,length,UserNumber+2,Message,ETX);
	AddParityChar((BYTE *)szBuffer);
	GetService(id,Message,opt,addr);

	if (strcmp(addr,SERVER_7199)==0) 
		UdpSockUser.SocketSend(szBuffer,strlen(szBuffer),UDP_PORT_USER,addr);	
	else
		UdpSockSend.SocketSend(szBuffer,strlen(szBuffer),UDP_PORT_SEND,addr);	
	sprintf(buffer,"SENDTOINFOSERVER :%s to %s",szBuffer,addr);
	xprintf(buffer,"WAIT");
	MoLog(UserNumber+2,"",Message);
}

void CHgsmsendDlg::SaveMoMessage(char * buffer)
{
	CTime time;
	FILE *hFile;
	char temp[512]={0},buf[512]={0},UserNumber[100]={0};

	time=time.GetCurrentTime();
	memcpy(UserNumber,buffer+20,21);
	sprintf(temp,"e:/Original/%02d%02d.txt",time.GetMonth(),time.GetDay());
	hFile=_fsopen(temp,"a",SH_DENYWR);
	strcpy(temp,buffer+65);
	if(hFile==NULL)
		return;
	sprintf(buf,"%02d:%02d:%02d %s %s",time.GetHour(),time.GetMinute(),time.GetSecond(),UserNumber,temp);
	fprintf(hFile,"%s\n",buf);
	fclose(hFile);
}


void CHgsmsendDlg::OnOk() 
{
	// TODO: Add your command handler code here
	CDialog::OnOK();	
}
void CHgsmsendDlg::OnOK()
{
	return;
}
void CHgsmsendDlg::OnCancel()
{
	return;
}

//===========<B add by 肖桂云 2003/08/28 监控>================//
void CHgsmsendDlg::SendActive()
{
	char szBuffer[1024],temp[200]="SGIP7199",ss[500];
	static char WatchAddr[50]="128.1.0.51";
	static char WatchMode='3';
	int len;

	static			aOldTime=time(NULL);
	time_t			aCurTime;

	time(&aCurTime);
	if (aCurTime > (aOldTime + 10)) 
	{
		aOldTime = aCurTime;

		sprintf(ss,"%03d%s%03d%s",strlen(temp),temp,strlen(watchstr),watchstr);
		len = strlen(ss);

		sprintf(szBuffer,"%c%c%03d%s%c",STX,0x99,len,ss,ETX);
		AddParityChar((BYTE *)szBuffer);
		UdpSockUser.SocketSend(szBuffer,strlen(szBuffer),3000,WatchAddr);	
	}
}
//===========<E add by 肖桂云 2003/08/28 监控>================//

⌨️ 快捷键说明

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