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

📄 preprocmsg.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			buffer=buffer+1+(*(buffer+1));    // 指向原因表示语的长度表示语
			buffer++;
			GetISUPCause(buffer);
			buffer++;
		}
		break;
	case 0x10:            //释放完成
		{
			buffer=buffer+1+(*(buffer+1));    // 指向原因表示语的长度表示语
			buffer++;
			GetISUPCause(buffer);
			buffer++;
		}
		break;
	case 0x02:           //后续消息
		{
			int acalladdlen=0;                //字符串acalladd的长度	  
			int addrlen=0,even=0;
			acalladdlen=strlen(mshowmsg.acalladd);
		    acalladdlen+=sprintf(mshowmsg.acalladd+acalladdlen, " SubAddr: "); 
			buffer=buffer+1+(*(buffer+1));    // 指向原因表示语的长度表示语
			addrlen=*buffer-1;
			even=*(buffer+1)&0x80;            //even=0x00:地址信号为偶数;0x10:奇数
			buffer+=2;
			GetISDNAddrNum(buffer,addrlen,even);
			buffer=buffer+addrlen;
		}
	default:
		break;
	}
	  return;
}

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

void CShowMsg::GetISUPCause(unsigned char *buffer)
{
	//提取原因信息
	buffer++;
	switch(*buffer&0x7F)
	{
	case 0x01: sprintf(mshowmsg.cause," 未分配的号码 "); 
		break;
	case 0x02: sprintf(mshowmsg.cause," 无路由到指定的转接网 "); 
		break;
	case 0x03: sprintf(mshowmsg.cause," 无路由到目的地 "); 
		break;
	case 0x04: sprintf(mshowmsg.cause," 发送专用信息音 "); 
		break;
	case 0x05: sprintf(mshowmsg.cause," 误拨长途字冠 "); 
		break;
	case 0x08: sprintf(mshowmsg.cause," 预占 "); 
		break;
	case 0x09: sprintf(mshowmsg.cause," 预占——电路留作再用 "); 
		break;
	case 0x10: sprintf(mshowmsg.cause," 正常的呼叫拆线 "); 
		break;
	case 0x11: sprintf(mshowmsg.cause," 用户忙 "); 
		break;
	case 0x12: sprintf(mshowmsg.cause," 用户未响应 "); 
		break;
	case 0x13: sprintf(mshowmsg.cause," 用户未应答 "); 
		break;
	case 0x14: sprintf(mshowmsg.cause," 用户缺席 "); 
		break;
	case 0x15: sprintf(mshowmsg.cause," 呼叫拒收 "); 
		break;
	case 0x16: sprintf(mshowmsg.cause," 号码改变 "); 
		break;
	case 0x1B: sprintf(mshowmsg.cause," 目的地不可达 "); 
		break;
	case 0x1C: sprintf(mshowmsg.cause," 无效的号码格式(地址不全) "); 
		break;
	case 0x1D: sprintf(mshowmsg.cause," 性能拒绝 "); 
		break;
	case 0x1F: sprintf(mshowmsg.cause," 正常——未指定 "); 
		break;
	case 0x22: sprintf(mshowmsg.cause," 无电路/通路可作 "); 
		break;
	case 0x26: sprintf(mshowmsg.cause," 网络未正常工作 "); 
		break;
	case 0x29: sprintf(mshowmsg.cause," 临时故障 "); 
		break;
	case 0x2A: sprintf(mshowmsg.cause," 交换设备拥塞 "); 
		break;
	case 0x2B: sprintf(mshowmsg.cause," 接入信息舍弃 "); 
		break;
	case 0x2C: sprintf(mshowmsg.cause," 所请求的电路/通路不可用 "); 
		break;
	case 0x2E: sprintf(mshowmsg.cause," 优先呼叫闭塞 "); 
		break;
	case 0x2F: sprintf(mshowmsg.cause," 资源不可用 "); 
		break;
	case 0x33: sprintf(mshowmsg.cause," 所请求的性能未预定 "); 
	    break;
	case 0x35: sprintf(mshowmsg.cause," CUG中限制去呼叫 "); 
		break;
	case 0x37: sprintf(mshowmsg.cause," CUG中限制来呼叫 "); 
		break;
	case 0x39: sprintf(mshowmsg.cause," 承载能力无权 "); 
		break;
	case 0x3A: sprintf(mshowmsg.cause," 承载能力目前不可用 "); 
		break;
	case 0x3E: sprintf(mshowmsg.cause," 指定的出接入信息和用户类别不一致 "); 
		break;
	case 0x3F: sprintf(mshowmsg.cause," 业务/任选不可用——未指定 "); 
		break;
	case 0x51: sprintf(mshowmsg.cause," 承载能力未实现 "); 
		break;
	case 0x55: sprintf(mshowmsg.cause," 所请求的性能未实现 "); 
		break;
	case 0x56: sprintf(mshowmsg.cause," 只有受限的数字信息承载能力可用 "); 
		break;
	case 0x57: sprintf(mshowmsg.cause," 被叫用户不是CUG的成员 "); 
		break;
	case 0x58: sprintf(mshowmsg.cause," 不兼容的目的地 "); 
		break;
	case 0x5A: sprintf(mshowmsg.cause," 不存在的CUG "); 
		break;
	case 0x5B: sprintf(mshowmsg.cause," 无效的转接网选择 "); 
		break;
	case 0x5F: sprintf(mshowmsg.cause," 无效的消息——未指定 "); 
		break;
	case 0x61: sprintf(mshowmsg.cause," 消息类型不存在或未实现 "); 
		break;
	case 0x63: sprintf(mshowmsg.cause," 参数不存在或未实现 "); 
		break;
	case 0x66: sprintf(mshowmsg.cause," 定时器终了时恢复 "); 
		break;
	case 0x65: sprintf(mshowmsg.cause," 参数不存在或未实现——传递 "); 
		break;
	case 0x6E: sprintf(mshowmsg.cause," 消息带有未被识别的参数——舍弃 "); 
		break;
	case 0x6F: sprintf(mshowmsg.cause," 协议错误——未指定 "); 
		break;
	case 0x7F: sprintf(mshowmsg.cause," 互通——未指定 "); 
		break;
	default:
		break;
	}
}

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

void CShowMsg::GetISDNAddrNum(unsigned char *buffer,int len,int even)
{
	//提取ISUP主/被叫号码
	int i;
	int acalladdlen=0;
	acalladdlen=strlen(mshowmsg.acalladd);
	if(len>8)
		return;
	else
	{
		if(even==0x00)
		{		
			for(i=len;i>0;i--)
			{			
				char tempvarL,tempvarU;
				tempvarL=((*buffer)&0x0F)+48; 
				mshowmsg.acalladd[acalladdlen++]=tempvarL; 
				tempvarU=(((*buffer)&0xF0)>>4)+48;
				if(tempvarU==0x0F+48) 
					return;
				mshowmsg.acalladd[acalladdlen++]=tempvarU;
				buffer++;
			}
		}
		else if(even==0x80)
		{
			char tempFirstNum;
			for(i=len-1;i>0;i--)
			{
				char tempvarL,tempvarU;
				tempvarL=((*buffer)&0x0F)+48;  
				mshowmsg.acalladd[acalladdlen++]=tempvarL; 
				tempvarU=(((*buffer)&0xF0)>>4)+48;
				mshowmsg.acalladd[acalladdlen++]=tempvarU;
				buffer++;
			}
			tempFirstNum=((*buffer)&0x0F)+48; 
			if(tempFirstNum==0x0F+48) 
				return;
		  mshowmsg.acalladd[acalladdlen++]=tempFirstNum;
		}
	}
}

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

void CShowMsg::ProcSCCPmsg(unsigned char *buffer,unsigned char pclen)
{
	//提取SCCP消息类型,并存入buffer 
    unsigned char sccpmtype;        //sccp消息类型:CR、CC、CREF、RLSD、RLC、DT1、DT2、AK、UDT、
	                                //      UDTS、ED、EA、RSR、RSC、ERR、IT、XUDT、XUDTS
	unsigned char OSSN=0,DSSN=0;   // OSSN:主叫用户子系统号;DSSN:被叫用户子系统号
	unsigned char len,vlen,*tempbuf;     //len:指针长度;vlen:可变长度必备项长度	
		                                        //*tempbuf:临时指针
	sccpmtype=*buffer;
	switch(sccpmtype)
	{
	    case 0x01:  sprintf(mshowmsg.msgtype,"MSU SCCP CR ");   
		    break;
		case 0x02:  sprintf(mshowmsg.msgtype,"MSU SCCP CC ");   
		    break;
		case 0x03:  sprintf(mshowmsg.msgtype,"MSU SCCP CREF "); 
		    break;
		case 0x04:  sprintf(mshowmsg.msgtype,"MSU SCCP RLSD "); 
		    break;
		case 0x05:  sprintf(mshowmsg.msgtype,"MSU SCCP RLC ");  
		    break;
		case 0x06:  sprintf(mshowmsg.msgtype,"MSU SCCP DT1 ");  
		    break;
		case 0x07:  sprintf(mshowmsg.msgtype,"MSU SCCP DT2 ");  
		    break;
		case 0x08:  sprintf(mshowmsg.msgtype,"MSU SCCP AK ");   
		    break;
		case 0x09:  sprintf(mshowmsg.msgtype,"MSU SCCP UDT "); 
		    break;
		case 0x0A:  sprintf(mshowmsg.msgtype,"MSU SCCP UDTS "); 
		    break;
		case 0x0B:  sprintf(mshowmsg.msgtype,"MSU SCCP ED ");   
		    break;
		case 0x0C:  sprintf(mshowmsg.msgtype,"MSU SCCP EA ");   
		    break;
		case 0x0D:  sprintf(mshowmsg.msgtype,"MSU SCCP RSR ");  
		    break;
		case 0x0E:  sprintf(mshowmsg.msgtype,"MSU SCCP RSC ");  
		    break;
	    case 0x0F:  sprintf(mshowmsg.msgtype,"MSU SCCP ERR ");  
		    break;
		case 0x10:  sprintf(mshowmsg.msgtype,"MSU SCCP IT ");   
		    break;
		case 0x11:  sprintf(mshowmsg.msgtype,"MSU SCCP XUDT "); 
		    break;
		case 0x12:  sprintf(mshowmsg.msgtype,"MSU SCCP XUDTS ");
		    break;
		default: 
			break;
	}
	buffer++;
	switch(sccpmtype)
	{		
	case 0x01:           //连接请求 CR
		{
		   buffer+=4;                         //跳过固定长度必备项,指向被叫用户地址的指针
		   len=*buffer;                       //被叫用户地址指针的长度
		   buffer=buffer+len;                 //指向被叫用户地址长度表示语
		   vlen=*buffer;                      //被叫用户地址长度
		   buffer++;                          //指向被叫地址表示语的指针
		   DSSN=SccpSSN(buffer,pclen);        //提取被叫用户的SSN号		 
		   buffer=buffer+vlen;                //指向任选项标签
		    if(*buffer==0x09)                 //含信用量 
				buffer+=3;
		    if(*buffer==0x04)                 //含主叫地址
			{   
			  buffer++;
			  vlen=*buffer;                   //主叫地址的长度
			  buffer++;                       //指向主叫地址表示语的指针
			  OSSN=SccpSSN(buffer,pclen);     //提取主叫用户的SSN号
			  buffer=buffer+vlen; 
			}		          
			if(*buffer==0x0F)                 //含数据			
				buffer+=2;                    //指向数据的第一字节  
		}
		break;
	
	case 0x02:     //确认连接 CC
		{
			buffer+=7;                       //跳过固定长度必备项,指向任选项的指针
			if(*buffer==0)                   //任选项指针值为零,不含任选项
				break;
			else
				buffer+=*buffer;             //指向任选项标签
			if(*buffer==0x09)                //含信用量 
				buffer+=3;
			if(*buffer==0x04)                //含被叫地址
			{   
			  buffer++;
			  vlen=*buffer;                  //被叫地址的长度
			  buffer++;                      //指向被叫地址表示语的指针
			  DSSN=SccpSSN(buffer,pclen);    //提取被叫用户的SSN号
			  buffer=buffer+vlen; 
			}		      		          			
			if(*buffer==0x0F)                //含数据
				buffer+=2;                   //指向数据的第一字节
			ProcBSSAPmsg(buffer);
		}
		break;

	case 0x03:     //拒绝连接 CREF
		{
			buffer+=4;                       //跳过固定长度必备项,指向任选项的指针
			if(*buffer==0)                   //任选项指针值为零,不含任选项
				break;
			else
			  buffer+=*buffer;               //指向任选项标签
			if(*buffer==0x04)                //含被叫地址
			{   
			  buffer++;
			  vlen=*buffer;                  //被叫地址的长度
			  buffer++;                      //指向被叫地址表示语的指针
			  DSSN=SccpSSN(buffer,pclen);    //提取被叫用户的SSN号
			  buffer=buffer+vlen;  
			}		      
			if(*buffer==0x0F)                //含数据
				buffer+=2;                   //指向数据的第一字节
			ProcBSSAPmsg(buffer);
		}
		break;

	case 0x04:            //释放连接 RLSD
		{
			buffer+=7;                      //跳过固定长度必备项,指向任选项的指针
			if(*buffer==0)                  //任选项指针值为零,不含任选项
				break;
			else
				buffer+=*buffer;            //指向数据项标签
			    buffer+=2;                  //指向数据的第一字节
				ProcBSSAPmsg(buffer);
		}
		break;

	case 0x06:         //数据形式1 DT1
		buffer+=6;     //跳过固定长度必备项和数据长度指示字,指向数据的第一字节
		ProcBSSAPmsg(buffer);
		break;

	case 0x07:         //数据形式2 DT2
		buffer+=7;     //跳过固定项长度必备项,指向数据的第一字节
		ProcBSSAPmsg(buffer);
		break;

	case 0x09:         //单位数据 UDT
		{
		   buffer+=1;                     //跳过固定长度必备项,指向被叫用户地址的指针
		   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 0x0A:       //单位数据业务 UDTS
		{
		   buffer+=1;                     //跳过固定长度必备项,指向被叫用户地址的指针
		   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++;                      //指向数据的第一字节
		}

⌨️ 快捷键说明

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