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

📄 sccpdispgsm.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	 *dispbuf++=dfldno+2;
	 *dispbuf++=paralen;
	 UDTlen-=paralen;
	 for(c=0;c<paralen;c++) *dispbuf++=*(recbuf+c);
	 *dispbuf++=0xcc;
	 displen+=paralen+3;
	}//indefinite format
  else //short or long format
	{if((*recbuf&0x80)==0)//short length
	  {*dispbuf++=dfldno+1;
		*dispbuf++=1;
		paralen=*dispbuf++=*recbuf++;
		*dispbuf++=8;
		*dispbuf++=paralen;
		*dispbuf++=0xcc;
		displen+=6;
		UDTlen--;
	  }//short length
	 else if((*recbuf&0x7f)!=0)//long format
	  {*dispbuf++=dfldno+1;
		*dispbuf++=2;
		*dispbuf++=*recbuf++;
		paralen=*dispbuf++=*recbuf++;
		*dispbuf++=8;
		*dispbuf++=paralen;
		*dispbuf++=0xcc;
		displen+=7;
		UDTlen-=2;
	  }//long format

	 UDTlen-=paralen;
	 if(paralen!=0)
	  {*dispbuf++=dfldno+2;
		*dispbuf++=paralen;
		for(c=0;c<paralen;c++) *dispbuf++=*(recbuf+c);
		*dispbuf++=0xcc;
		displen+=paralen+3;
	  }
	}//else:short or long format
  recbuf+=lenfmt*2;
}

void procDIALOGPARTdisp(BYTE dfldno)
{ BYTE lenfmt=0;
  BYTE paralen,len,c,*bufbak;
//Dialog Part tag code:8bits
	 bytedisp(dfldno)
	 UDTlen--;
//Dialog Part length
	 lenfmt+=procTCLENGTHdisp(dfldno+1);
//External Tag code:8bits
	 bytedisp(dfldno+2)
	 UDTlen--;
//External Tag length
  if(*recbuf==0x80)//indefinite format
	{
//process indefinite format length
	 *dispbuf++=dfldno+3;
	 *dispbuf++=1;
	 *dispbuf++=*recbuf;
	 *dispbuf++=8;
	 *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 displen+=6;
	 UDTlen--;
	 lenfmt++;
//process External Tag  content
	 paralen=0;
	 len=*(recbuf+1);//get sub-len
	 bufbak=recbuf;
	 while(*(WORD *)recbuf!=0) //EOC tag
	  {if(*(recbuf+1)==0x80)//sub len is indefinite format
		 {lenfmt++; recbuf+=2; paralen+=2; UDTlen -= 2;}
		else
		 {if ((*(recbuf+1)&0x80)==0x80) //long format
			 {recbuf++; paralen++; UDTlen--;}
		  len=*(recbuf+1);
		  recbuf+=2;
		  UDTlen -= 2;
		  paralen+=2;
		  recbuf+=len;
		  paralen+=len;
		 }//else
	  }//while
//process tag content
	 recbuf=bufbak;
	 *dispbuf++=dfldno+4;
	 *dispbuf++=paralen;
	 for(c=0;c<paralen;c++) *dispbuf++=*recbuf++;
	 UDTlen -= paralen;
	 *dispbuf++=0xcc;
	 displen+=paralen+3;
	}//indefinite format
  else //short or long format
	{if((*recbuf&0x80)==0)//short length
	  {*dispbuf++=dfldno+3;
		*dispbuf++=1;
		paralen=*dispbuf++=*recbuf++;
		*dispbuf++=8;
		*dispbuf++=paralen;
		*dispbuf++=0xcc;
		displen+=6;
		UDTlen--;
	  }//short length
	 else if((*recbuf&0x7f)!=0)//long format
	  {*dispbuf++=dfldno+3;
		*dispbuf++=2;
		*dispbuf++=*recbuf++;
		paralen=*dispbuf++=*recbuf++;
		*dispbuf++=8;
		*dispbuf++=paralen;
		*dispbuf++=0xcc;
		displen+=7;
		UDTlen -= 2;
	  }//long format

//process tag content
	 if(paralen!=0)
	  {*dispbuf++=dfldno+4;
		*dispbuf++=paralen;
		for(c=0;c<paralen;c++) *dispbuf++=*recbuf++;
		*dispbuf++=0xcc;
		UDTlen -= paralen;
		displen+=paralen+3;
	  }
	}//else:short or long format
  recbuf+=lenfmt*2;
  UDTlen -= lenfmt*2;
}
BYTE *pSS7MSGSTART;
void procUDTDATACDMADisp();
void procUDTDATACDMADisp()
{
#if 1
	BYTE c;
    int len;
//DATA length:8bits
  *dispbuf++=0x22;
  *dispbuf++=1;
  UDTlen=*dispbuf++=*recbuf++;
  *dispbuf++=8;
  *dispbuf++=UDTlen;
  *dispbuf++=0xcc;
//DATA content
  *dispbuf++=DATAFIELDNO;
  *dispbuf++=UDTlen;
  for(c=0;c<UDTlen;c++) *dispbuf++=*(recbuf+c);
  *dispbuf++=0xcc;

  displen +=UDTlen+9;
#endif

 
//  len=GoThoughSINGLEMsg(pSS7MSGSTART,dispbuf);
  displen+=len;
  dispbuf+=len;
 

}

void procUDTDATADisp(BYTE dfldno,BYTE up)
{ BYTE c,tag,lenfmt;


//DATA length:8bits
  *dispbuf++=dfldno;
  *dispbuf++=1;
  UDTlen=*dispbuf++=*recbuf++;
  *dispbuf++=8;
  *dispbuf++=UDTlen;
  *dispbuf++=0xcc;
//DATA content
  *dispbuf++=DATAFIELDNO;
  *dispbuf++=UDTlen;
  for(c=0;c<UDTlen;c++) *dispbuf++=*(recbuf+c);
  *dispbuf++=0xcc;

  displen +=UDTlen+9;

  if(up==0x01)//SCMG
	{
//SCMG Message Type Code:8bits
	 bytedisp(0x41)
//SSN Reflected:8bits
	 bytedisp(0x42)
//DPC Reflected:24bits
	 proc3byte(0x43)
//subsystem mixed indicator:2bits,D1-D0
	 *dispbuf++=0x44;
	 *dispbuf++=1;
	 *dispbuf++=*recbuf;
	 *dispbuf++=2;
	 *dispbuf++=(*recbuf++)<<6;
	 *dispbuf++=0xcc;

	 displen += 6;
	}//SCMG
  else//TCAP
	{
//TCAP MT tag code:8bits
	 tag=*recbuf;  //get MT tag
//add by 2000.09.02 by LHG
	 if(tag!=0x61 && tag!=0x62 && tag!=0x64 && tag!=0x65 && tag!=0x67)
		 return;

	 bytedisp(DATAFIELDNO+1)
	 UDTlen--;
//Total message length
	 lenfmt=procTCLENGTHdisp(DATAFIELDNO+2);

	 dfldno=DATAFIELDNO+2;
	 switch(tag)
	  {
		case 0x61: //Unidirectional
		case 0x62: //Begin
		case 0x64: //End
		case 0x65: //Continue
		 if (tag==0x65)
//OTID(Continue) tag,M
		 {procPRIMITIVEIEDdisp(dfldno);dfldno+=3;}
//OTID(Begin)/DTID(Continue & End),M
		 if(tag!=0x61)
		 {procPRIMITIVEIEDdisp(dfldno);
		  if(UDTlen<=(lenfmt*2)) {recbuf+=lenfmt*2; UDTlen -=lenfmt*2; break;}
		 }
//Dialog Part,O
		 if(*recbuf==0x6b)//exist Dialog Part tag code
		  {dfldno=DIALODPARTFIELDNO;
			procDIALOGPARTdisp(dfldno);
			if (UDTlen<=(lenfmt*2)) {recbuf+=lenfmt*2; UDTlen -=lenfmt*2; break;}
		  }//exist Dialog Part tag code
		 if(*recbuf==0x6c)//exist Component Part
		  {dfldno=COMPONENTPARTFIELDNO;
//Component Part,M(Unidirectional);other is O
//Component Part tag code:8bits
			bytedisp(dfldno)
			UDTlen--;
			dfldno++;
//Component Part length
			lenfmt+=procTCLENGTHdisp(dfldno);

//process component
			while(UDTlen>(lenfmt*2))
			{if(*recbuf==0xa1)//Invoke component tag
			  procINVOKEdisp(COMPONENTTAGFIELDNO,up);
			 else if(*recbuf==0xa2)//Return result component tag
			  procRETURNRESULTdisp(COMPONENTTAGFIELDNO,up);
			 else if(*recbuf==0xa3)//Return error component tag
			  procRETURNERRdisp(COMPONENTTAGFIELDNO,up);
			 else if (*recbuf==0xa4)//Reject component tag
			  procREJECTdisp(COMPONENTTAGFIELDNO);
			 else if(*recbuf==0xa7)//Return result(not last)
			  procRETURNRESULTdisp(COMPONENTTAGFIELDNO,up);
			 else UDTlen=0;

			 if(UDTlen > lenfmt*2)  //add by 2000.06.12
			 {
				 recbuf+=lenfmt*2;
				 UDTlen -= lenfmt*2; 
			 }
			}
		  }//exist Component Part
		  break;

		case 0x67: //Abort
//OTID tag,M,primitive
		 procPRIMITIVEIEDdisp(dfldno);
//P-Abort Case tag,O,primitive
		 if (*recbuf==0x4a)//exist P-Abort Case tag
			 procPRIMITIVEIEDdisp(dfldno);
		 if (*recbuf==0x6b)//exist Dialog Part
			 procDIALOGPARTdisp(DIALODPARTFIELDNO);
		 recbuf+=lenfmt*2;
		 break;

		default:break;
	  }//switch(tag)
	}//TCAP
}


void procSCCPADDRDisp(BYTE dfldno,BYTE b24)
{ BYTE len,oddeven,code,c;
  WORD temp16;

//ADDR Length:8bits
  len=*recbuf;  //get addr information length
  bytedisp(dfldno)
//  proc8bitsdisp(dfldno);
//ADDR Indicator(SP:D0;SSN:D1;GT:D5-D2;ROUTE:D6;SPARE:D7)
//  proc8bitsdisp(dfldno+1);
  code=*recbuf; //get ADDR Indicator
  bytedisp(dfldno+1)
  len--;

  if(code&0x01) /*exist DPC*/
	if(b24!=0) /*DPC is24bits*/
	 {proc24bitsdisp(dfldno+2);
	  len-=3;
	 }/*DPC is24bits*/
	else/*DPC is 14bits*/
	 {*dispbuf++ = dfldno+2;
	  *dispbuf++ = 2;
	  temp16=*(WORD *)dispbuf=*(WORD *)recbuf;
	  dispbuf+=2;
	  recbuf+=2;
	  *dispbuf++ = 14;
	  temp16&=0x3fff;
	  *dispbuf++=HIBYTE(temp16);
	  *dispbuf++=LOBYTE(temp16);
	  *dispbuf++=0xcc;
	  displen+=8;
	  len-=2;
	 }//DPC is 14bits

  if (len==0) return;

  if(code&0x02)//exist SSN
	{//proc8bitsdisp(dfldno+3);
	 SCCPSSN=*recbuf;
	 bytedisp(dfldno+3)
	 len--;
	}//exist SSN

  if(len==0) return;

  code&=0x3c;
  switch(code)
	{
	 case 0x04://GT1
//Nature of Addr Indicator:8bits
	  oddeven=(*recbuf)&0x80;
//	  proc8bitsdisp(dfldno+6);
	  bytedisp(dfldno+6)
	  len--;
	  break;

	 case 0x08://GT2
//Translation Type:8bits
//	  proc8bitsdisp(dfldno+6);
	  bytedisp(dfldno+6)
	  len--;
	  break;

	 case 0x0c://GT3
	 case 0x10://GT4
//Translation Type:8bits
	  //proc8bitsdisp(dfldno+4);
	  bytedisp(dfldno+4)
//numbering plan(4bits:D7-D4);encoding scheme(4bits:D3-D0)
	  *dispbuf++=dfldno+5;
	  *dispbuf++=1;
	  oddeven=*dispbuf++=*recbuf;
	  oddeven&=0x0f;
	  *dispbuf++=4;
	  *dispbuf++=oddeven<<4;
	  *dispbuf++=0xcc;

	  *dispbuf++=dfldno+6;
	  *dispbuf++=0;
	  *dispbuf++=4;
	  *dispbuf++=(*recbuf++)&0xf0;
	  *dispbuf++=0xcc;
	  displen+=11;
	  len-=2;
//ADDR Information Indicator:8bits
	  if (code==0x10)
		{//proc8bitsdisp(dfldno+7);
		 bytedisp(dfldno+7)
		 len--;
		}
	  break;

	 default:break;
	}//switch(code)

  *dispbuf++=dfldno+8;
  *dispbuf++=len;
  for(c=0;c<len;c++) *dispbuf++=*(recbuf+c);
  if(oddeven==0 || oddeven==0x02)//even
	 {*dispbuf++=len*8;
	  for(c=0;c<len;c++)
		{*dispbuf++=(*recbuf>>4)|(*recbuf<<4); recbuf++;}
	 }//even
  else//odd
	 {*dispbuf++=len*8-4;
	  for (c=0;c<len-1;c++)
		{*dispbuf++=(*recbuf>>4)|(*recbuf<<4); recbuf++;}
	  *dispbuf++=*recbuf<<4; recbuf++;
	 }//odd
  *dispbuf++=0xcc;
  displen+=len*2+4;
}

void procSCCPDATADisp(BYTE dfldno)
{ BYTE len,c;

/*DATA length:8bits*/
  *dispbuf++=dfldno;
  *dispbuf++=1;
  len=*dispbuf++=*recbuf++;
  *dispbuf++=8;
  *dispbuf++=len;
  *dispbuf++=0xcc;
/*DATA content*/
  *dispbuf++=DATAFIELDNO;
  *dispbuf++=len;
  for(c=0;c<len;c++) *dispbuf++=*recbuf++;
  *dispbuf++=0xcc;

  displen+=len+9;
}

void procUDTdata(BYTE dfldno,BYTE ssn,BYTE is24bits)
{  BYTE c;
#if 1 //and by aiming
  BOOL bCDMAMSG=FALSE;
  BYTE *pTEMP=recbuf;
  //if(*pTEMP<=0X80)
  {
	  pTEMP++;
  }//else
  {
    // pTEMP+=2;
  }
  if((*pTEMP!=0x00)&&(*pTEMP!=0x61)&&(*pTEMP!=0x62)&&(*pTEMP!=0x63)&&(*pTEMP!=0x64)&&(*pTEMP!=0x65))
  {
    bCDMAMSG=TRUE;
  }
  if (bCDMAMSG)
  {
	  procUDTDATACDMADisp();  //CDMAMSG
  }else
#endif
	if(ssn==0x01 && SCCPSSN==0x01) procUDTDATADisp(dfldno,1); //SCMG
	else if (ssn==CAPTAG && SCCPSSN==CAPTAG)
		procUDTDATADisp(dfldno,5);  //CAP
	else if (ssn>0x05&&ssn<0x0b&&SCCPSSN>0x05&&SCCPSSN<0x0b)
		procUDTDATADisp(dfldno,6);  //MAP
	else if (ssn==0x0c||SCCPSSN==0x0c||ssn==0xf0||SCCPSSN==0xf0||ssn==0xf2||SCCPSSN==0xf2||ssn==0xf3||SCCPSSN==0xf3
		|| (is24bits==1 && (ssn==0xfe||SCCPSSN==0xfe)) )  //update by 2000.07.21 LHG
		procUDTDATADisp(dfldno,0x0c);  //INAP

	else if (ssn==0xfe||SCCPSSN==0xfe)//GSMA
	{//DATA length:8bits
	 *dispbuf++=dfldno;
	 *dispbuf++=1;
	 UDTlen=*dispbuf++=*recbuf++;
	 *dispbuf++=8;
	 *dispbuf++=UDTlen;
	 *dispbuf++=0xcc;
//DATA content
	 *dispbuf++=DATAFIELDNO;
	 *dispbuf++=UDTlen;
	 for(c=0;c<UDTlen;c++) *dispbuf++=*(recbuf+c);
	 *dispbuf++=0xcc;
	 displen +=UDTlen+9;

#if MultiTS
	 procGSMAdisp();
#endif
	}//GSMA

	else procUDTDATADisp(dfldno,0x0f);  //other
}


void procSCCPdisp(WORD slen)
{
  BYTE temp1,is24bits,code,dfldno;
  BYTE *bufbak,ssn;

//process SIO
  temp1 = *recbuf;    /*get SIO*/
  proc8bitsdisp(6);
  slen--;
//  if((Version&0x01)==0) return;
//process DPC/OPC/SLC
  temp1 &= 0xf0;       /*get SSF*/
  if (temp1==0xc0 && slen>5)     /*DPC/OPC is 14bits*/
	{procDPCOPCSLC14disp();
	 slen -= 4;
	 is24bits=0;
	}/*DPC/OPC is 14bits*/
  else if (temp1!=0xc0 && slen>8) /*DPC/OPC is 24bits*/
	{
/*process dpc:24bits*/
	 proc24bitsdisp(7);  /*display fld:7*/
/*process opc:24bits*/
	 proc24bitsdisp(8);  /*display fld:8*/
/*process slc:D3-D0,4bits*/
	 *dispbuf++ = 9;           /*display fld:9*/

⌨️ 快捷键说明

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