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

📄 hgsmsenddlg.cpp

📁 中国联通短信网络协议SGIP,可直接与联通短信网关相连
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			}
	        else
			{
		      esm_class=0;
			}
			memset(buffer,0,sizeof(buffer));
			memcpy(buffer,buf+35,3);
			nLength=atoi(buffer);
			if (nLength>140||nLength<1)
			{
				sprintf(buffer,"READ FROM %s MESSAGE LENGTH ERROR!",ip);
				xprintf(buffer,"OK");
				SendNak(PARITYERROR,ip);
				sprintf(buffer,"SEND NAK TO %s",ip);
				xprintf(buffer,"OK");
				return ;
			}
			memset(buffer,0,sizeof(buffer));
			memcpy(buffer,buf+38,nLength);
			buffer[nLength]=0;
			memset(tempring,0,sizeof(tempring));
			sprintf(tempring,"READ:7198From UDP:%s",ip);
			xprintf(tempring,"OK");
			SendACK(ip);
			Submit_Sm_7198(id,nLength,buffer,(BYTE)buf[1],data_coding,esm_class,FeeValue,FeeType,ChargeID);
			break;
		   }else
		   if(buf[1]==ORDERCONT)
		   {
			    memcpy(temp,buf+2,3);temp[3]=0;
				len=atoi(temp);
				if (len<=sizeof(DEF_SENDPOCKET)) 
					memcpy((char *)&m_sendpocket,buf+5,len);
				else
					memcpy((char *)&m_sendpocket,buf+5,sizeof(DEF_SENDPOCKET));
				sprintf(tempring,"READ:结构From UDP:%s",ip);
				xprintf(tempring,"OK");
				SendACK(ip);
				Submit_Sm_Cont(m_sendpocket);
				if (m_sendpocket.feetype==3) {
					m_sendpocket.feetype=9;
					Submit_Sm_Cont(m_sendpocket);
				}
				break;
		   }
		   else
		   {
		    	i=1;
		    	memset(buffer,0,sizeof(buffer));
		    	memcpy(buffer,buf+i,2);
		    	i+=2;
			    nLength=atoi(buffer);
			    mlong=nLength;
			    if (nLength>20)
				{
				  sprintf(buffer,"READ FROM %s PHONE LENGTH ERROR!",ip);
				  xprintf(buffer,"OK");
				  UdpSockSend.SocketSend("NAK",3,UDP_PORT_SEND,ip);
				  sprintf(buffer,"SEND: NAK TO %s",ip);
				  xprintf(buffer,"OK");
				  return;
				}
			   memcpy(temp,buf+i,nLength);
			   sprintf(id,"86%s",temp);
			   i+=nLength;
			   memset(buffer,0,sizeof(buffer));
			   memcpy(buffer,buf+i,3);
			   i+=3;
			   nLength=atoi(buffer);
			 if (nLength>999||nLength<1)
             //if (nLength>80||nLength<1)
			 {
				sprintf(buffer,"READ FROM %s MESSAGE LENGTH ERROR!",ip);
				xprintf(buffer,"OK");
				UdpSockSend.SocketSend("NAK",3,UDP_PORT_SEND,ip);
				sprintf(buffer,"SEND: NAK TO %s",ip);
				xprintf(buffer,"OK");
				return ;
			 }
			 memset(buffer,0,sizeof(buffer));
			 memcpy(buffer,buf+i,nLength);
			 i+=nLength;
			if (i!=length)
			{
				sprintf(buffer,"READ FROM %s PACKET ERROR!",ip);
				xprintf(buffer,"OK");
				UdpSockSend.SocketSend("NAK",3,UDP_PORT_SEND,ip);
				sprintf(buffer,"SEND: NAK TO %s",ip);
				xprintf(buffer,"OK");
				return;
			}
			sprintf(buffer,"READ SUBMIT_SM FROM %s (%s) \n %s",ip,id,buf+6+mlong);
			xprintf(buffer,"OK"); 
			UdpSockSend.SocketSend("ACK",3,UDP_PORT_SEND,ip);
			sprintf(buffer,"SEND: ACK TO %s",ip);
		    xprintf(buffer,"OK");	
	 	    Submit_Sm(id,buf+6+mlong,"000010",2 );
			break;
		 }
		case 'A':
			sprintf(buffer,"READ DELIVER_SM_RESP FROM %s ",ip);
			xprintf(buffer,"OK");
			break;
	}
}

void CHgsmsendDlg::Submit_Sm(char *ID, char *sm,char *FeeValue,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));
	memcpy(s.ChargeNumber,ID,strlen(ID));
	memcpy(s.UserNumber,ID,strlen(ID));
	s.UserCount=1;
	s.MessageCoding=8;//unicode
	s.FeeType=FeeType;
	memcpy(s.CorpId,CORPID,5);
	sprintf(s.SPNumber,"%s",SPNUMBER);
	//memcpy(s.ServiceType,业务代码,strlen(业务代码));
	if ((FeeType==0)&&(Fee==20)) strcpy(s.ServiceType,"TH");
	 Fee=atoi(FeeValue);
	 if(Fee>=100000||Fee<0)
     {
		 return;
	 }
    sprintf(s.FeeValue,"%d",Fee);
    //sprintf(s.GivenValue,"%d",取值范围0-99999,赠送用户的话费,单位为分,由SP定义);
    s.AgentFlag=1;
    if(strnicmp(sm,"您已成功定制世界杯足球信息",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(sm,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::CheckSubmitSmBuffer()
{
    
	if(m_save.i<=0)	return;
	if(LineTest==3)	{
		//LineTest=0;
		TcpReset();
		LineTest++;
		return;
	}
    m_save.times[0]++;
	if(m_save.times[0]>6) {
    	RemoveSubmitSM(m_save.submit[0].h.sequence.sequence);
		return;
	}else{
		LineTest++;
		send_submit_sm(m_save.submit[0]);
	}
}

void CHgsmsendDlg::RemoveSubmitSM(unsigned int number)
{
	int i,j;

	for (i=0;i<m_save.i;i++)
	{
		if (m_save.submit[i].h.sequence.sequence==number)
		{
			for (j=i;j<(m_save.i-1);j++)
			{
				memcpy(&m_save.submit[j],&m_save.submit[j+1],sizeof(SUBMIT));
				m_save.times[j]=m_save.times[j+1];
			}
			m_save.i--;
			if (m_save.i<0) m_save.i=0;
			memset(&m_save.submit[m_save.i],0,sizeof(SUBMIT));
			m_save.times[m_save.i]=0;
			break;
		}
	}
}

void CHgsmsendDlg::SaveSubmitSm(SUBMIT s)
{

	if(m_save.i>=BUFFER_SIZE)
	{
		xprintf("BUFFER IS FULL!","");
		return;
	}
	m_save.times[m_save.i]=0;
	memcpy(&m_save.submit[m_save.i],&s,sizeof(SUBMIT));
	m_save.i++;
}

void CHgsmsendDlg::TcpRead(char *buf, int length)
{
	HEADER h;
	char buffer[1024];
	char Status[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_RESP:
			   m_connect=1;
			   if(GetStatus(buf[20],Status))
			   {
				sprintf(buffer,"READ: BIND_TRANSMITTER_RESP FROM %s",SERVER_ADR);
				xprintf(buffer,"绑定成功");
			   }
			   else
			   {
				 sprintf(buffer,"READ: BIND_TRANSMITTER_RESP FROM %s",SERVER_ADR);
		         xprintf(buffer,Status);
			   }
			break;
		case SGIP_UNBIND:
			    sprintf(buffer,"READ: UNBIND FROM %s",SERVER_ADR);
				xprintf(buffer,"连接中断");
				Unbind_Resp(h.sequence);
				TcpReset();
            	break;
		case SGIP_UNBIND_RESP:
			    m_connect=1;
				sprintf(buffer,"READ: UNBIND_RESP FROM %s",SERVER_ADR);
				xprintf(buffer,"OK");
				if(WantReset)
				{
					TcpReset();
					WantReset=0;
				}
			break;
    	case SGIP_SUBMIT_RESP:
			        m_connect=1;
			        if(GetStatus(buf[20],Status))
					{
			    	sprintf(buffer,"READ: SUBMIT_SM_RESP FROM %s",SERVER_ADR);
			    	xprintf(buffer,"OK");
					SaveLog(h.sequence);
					LineTest=0;
			    	RemoveSubmitSM(h.sequence.sequence);
					}
					else
					{
					   sprintf(buffer,"READ: SUBMIT_SM_RESP FROM %s",SERVER_ADR);
				       xprintf(buffer,Status);
					}
			break;
        case SGIP_TRACE_RESP:
			sprintf(buffer,"READ: TRACE_RESP FROM %s",SERVER_ADR);
				xprintf(buffer,"OK");
				break;
		default :
			memset(buffer,0,sizeof(buffer));
			sprintf(buffer,"command id= %8x",h.command_id);
			xprintf(buffer,"OK");
		  break;
	}
}

void CHgsmsendDlg::send_submit_sm(SUBMIT s)
{
	long i;
	char buffer[1024];
	char temptime[100];
	memset(temptime,0,sizeof(temptime));
	i=4L;
	memset(sendstring,0,sizeof(sendstring));
	ltocpy(sendstring+i,s.h.command_id);
	i+=4L;
    ltocpy(sendstring+i,s.h.sequence.code);
	i+=4L;
	ltocpy(sendstring+i,s.h.sequence.time);
	i+=4L;
	ltocpy(sendstring+i,s.h.sequence.sequence);
	i+=4L;
	memcpy(sendstring+i,s.SPNumber,21);
	i+=21L;
    memcpy(sendstring+i,s.ChargeNumber,21);
	i+=21L;
    sendstring[i]=s.UserCount;
	i+=1L;
	for(int j=0;j<s.UserCount;j++)
	{
		memcpy(sendstring+i,s.UserNumber[j],21);
		i+=21L;
	}
	memcpy(sendstring+i,s.CorpId,5);
	i+=5L;
	memcpy(sendstring+i,s.ServiceType,10);
	i+=10L;
	sendstring[i]=s.FeeType;
	i+=1L;
	memcpy(sendstring+i,s.FeeValue,6);
	i+=6L;
    memcpy(sendstring+i,s.GivenValue,6);
	i+=6L;
	sendstring[i]=s.AgentFlag;
	i+=1L;
	sendstring[i]=s.MorelatetoMTFlag;
	i+=1L;
	sendstring[i]=s.Priority;
	i+=1L;
	memcpy(sendstring+i,s.ExpireTime,16);
	i+=16L;
	memcpy(sendstring+i,s.ScheduleTime,16);
	i+=16L;
	sendstring[i]=s.ReportFlag;
	i+=1L;
	sendstring[i]=s.TP_pid;
	i+=1L;
	sendstring[i]=s.TP_udhi;
	i+=1L;
	sendstring[i]=s.MessageCoding;
	i+=1L;
	sendstring[i]=s.MessageType;
	i+=1L;
	ltocpy(sendstring+i,s.sm_length);
	i+=4L;
	memcpy(sendstring+i,s.short_message,s.sm_length);
	i+=s.sm_length;
	memcpy(sendstring+i,s.Reserve,8);
	i+=8;
    s.h.command_length=i;
	ltocpy(sendstring,s.h.command_length);
	sprintf(buffer,"SEND: SUBMIT_SM TO %s",SERVER_ADR);
	xprintf(buffer,"OK");
	m_connect=0;
	TcpClient.SocketSend(sendstring,s.h.command_length,TCP_PORT,SERVER_ADR);
}

void CHgsmsendDlg::Bind_Transmitter()
{
	long i;
	BIND b;
	char buffer[1024];
	char temptime[100];
	memset(&b,0,sizeof(BIND));
	memset(temptime,0,sizeof(temptime));
	b.h.command_id=SGIP_BIND;
	b.h.sequence.code=SOURCODE;///源结点码。
	MakeTime(temptime);
	b.h.sequence.time=atol(temptime);
	b.h.sequence.sequence=sequence_number++;
	sequence_number%=0x10000000;
	memcpy(b.login_name,LOG_NAME,strlen(LOG_NAME));
	memcpy(b.login_password,LOG_PASSWORD,strlen(LOG_PASSWORD));
	i=4L;
	memset(sendstring,0,sizeof(sendstring));
	ltocpy(sendstring+i,b.h.command_id);
	i+=4L;
	ltocpy(sendstring+i,b.h.sequence.code);
	i+=4L;
    ltocpy(sendstring+i,b.h.sequence.time);
	i+=4L;
	ltocpy(sendstring+i,b.h.sequence.sequence);
	i+=4L;
	b.login_type=1;
	sendstring[i]=1;//login type
	i+=1;
	memcpy(sendstring+i,b.login_name,16);
	i+=16;
	memcpy(sendstring+i,b.login_password,16);
	i+=16;
	memcpy(sendstring+i,b.reserve,8);
	i+=8;
	b.h.command_length=i;
	ltocpy(sendstring,b.h.command_length);
	sprintf(buffer,"SEND: BIND_TRANSMITTER TO %s  ",SERVER_ADR);
	xprintf(buffer,"OK");
	m_connect=0;
	TcpClient.SocketSend(sendstring,b.h.command_length,TCP_PORT,SERVER_ADR);
}

void CHgsmsendDlg::UnBind()
{
	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;

⌨️ 快捷键说明

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