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

📄 capdisp.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***********************************************
History:
2000.04.17:Iniial Version,CAMEL Application Part protocol decode

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

#include "stdafx.h"

#define numOfInfoItems 4
#define numOfExtensions 10
#define numOfMessageIDs 5
#define numOfBCSMEvents 10

extern unsigned char *dispbuf,*recbuf;
extern unsigned char UDTlen;
extern unsigned short displen;


extern void procSourcePARAdisp(BYTE dfldno);
extern void procNULL(unsigned char dfldno);
extern char procsequencetag(unsigned char dfldno);
extern void procsbasicpara(unsigned char dfldno);
extern void procCase(BYTE dfldno);
extern void procinteger(BYTE dfldno);
extern unsigned char procsISDNADDR(unsigned char dfldno);
extern void procGeographInfo(BYTE dfldno);
extern void  procCCILA(BYTE dfldno1,BYTE dfldno2,BOOL more6byte);
extern void procExtension(BYTE dfldno);
extern void procIMSI(unsigned char dfldno);


/*

void procinteger(BYTE dfldno)
{ BYTE li;
	*dispbuf++=dfldno;  //tag
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	
	*dispbuf++=dfldno+1;  //li
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	
	*dispbuf++=dfldno+2;  
	*dispbuf++=li*8;
	if(li==1) *dispbuf++=*recbuf++;
	else if(li==2)
	{*dispbuf++=*(recbuf+1);
	 *dispbuf++=*recbuf;
	 recbuf+=2;
	}
	else if(li==3)
	{*dispbuf++=*(recbuf+2);
	 *dispbuf++=*(recbuf+1);
	 *dispbuf++=*recbuf;
	 recbuf+=3;
	}
	else if(li==4)
	{*dispbuf++=*(recbuf+3);
	 *dispbuf++=*(recbuf+2);
	 *dispbuf++=*(recbuf+1);
	 *dispbuf++=*recbuf;
	 recbuf+=4;
	}
	*dispbuf++=0xcc;
	displen+=li+11;
}

*/



void procCAPADDR(unsigned char dfldno) //P49-50
{  unsigned char li,i,code;
//ADDR TAG
	*dispbuf++=dfldno;
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//ADDR LI
	*dispbuf++=dfldno+1;
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	UDTlen-=li+2;
//ADDR IN
	*dispbuf++=dfldno+2;
	*dispbuf++=8;
	code=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//ADDR SIGNAL
//zxf update begin  2001-9-27
	li-=2;  //old
	recbuf++;//old
	//li--;
	*dispbuf++=dfldno+3;
	if((code&0x80)==0x80)  //there is fill,odd
		*dispbuf++=li*8-4;
	else *dispbuf++=li*8;
	for(i=0;i<li;i++)
	{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
	*dispbuf++=0xcc;
	displen+=li+15; //li*2+22;
}





void procCAPLegID(BYTE dfldno)
{ BYTE indeffmt;
    indeffmt=procsequencetag(dfldno); //LEGID sequence
	if((*recbuf&0x3f)==0) procsbasicpara(dfldno+2); //发方ID
	else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+2);//
	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}	  
}


void ProcCAPSendingInfo(BYTE dfldno) //要发送的信息
{ BYTE indeffmt0,indeffmt,indeffmt2,indeffmt3,indeffmt4,i,li,len;
//modify by yzy 2001.10.11
	indeffmt0=procsequencetag(dfldno); //要发送的信息 sequence
//“要发送的信息”选择“带内信息”“信号音”
	if((*recbuf&0x3f)==0x20)//选择“带内信息”
	{indeffmt=procsequencetag(dfldno+2); //带内信息 sequence
//“消息ID”选择“基本消息ID”“文本”“基本消息ID组”“可变消息”
	if((*recbuf&0x3f)==0x20)//“消息ID”
	{indeffmt2=procsequencetag(dfldno+4); //消息ID sequence
	 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+6);  //基本消息ID
	 else if((*recbuf&0x3f)==0x21) //“文本”
	 {indeffmt3=procsequencetag(dfldno+10); //文本 sequence
	  if((*recbuf&0x3f)==0) procsbasicpara(dfldno+12); //消息内容
	  if((*recbuf&0x3f)==1) procsbasicpara(dfldno+15); //属性
	  if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
	 }//“文本”
	 else if((*recbuf&0x3f)==0x3d) //“基本消息ID组”
	 {indeffmt3=procsequencetag(dfldno+18); //基本消息ID组
	  i=0;
	  while((*recbuf&0x3f)==2 && i<numOfMessageIDs)
	  {i++;
	   procsbasicpara(dfldno+6); //基本消息ID
	  }
	  if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
	 }//“基本消息ID组”
	 else if((*recbuf&0x3f)==0x3e) //“可变消息”
	 {indeffmt3=procsequencetag(dfldno+20);//19); //可变消息sequence
	  if((*recbuf&0x3f)==0) procsbasicpara(dfldno+6); //基本消息ID
	  if((*recbuf&0x3f)==0x21)//可变部分
	  {if(*(recbuf+1)<=0x80) li=*(recbuf+1);
	   else li=*(recbuf+2);
	   indeffmt4=procsequencetag(dfldno+22);//21); //可变部分sequence
	   if(indeffmt4!=0)//indefinite formatt
	   {i=0;
		while(*(WORD *)recbuf!=0 && i<5)
		{i++;
		 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+24); //整数
		 else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+27); //数字
		 else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+30); //时间
		 else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+33); //日期
		 else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+36); //价格
		}//while
		recbuf+=2;UDTlen-=2;
	   }//indefinite formatt
	   else//short\long format
	   {i=0;
		while(li!=0 && i<5)
		{i++;
		 len=UDTlen;
		 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+24); //整数
		 else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+27); //数字
		 else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+30); //时间
		 else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+33); //日期
		 else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+36); //价格
		 len-=UDTlen;
		 li-=len;
		}//while
	   }//short\long format
	  }//可变部分
	  if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
	 }//“可变消息”
	 if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
	}////“消息ID”
//重复次数
	 if((*recbuf&0x3f)==1) procsbasicpara(dfldno+39); //重复次数
//持续时间
	 if((*recbuf&0x3f)==2) procsbasicpara(dfldno+42); //持续时间
//时间间隔
	 if((*recbuf&0x3f)==3) procsbasicpara(dfldno+45); //时间间隔
	 if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
	}//选择“带内信息”
	else if((*recbuf&0x3f)==0x21)//选择“信号音”
	{indeffmt=procsequencetag(dfldno+48);  //信号音 sequence
	 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+50); //信号音ID
	 if((*recbuf&0x3f)==1) procsbasicpara(dfldno+42); //持续时间
	 if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
	}//选择“信号音”

	if(indeffmt0!=0) {recbuf+=2;UDTlen-=2;}
}


void ProcCAPExpand(BYTE dfldno) //“扩展”,P63
{ BYTE i,indeffmt,indeffmt2;
	indeffmt=procsequencetag(dfldno); //扩展 sequence
	i=0;
	while(*recbuf==0x30 && i<numOfExtensions)//扩展域
	{i++;
	 indeffmt2=procsequencetag(dfldno+2);//扩展域 sequence
	 procsbasicpara(dfldno+4);            //类型
	 procsbasicpara(dfldno+7);         //准则
	 procsbasicpara(dfldno+10);        //值
	 if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
	}//扩展域
	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}




void procCAPNAInfo(BYTE dfld)
{  BYTE indeffmt,indeffmt2;

		indeffmt=procsequencetag(dfld);  //NA信息 sequence

		if((*recbuf&0x3f)==0x20)//NA承载信息
		{indeffmt2 = procsequencetag(dfld+2);  //NA承载信息 sequence
		 if((*recbuf&0x3f)==0) procsbasicpara(dfld+4); //NA承载Id
		 if((*recbuf&0x3f)==1) procsbasicpara(dfld+7); //NA CIC选择类型
		 if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
		}//NA承载信息

		if((*recbuf&0x3f)==1) procsbasicpara(dfld+10);  //NA Oli 信息

		if((*recbuf&0x3f)==2) procCAPADDR(dfld+13);  //NA计费号码

		if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}


void procCAPdisp(BYTE oc,BYTE compt)
{  BYTE i,indeffmt,indeffmt2,indeffmt3,indeffmt4,indeffmt5,li;

	switch(oc)  //operate code
	{

	 case 35:  //申请计费:35
		  indeffmt=procsequencetag(0x01);
//CAMEL-ACH帐单计费特性
		  indeffmt2=procsequencetag(0x03); //CAMEL-ACH帐单计费特性 sequence
////计费时长
		  if((*recbuf&0x3f)==0x20)//exist 计费时长
		  {
		   indeffmt3=procsequencetag(0x05); //计费时长 sequence
		   if((*recbuf&0x3f)==0)  procsbasicpara(0x08); //最大呼叫时长
		   if((*recbuf&0x3f)==0x21)//exist “超过时长释放”
		   {indeffmt4=procsequencetag(0x0b); //超过时长释放 sequence
		    procsbasicpara(0x0d); //“信号音(tone)”
			if((*recbuf&0x3f)==10) ProcCAPExpand(0x10); //扩展
			if(indeffmt4!=0) {recbuf+=2;UDTlen-=2;}
		   }//exist “超过时长释放”
		   if((*recbuf&0x3f)==2)  procsbasicpara(0x1d); //“费率变换间隔(tariffSwitchInterval)”
		   if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
		  }//exist 计费时长
//计费方
		  if((*recbuf&0x3f)==0x22) //计费方
		  {indeffmt3=procsequencetag(0x20);//计费方 sequence
		   if((*recbuf&0x3f)==0)  procsbasicpara(0x22); //发方Id
		   if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
		  }//计费方
//“扩展”
		  if((*recbuf&0x3f)==0x23) ProcCAPExpand(0x10);

		  if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
		  if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
		  break;

	 case 36:  //申请计费报告:36
		  if(*recbuf==0x04)  indeffmt=procsequencetag(0x01);//2001.09.07
//CAMEL-呼叫结果
//		  if((*recbuf&0x1f)==0)  indeffmt2=procsequencetag(0x03);

//计费结果时长(timeDurationChargingResult)
		  if((*recbuf&0x3f)==0x20)//计费结果时长
		  {indeffmt3=procsequencetag(0x05);  //计费结果时长 sequence
//计费方
		   if((*recbuf&0x1f)==0x00)//计费方
		   {indeffmt4=procsequencetag(0x07);  //计费方 sequence
		    if((*recbuf&0x3f)==1) procsbasicpara(0x09);  //收方Id
			if(indeffmt4!=0) {recbuf+=2;UDTlen-=2;}
		   }//计费方
//时间信息
		   if((*recbuf&0x1f)==0x01)//时间信息select
		   {indeffmt4=procsequencetag(0x0c);  //时间信息 sequence
		    if((*recbuf&0x1f)==0) procsbasicpara(0x0e);  //费率未变换时间(timeIfNoTariffSwitch)
		    else if((*recbuf&0x1f)==0x01)//费率已变换时间(timeIfTariffSwitch)
			{indeffmt5=procsequencetag(0x11);  //时间信息 sequence
			 if((*recbuf&0x1f)==0) procsbasicpara(0x13);  //费率变换后的时间(timeSinceTariffSwitch)
			 if((*recbuf&0x1f)==1) procsbasicpara(0x16);  //费率变换间隔(tariffSwitchInterval)
			 if(indeffmt5 != 0) {recbuf+=2;UDTlen-=2;}
			}//费率已变换时间(timeIfTariffSwitch)
			if(indeffmt4!=0) {recbuf+=2;UDTlen-=2;}
		   }//时间信息
//呼叫激活
		   if((*recbuf&0x3f)==2) procsbasicpara(0x19); //呼叫激活

		   if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
		  }//结果计费时长

		  //if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}

		  if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
		  break;


	 case 16:  //辅助请求指令:16
		  indeffmt=procsequencetag(0x01);
//相关ID
		  procsbasicpara(0x03);
//IP可用性
		  if((*recbuf&0x3f)==1) procsbasicpara(0x06);
//IPSSP能力
		  if((*recbuf&0x3f)==2) procsbasicpara(0x09);
//“扩展”
		  if((*recbuf&0x3f)==0x23) ProcCAPExpand(0x0c);

		  if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
		  break;



	 case 44:  //呼叫信息报告:44
		  indeffmt=procsequencetag(0x01);
//所请求的信息清单
		  indeffmt2=procsequencetag(0x03);  //所请求的信息清单 sequence
////所请求的信息
		  i=0;
		  while(*recbuf==0x30 && i<numOfInfoItems)//所请求的信息
		  {i++;
		   indeffmt3=procsequencetag(0x05);  //所请求的信息 sequence
		   procsbasicpara(0x07);   //所请求的信息类型(枚举)
//“所请求的信息值”:以下4项选择其一
		   indeffmt3+=procsequencetag(0x0a);  //所请求的信息值 sequence
		   if((*recbuf&0x3f)==0) procsbasicpara(0x0c);  //呼叫历史时间值
		   else if((*recbuf&0x3f)==1) procsbasicpara(0x0f); //呼叫停止时间
		   else if((*recbuf&0x3f)==2) procsbasicpara(0x12);    //呼叫连接历史时间
		   else if((*recbuf&0x3f)==30) procsbasicpara(0x15); //释放愿因值
		   if(indeffmt3!=0) {recbuf+=2*indeffmt3;UDTlen-=2*indeffmt3;}
		  }//所请求的信息
		  if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
		  
//“扩展”
		  if((*recbuf&0x3f)==0x22) ProcCAPExpand(0x18);

//“legID”
		  if((*recbuf&0x3f)==0x23)
		  {indeffmt3=procsequencetag(0x25);  //legID sequence
		   if((*recbuf&0x3f)==0x01) procsbasicpara(0x27); //收方Id
		   if(indeffmt3!=0) {recbuf+=2; UDTlen-=2;}
		  }

		  if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
		  break;


	 case 45:  //呼叫信息请求:45
		  indeffmt=procsequencetag(0x01);
//所请求的信息类型清单
		  indeffmt2=procsequencetag(0x03);  //所请求的信息类型清单 sequence
////所请求的信息类型
		  i=0;
		  while(*recbuf==0x30 && i<numOfInfoItems)//所请求的信息类型
		  {i++;
		   procsbasicpara(0x05);   //所请求的信息类型(枚举)
		  }
		  if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
		  
//“扩展”
		  if((*recbuf&0x3f)==0x22) ProcCAPExpand(0x0b);

//“legID”
		  if((*recbuf&0x3f)==0x23)
		  {indeffmt3=procsequencetag(0x15);  //legID sequence
		   if((*recbuf&0x3f)==0) procsbasicpara(0x17); //发方Id
		   if(indeffmt3!=0) {recbuf+=2; UDTlen-=2;}
		  }

		  if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
		  break;

	 case 53:  //取消:53
		  if((*recbuf&0x3f)==0) procsbasicpara(0x01); //调用ID
		  else if((*recbuf&0x3f)==1) procNULL(0x04);  //所有请求(NULL)
		  break;



	 case 20:  //连接:20
		  indeffmt=procsequencetag(0x01);
//目的地路由地址
		  indeffmt2=procsequencetag(0x03);
		  procCAPADDR(0x05); //被叫用户号码
		  if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
//振铃模式
		  if((*recbuf&0x3f)==1) procsbasicpara(0x09);
//原被叫用户ID(原被叫号码)
		  if((*recbuf&0x3f)==6) procCAPADDR(0x0c);
//“扩展”
		  if((*recbuf&0x3f)==0x2a) ProcCAPExpand(0x10);
//主叫用户类别
		  if((*recbuf&0x3f)==28) procsbasicpara(0x1d);
//改向用户ID
		  if((*recbuf&0x3f)==29) procCAPADDR(0x20);
//改向信息
		  if((*recbuf&0x3f)==30) procsbasicpara(0x24);
//通用数字
		  if((*recbuf&0x3f)==14) procsbasicpara(0x27);
//抑制通知(suppressionOfAnnouncement)
		  if((*recbuf&0x1f)==0x1f) {recbuf++;UDTlen--;}
		  if((*recbuf&0x7f)==55) procsbasicpara(0x2a);
//oCSI应用
		  if((*recbuf&0x1f)==0x1f) {recbuf++;UDTlen--;}
		  if((*recbuf&0x7f)==56) procNULL(0x2d);
//NA信息
		  if((*recbuf&0x1f)==0x1f) {recbuf++;UDTlen--;}

⌨️ 快捷键说明

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