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

📄 preprocmsg.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		break;

	case 0x0B:           //加速数据ED
		buffer+=5;       //跳过必备固定项和数据长度指示字,指向数据的第一字节
		ProcBSSAPmsg(buffer);
		break;

	case 0x11:    //增强单位数据 XUDT
		{
		   buffer+=2;                     //跳过固定长度必备项,指向被叫用户地址的指针
		   len=*buffer;                   //被叫用户地址指针的值
		   buffer=buffer+len;             //指向被叫用户地址长度表示语
		   vlen=*buffer;                  //被叫用户地址长度
		   buffer++;                      //指向被叫地址的指针
		   DSSN=SccpSSN(buffer,pclen);    //提取被叫用户的SSN号		 
		   buffer=buffer+vlen;            //指向主叫用户地址长度的指针		   		  
		   vlen=*buffer;                  //主叫地址的长度
		   buffer++;                      //指向主叫地址表示语的指针
		   OSSN=SccpSSN(buffer,pclen);    //提取主叫用户的SSN号			 
		   buffer=buffer+vlen;            //指向数据长度表示语的指针
		   buffer++;                      //指向数据的第一字节
		}
		break;
	case 0x12:    //增强单位数据业务 XUDTS
		{
		   buffer+=2;                     //跳过固定长度必备项,指向被叫用户地址的指针
		   len=*buffer;                   //被叫用户地址指针的值
		   buffer=buffer+len;             //指向被叫用户地址长度表示语
		   vlen=*buffer;                  //被叫用户地址长度
		   buffer++;                      //指向被叫地址的指针
		   DSSN=SccpSSN(buffer,pclen);    //提取被叫用户的SSN号		 
		   buffer=buffer+vlen;            //指向主叫用户地址长度的指针		   		  
		   vlen=*buffer;                  //主叫地址的长度
		   tempbuf=buffer+1;              //指向主叫地址表示语的指针
		   OSSN=SccpSSN(tempbuf,pclen);   //提取主叫用户的SSN号			 
		   buffer=buffer+vlen;            //指向数据长度表示语的指针
		   buffer++;                      //指向数据的第一字节
		}
		break;
	default:
		break;
	}
	if((OSSN>=0x05&&OSSN<=0x0A)||(DSSN>=0x05&&DSSN<=0x0A))  //OSSN或DSSN 其中之一为MAP
	{
		ProcMAPmsg(buffer);       
//		ShowMsg();       //调用ShowMsg()函数显示
	    return;
	}
	else if(OSSN==0x92||DSSN==0x92)       //OSSN或DSSN 其中之一为CAP
	{
		ProcCAPmsg(buffer);
//		ShowMsg();       //调用ShowMsg()函数显示
	    return;
	}
	else if(OSSN==0xFE||DSSN==0xFE)       //OSSN或DSSN 其中之一为BSSAP
	{
		ProcBSSAPmsg(buffer);
//		ShowMsg();       //调用ShowMsg()函数显示
	    return;
	}
	else if(OSSN==0x03||DSSN==0x03)       //OSSN或DSSN 其中之一为ISUP
	{
		ProcISUPmsg(buffer);
//	    ShowMsg();       //调用ShowMsg()函数显示
	    return;
	}
	else
		return;	
}

//****************************************************************

void CShowMsg::ProcMAPmsg(unsigned char *buffer)
{
	//提取MAP消息类型,主叫号码,并存入buffer
  unsigned char tcapmtype;     //tcap消息类型:CR、CC、CREF、RLSD、DT1、DT2、UDT、UDTS、
	                           //               ED、XUDT、XUDTS
  int msgstrlen;               // 显示消息的字符串长度
  unsigned char operatecode=0;
  msgstrlen=strlen(mshowmsg.msgtype);
  tcapmtype=*buffer;
  TCAPmsgtype(tcapmtype,msgstrlen);       //提取TCAP消息类型
  buffer++;
  switch(tcapmtype)
	{
	case 0x62:                            //开始消息类型
		{	
			int Compolentlen=0;
			int CompLen=0;
  	        buffer=buffer+LenByteNum(buffer)+1;       //指向事务处理ID长度指示语                     
			buffer=buffer+GetLength(buffer);          //指向任选项(对话部分)标签
		    if(*buffer==0x6B)                         //包含对话部分
				buffer=buffer+GetLength(buffer+1)+1;  //指向任选项(成分部分)标签		 
		    if(*buffer==0x6C)                         //包含成分部分
			{
				Compolentlen=GetLength(buffer+1)-LenByteNum(buffer+1);    //成分部分总长度
			    buffer=buffer+LenByteNum(buffer+1)+1;                     //指向成分类型标签
			}
			while(Compolentlen>=CompLen)
			{
				CompLen=CompLen+GetLength(buffer+1)+1;
				GetMapCompolent(buffer);
				buffer=buffer+GetLength(buffer+1)+1;
			}
		};
	break;

	case 0x64:                           //结束消息类型
		{
			int Compolentlen=0;
			int CompLen=0;
		    buffer=buffer+LenByteNum(buffer)+1;         //指向目的事务处理ID长度指示语
			buffer=buffer+GetLength(buffer);            //指向任选项(对话部分)标签
		    if(*buffer==0x6B)                           //包含对话部分
				buffer=buffer+GetLength(buffer+1)+1 ;   //指向任选项(成分部分)标签
		    if(*buffer==0x6C)                           //包含成分部分
			{
				Compolentlen=GetLength(buffer+1)-LenByteNum(buffer+1);    //成分部分总长度
			    buffer=buffer+LenByteNum(buffer+1)+1;                     //指向成分类型标签
			}
			while(Compolentlen>=CompLen)
			{
				CompLen=CompLen+GetLength(buffer+1)+1;
				GetMapCompolent(buffer);
				buffer=buffer+GetLength(buffer+1)+1;
			}
		}
	break;

	case 0x65:                            //继续消息类型
		{
			int Compolentlen=0;
			int CompLen=0;
			buffer=buffer+LenByteNum(buffer)+1;           //指向起源事务处理ID长度指示语
			buffer=buffer+GetLength(buffer)+1;            //指向目的地事务处理ID长度指示语
			buffer=buffer+GetLength(buffer);              //指向任选项(对话部分)标签
		    if(*buffer==0x6B)                             //包含对话部分
				buffer=buffer+GetLength(buffer+1)+1 ;     //指向任选项(成分部分)标签
		    if(*buffer==0x6C)                             //包含成分部分
			{
				Compolentlen=GetLength(buffer+1)-LenByteNum(buffer+1);    //成分部分总长度
			    buffer=buffer+LenByteNum(buffer+1)+1;                     //指向成分类型标签
			}
			while(Compolentlen>=CompLen)
			{
				CompLen=CompLen+GetLength(buffer+1)+1;
				GetMapCompolent(buffer);
				buffer=buffer+GetLength(buffer+1)+1;
			}
		}
	break;

	case 0x67:         //终止消息类型
		sprintf(mshowmsg.msgtype+msgstrlen,"  Abort ");     //显示终止消息类型
	default:break;
	}
}

//****************************************************************

void CShowMsg::GetMapCompolent(unsigned char *buffer)
{
	//提取Map成分部分消息
  int msgstrlen;                 // 显示消息的字符串长度
  unsigned char operatecode=0;
  msgstrlen=strlen(mshowmsg.msgtype);
  switch(*buffer)
  { 
  case 0xA1:                             //调用成分
	  {
		  buffer=buffer+LenByteNum(buffer+1)+1;          //指向调用ID标签
		  buffer=buffer+GetLength(buffer+1)+1;           //指向链接ID标签
		  if(*buffer==0x80)                              //包含链接ID
			  buffer=buffer+GetLength(buffer+1)+1;       //指向操作类型标签
		  buffer=buffer+LenByteNum(buffer+1)+1;          //指向操作类型
		  operatecode=MAPmessage(buffer);                //提取操作类型
		  buffer++;
		  INVISDNnum(buffer, operatecode);
	  }
	  break;

  case 0xA2:                        //返回结果
	  {
		  buffer=buffer+LenByteNum(buffer+1)+1;         //指向调用ID标签  
		  buffer=buffer+GetLength(buffer+1)+1;          //指向序列标签
		  if(*buffer==0x30)                             //包含序列标签
		  buffer=buffer+LenByteNum(buffer+1)+1;         //指向任选项(操作码)标签
		  if((*buffer==0x02)||(*buffer==0x06))          //包含操作码
			  buffer=buffer+LenByteNum(buffer+1)+1;     //指向操作类型
		  operatecode=MAPmessage(buffer);               //提取操作类型
		  buffer++;
		  RETISDNnum(buffer, operatecode);
	  }
	  break;

  case 0xA3:                     //返回差错
	  sprintf(mshowmsg.msgtype+msgstrlen,"  ReturnError ");   //显示返回差错
	  break;

  case 0xA4:                     //拒绝
	  sprintf(mshowmsg.msgtype+msgstrlen,"  Refuse ");   //显示拒绝
	  break;
  default:
	  break;
			 }             
}
  
//****************************************************************

void CShowMsg::ProcCAPmsg(unsigned char *buffer)
{
	//提取CAP消息类型,主叫号码,并存入buffer
  unsigned char tcapmtype;   //tcap消息类型:CR、CC、CREF、RLSD、DT1、DT2、UDT、UDTS、
	                           //               ED、XUDT、XUDTS
  int msgstrlen;                 // 显示消息的字符串长度
  msgstrlen=strlen(mshowmsg.msgtype);
  tcapmtype=*buffer;
  TCAPmsgtype(tcapmtype,msgstrlen);     //提取TCAP消息类型
  buffer++;   
  switch(tcapmtype)
	{
	case 0x62:                          //开始消息类型
		{
			int Compolentlen=0;
			int CompLen=0;
		    buffer=buffer+LenByteNum(buffer)+1;        //指向事务处理ID长度指示语
			buffer=buffer+GetLength(buffer);           //指向任选项(对话部分)标签
		    if(*buffer==0x6B)                          //包含对话部分
				buffer=buffer+GetLength(buffer+1)+1 ;  //指向任选项(成分部分)标签
		    if(*buffer==0x6C)                          //包含成分部分
			{
				Compolentlen=GetLength(buffer+1)-LenByteNum(buffer+1);    //成分部分总长度
			    buffer=buffer+LenByteNum(buffer+1)+1;                     //指向成分类型标签
			}
			while(Compolentlen>=CompLen)
			{
				CompLen=CompLen+GetLength(buffer+1)+1;
				GetCapCompolent(buffer);
				buffer=buffer+GetLength(buffer+1)+1;
			}
		}
    	break;

	case 0x64:                            //结束消息类型
		{
			int Compolentlen=0;
			int CompLen=0;
		    buffer=buffer+LenByteNum(buffer)+1;                 //指向事务处理ID长度指示语
			buffer=buffer+GetLength(buffer);                    //指向任选项(对话部分)标签
		    if(*buffer==0x6B)                                   //包含对话部分
				buffer=buffer+GetLength(buffer+1)+1 ;           //指向任选项(成分部分)标签
		    if(*buffer==0x6C)                                    //包含成分部分
			{
				Compolentlen=GetLength(buffer+1)-LenByteNum(buffer+1);    //成分部分总长度
			    buffer=buffer+LenByteNum(buffer+1)+1;                     //指向成分类型标签
			}
			while(Compolentlen>=CompLen)
			{
				CompLen=CompLen+GetLength(buffer+1)+1;
				GetCapCompolent(buffer);
				buffer=buffer+GetLength(buffer+1)+1;
			}
		}
	    break;

	case 0x65:                            //继续消息类型
		{
			int Compolentlen=0;
			int CompLen=0;
		    buffer=buffer+LenByteNum(buffer)+1;       //指向起源事务处理ID长度指示语
			buffer=buffer+GetLength(buffer)+1;        //指向目的地事务处理ID长度指示语
			buffer=buffer+GetLength(buffer);          //指向任选项(对话部分)标签
		    if(*buffer==0x6B)                         //包含对话部分
				buffer=buffer+GetLength(buffer+1)+1 ;     //指向任选项(成分部分)标签
		    if(*buffer==0x6C)                         //包含成分部分
			{
				Compolentlen=GetLength(buffer+1)-LenByteNum(buffer+1);    //成分部分总长度
			    buffer=buffer+LenByteNum(buffer+1)+1;                     //指向成分类型标签
			}
			while(Compolentlen>=CompLen)
			{
				CompLen=CompLen+GetLength(buffer+1)+1;
				GetCapCompolent(buffer);
				buffer=buffer+GetLength(buffer+1)+1;
			}
			
		}
		break;
	case 0x67:         //终止消息类型
		sprintf(mshowmsg.msgtype+msgstrlen,"  Abort ");     //显示终止消息类型
	break;
	default:break;
  }
} 
//******************************************************************

void CShowMsg::GetCapCompolent(unsigned char *buffer)
{
	//提取Cap成分部分消息
  int msgstrlen;                 // 显示消息的字符串长度
  unsigned char operatecode=0;
  msgstrlen=strlen(mshowmsg.msgtype);
  switch(*buffer)
  {
  case 0xA1:                             //调用成分
	  {
		  buffer=buffer+LenByteNum(buffer+1)+1;         //指向调用ID标签
		  buffer=buffer+GetLength(buffer+1)+1;          //指向链接ID标签
		  if(*buffer==0x80)                             //包含链接ID 
			  buffer=buffer+GetLength(buffer+1)+1;      //指向操作类型标签
		  buffer=buffer+LenByteNum(buffer+1)+1;         //指向操作类型
		  operatecode=CAPmessage(buffer);               //提取操作类型
		  buffer++;
		  CALLINGnum(buffer, operatecode);              //提取主叫号码
	  }
	  break;

  case 0xA2:                        //返回结果
	  {
		  buffer=buffer+LenByteNum(buffer+1)+1;         //指向调用ID标签  
		  buffer=buffer+GetLength(buffer+1)+1;          //指向序列标签
		  if(*buffer==0x30)                             //包含序列标签
			  buffer=buffer+LenByteNum(buffer+1)+1;     //指向任选项(操作码)标签
		  if((*buffer==0x02)||(*buffer==0x06))          //包含操作码
			  buffer=buffer+LenByteNum(buffer+1)+1;     //指向操作类型
		  operatecode=CAPmessage(buffer);               //提取操作类型
		  buffer++;
		  CALLINGnum(buffer, operatecode);              //提取主叫号码
	  }
	  break;

  case 0xA3:                     //返回差错
	  sprintf(mshowmsg.msgtype+msgstrlen,"  ReturnError ");   //显示返回差错
	  break;

  case 0xA4:                     //拒绝
	  sprintf(mshowmsg.msgtype+msgstrlen,"  Refuse ");   //显示拒绝
	  break;
  default:
	  break;
  }
}
   
//****************************************************************

void CShowMsg::ProcBSSAPmsg(unsigned char *buffer)
{
	//提取BSSAP消息类型,主叫号码,并存入buffer 
  unsigned char operatecode=0;  
  if(*buffer==0x00)                      //BSSMAP消息
  {
	int msgstrlen;                       // 显示消息的字符串长度
	msgstrlen=strlen(mshowmsg.msgtype);
	sprintf(mshowmsg.msgtype+msgstrlen," BSSMAP:"); 
	buffer+=2;                           //指向BSSMAP消息类型
    operatecode=BSSMAPmsgtype(buffer);   //提取BSSMAP消息类型
    buffer++;
	BSSMAPnumtaking(buffer,operatecode); //提取BSSMAP主叫号码
  }
  else if(*buffer==0x01)                 //DTAP消息
  {
	int msgstrlen;                       // 显示消息的字符串长度
	msgstrlen=strlen(mshowmsg.msgtype);
	sprintf(mshowmsg.msgtype+msgstrlen," DTAP:"); 
    buffer+=3;              //指向第三层消息第一字节

⌨️ 快捷键说明

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