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

📄 svgsmadisp.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		*dispbuf++=(*recbuf>>4)|(*recbuf<<4);
		recbuf++;
		*dispbuf++=0xcc;
//小区识别之LAC
		*dispbuf++=dfldno+5;
		*dispbuf++=2;
		*(WORD *)dispbuf=*(WORD *)recbuf;
		recbuf+=2;
		dispbuf+=2;
		*dispbuf++=0xcc;

		displen+=15;
		li-=5;
	   }
	   break;


	  case 5:
//小区识别之LAC
	   while(li>=2)//update 2000.07.24 by LHG
	   {*dispbuf++=dfldno+5;
		*dispbuf++=2;
		*(WORD *)dispbuf=*(WORD *)recbuf;
		recbuf+=2;
		dispbuf+=2;
		*dispbuf++=0xcc;

		displen+=5;
		li-=2;
	   }
	   break;

	 default:break;
	 }//switch
}


void procselectchannel(u8 dfldno) //选择的信道
{
//单元识别
	*dispbuf++=dfldno;
	*dispbuf++=1;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//“信道”(1字节:D3-D0)
	*dispbuf++=dfldno+1;
	*dispbuf++=0;
	*dispbuf++=4;
	*dispbuf++=(*recbuf++)<<4;
	*dispbuf++=0xcc;

	displen+=9;
}


void procPaswdInfo(BYTE dfldno) //加密信息
{ BYTE li,i;
//单元识别
	*dispbuf++=dfldno;
	*dispbuf++=1;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//“加密信息”长度
	*dispbuf++=dfldno+1;
	*dispbuf++=1;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//允许的算法(1字节)
	*dispbuf++=dfldno+2;
	*dispbuf++=1;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	displen+=12;

//update by 2000.10.30 by LHG
//密钥
	if(li>1)
	{	li--;
		*dispbuf++=dfldno+3;
		*dispbuf++=li;
		for(i=0;i<li;i++) *dispbuf++=*recbuf++;
		*dispbuf++=0xcc;
		displen+=li+3;
	}
}

void procGSMAdisp()
{
	if((*recbuf&0x01)==0)//BSSMAP
	{
	 *dispbuf++=0x01;  //鉴别参数
	 *dispbuf++=1;
	 *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 *dispbuf++=0x03;  //长度指示
	 *dispbuf++=1;
	 *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 displen+=8;

	 procBSSMAPdisp();
	}//BSSMAP
	else//DTAP
	{
	 *dispbuf++=0x01;  //鉴别参数
	 *dispbuf++=1;
	 *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 *dispbuf++=0x02;  //DLCI
	 *dispbuf++=1;
	 *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 *dispbuf++=0x03;  //长度指示
	 *dispbuf++=1;
	 *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 displen+=12;

	 procDTAPdisp();
	}//DTAP
}


void procPDandSI(u8 dfldno)
{
	*dispbuf++=dfldno;
	*dispbuf++=0;
	*dispbuf++=4;
	*dispbuf++=(*recbuf)<<4;
	*dispbuf++=0xcc;
	*dispbuf++=dfldno+1;
	*dispbuf++=0;
	*dispbuf++=4;
	*dispbuf++=(*recbuf++)&0xf0;
	*dispbuf++=0xcc;

	displen+=10;
}

void procChanDescription(u8 dfldno)
{
	*dispbuf++=dfldno; //Channel type and TDMA offset
	*dispbuf++=0;
	*dispbuf++=5;
	*dispbuf++=(*recbuf)&0xf8;
	*dispbuf++=0xcc;
	*dispbuf++=dfldno+1;//TN
	*dispbuf++=0;
	*dispbuf++=3;
	*dispbuf++=(*recbuf++)<<5;
	*dispbuf++=0xcc;

	*dispbuf++=dfldno+2; //TSC
	*dispbuf++=0;
	*dispbuf++=3;
	*dispbuf++=(*recbuf)&0xe0;
	*dispbuf++=0xcc;
	if((*recbuf&0x10)==0x10)
	{*dispbuf++=dfldno+2; //MAIO
	 *dispbuf++=0;
	 *dispbuf++=6;
	 *dispbuf++=((*recbuf)<<4)|((*(recbuf+1))>>4);
	 *dispbuf++=0xcc;
	 *dispbuf++=dfldno+3; //HSN
	 *dispbuf++=0;
	 *dispbuf++=6;
	 *dispbuf++=(*(recbuf+1))<<2;
	 *dispbuf++=0xcc;
	 displen+=25;
	 recbuf+=2;
	}
	else
	{*dispbuf++=dfldno+2; //MAIO
	 *dispbuf++=0;
	 *dispbuf++=10;
	 *(unsigned short *)dispbuf=(*(unsigned short *)recbuf)<<6;
	 dispbuf+=2;
	 *dispbuf++=0xcc;
	 displen+=21;
	 recbuf+=2;
	}
}


void procMSID(u8 dfldno) //移动标识
{  u8 li,code,i;

	li=*recbuf;
	bytedisp(dfldno)  //li
	*dispbuf++=dfldno+1;//标识类型
	*dispbuf++=0;
	*dispbuf++=3;
	code=*recbuf&0x07;
	*dispbuf++=code<<5;
	*dispbuf++=0xcc;
	displen+=5;

	if(code==4) //TMSI
	{*dispbuf++=dfldno+2;//移动标识
	 *dispbuf++=4;
	 *dispbuf++=*(recbuf+1);
	 *dispbuf++=*(recbuf+2);
	 *dispbuf++=*(recbuf+3);
	 *dispbuf++=*(recbuf+4);
	 *dispbuf++=0xcc;
	 displen+=7;
	 recbuf+=li;
	}//TMSI
	else if(code==1||code==2||code==3)
	{code=li;
	 li*=8;
	 if((*recbuf&0x08)==0) li-=8;
	 else li-=4;

	 *dispbuf++=dfldno+2;//移动标识
	 *dispbuf++=0;
	 *dispbuf++=li;
	 for(i=0;i<(li+8)/8;i++) *dispbuf++=(*(recbuf+i)&0xf0)|(*(recbuf+i+1)&0x0f);
	 *dispbuf++=0xcc;
	 recbuf+=code;
	 displen+=(li+8)/8+4;
	}
	else recbuf+=li;
}

void procTMSI(u8 dfldno)
{
	*dispbuf++=dfldno; //Lower ARFCN
	*dispbuf++=4;
	*dispbuf++=*recbuf++;
	*dispbuf++=*recbuf++;
	*dispbuf++=*recbuf++;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	displen+=7;
}


void procFCSeq(u8 dfldno)//频率信道序列
{ u8 i;
		*dispbuf++=dfldno; //Lower ARFCN
		*dispbuf++=0;
		*dispbuf++=6;
		*dispbuf++=(*recbuf)<<2;
		*dispbuf++=0xcc;
		recbuf++;
		*dispbuf++=dfldno+1; //inc skip of ARFCN
		*dispbuf++=8;
		for(i=0;i<8;i++) *dispbuf++=*(recbuf+i);
		*dispbuf++=0xcc;
		displen+=16;
}


//update by 2000.09.25,LHG
void procLAI(BYTE dfldno)
{
	*dispbuf++=dfldno; //MCC
	*dispbuf++=0;
	*dispbuf++=12;
	*dispbuf++=(((*recbuf)&0x0f)<<4)|(((*recbuf)&0xf0)>>4);
	*dispbuf++=(*(recbuf+1)&0x0f)<<4;
	recbuf+=2;
	*dispbuf++=0xcc;

	*dispbuf++=dfldno+1; //MNC
	*dispbuf++=1;
	*dispbuf++=((*recbuf&0x0f)<<4)|((*recbuf&0xf0)>>4);
	recbuf++;
	*dispbuf++=0xcc;

	*dispbuf++=dfldno+2; //LAC
	*dispbuf++=2;
	*dispbuf++=*recbuf++;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	displen+=15;
}


void procReqRef(u8 dfldno)
{
	*dispbuf++=dfldno; //RA
	*dispbuf++=1;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;

	*dispbuf++=dfldno+1; //T1'
	*dispbuf++=0;
	*dispbuf++=5;
	*dispbuf++=*recbuf&0xf8;
	*dispbuf++=0xcc;

	*dispbuf++=dfldno+2; //T3
	*dispbuf++=0;
	*dispbuf++=6;
	*dispbuf++=(*recbuf<<5)|(*(recbuf+1)>>3);
	*dispbuf++=0xcc;
	recbuf++;

	*dispbuf++=dfldno+4; //T2
	*dispbuf++=0;
	*dispbuf++=5;
	*dispbuf++=*recbuf<<3;
	*dispbuf++=0xcc;
	recbuf++;
	displen+=19;
}


void procDTAPCCCause(u8 dfldno)
{  u8 i,li;

	li=*recbuf;
	bytedisp(dfldno)  //LI
	*dispbuf++=dfldno+1;//location
	*dispbuf++=0;
	*dispbuf++=4;
	*dispbuf++=*recbuf<<4;
	*dispbuf++=0xcc;
	*dispbuf++=dfldno+2;//coding standard
	*dispbuf++=0;
	*dispbuf++=2;
	*dispbuf++=*recbuf<<1;
	*dispbuf++=0xcc;
	displen+=10;
	li--;
	if((*recbuf&0x60)==0x60)//exist recommendation
	{*dispbuf++=dfldno+3;//recommendation
	 *dispbuf++=0;
	 *dispbuf++=7;
	 *dispbuf++=*recbuf<<1;
	 *dispbuf++=0xcc;
	 displen+=5;
	 li--;
	}//exist recommendation
	if(li>0)
	{*dispbuf++=dfldno+4;//cause value
	 *dispbuf++=0;
	 *dispbuf++=7;
	 *dispbuf++=*recbuf<<1;
	 *dispbuf++=0xcc;
	 displen+=5;
	 li--;
	}
	if(li>0)//diagnostic
	{*dispbuf++=dfldno+5;//cause value
	 *dispbuf++=li;
	 for(i=0;i<li;i++) *dispbuf++=*recbuf++;
	 *dispbuf++=0xcc;
	 displen+=li+3;
	}//diagnostic
}

void procPROGRESSIN(u8 dfldno)
{
	  *dispbuf++=dfldno;//location
	  *dispbuf++=0;
	  *dispbuf++=4;
	  *dispbuf++=*recbuf<<4;
	  *dispbuf++=0xcc;
	  *dispbuf++=dfldno+1;//coding standard
	  *dispbuf++=0;
	  *dispbuf++=2;
	  *dispbuf++=*recbuf<<1;
	  *dispbuf++=0xcc;
	  recbuf++;
	  *dispbuf++=dfldno+2;//Progress description
	  *dispbuf++=0;
	  *dispbuf++=7;
	  *dispbuf++=*recbuf<<1;
	  *dispbuf++=0xcc;
	  recbuf++;
	  displen+=15;
}

void procHighLayerComp(u8 dfldno)
{  u8 li;

	li=*recbuf;
	bytedisp(dfldno)  //LI
	*dispbuf++=dfldno+1;  //编码标准
	*dispbuf++=0;
	*dispbuf++=2;
	*dispbuf++=*recbuf<<1;
	*dispbuf++=0xcc;
	*dispbuf++=dfldno+2;  //解释
	*dispbuf++=0;
	*dispbuf++=3;
	*dispbuf++=*recbuf<<3;
	*dispbuf++=0xcc;
	*dispbuf++=dfldno+3;  //协议记录的表示方法
	*dispbuf++=0;
	*dispbuf++=2;
	*dispbuf++=*recbuf<<6;
	*dispbuf++=0xcc;
	recbuf++;
	displen+=15;
	if((*recbuf&0x80)==0)  //exist 扩展的高层特性标识
	{*dispbuf++=dfldno+4;  //高层特性标识
	 *dispbuf++=0;
	 *dispbuf++=7;
	 *dispbuf++=*recbuf<<1;
	 *dispbuf++=0xcc;
	 recbuf++;
	 *dispbuf++=dfldno+5;  //扩展的高层特性标识
	 *dispbuf++=0;
	 *dispbuf++=7;
	 *dispbuf++=*recbuf<<1;
	 *dispbuf++=0xcc;
	 recbuf++;
	 displen+=10;
	}//exist 扩展的高层特性标识
	else
	{*dispbuf++=dfldno+4;  //高层特性标识
	 *dispbuf++=0;
	 *dispbuf++=7;
	 *dispbuf++=*recbuf<<1;
	 *dispbuf++=0xcc;
	 recbuf++;
	 displen+=5;
	}
}

void procUSERtoUSER(u8 dfldno)
{u8 i,li;
	li=*recbuf;
	bytedisp(dfldno)  //LI
	bytedisp(dfldno+1)  //User-user protocol discriminator
	*dispbuf++=dfldno+2;//User-user information
	*dispbuf++=li;
	for(i=0;i<li;i++) *dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	displen+=li+3;
}


void procDTAPsubaddr(u8 dfldno)
{  u8 li,i,oddeven;

	li=*recbuf;
	bytedisp(dfldno);  //主叫子地址 li
	oddeven=*recbuf&0x08;
	bytedisp(dfldno+1)  //type of subaddr and odd/even indicator
	li--;
	if(oddeven==0)//even
	{*dispbuf++=dfldno+2;  //subaddr information
	 *dispbuf++=0;
	 *dispbuf++=li*8;
	 for(i=0;i<li;i++)
	 {*dispbuf++=(*recbuf>>4)|(*recbuf<<4);recbuf++;}
	 *dispbuf++=0xcc;
	 displen+=li+3;
	}//even
	else//odd
	{*dispbuf++=dfldno+2; //subaddr information
	 *dispbuf++=0;
	 *dispbuf++=li*8-4;
	 for(i=0;i<li;i++)
	 {*dispbuf++=(*recbuf>>4)|(*recbuf<<4);recbuf++;}
	 *dispbuf++=0xcc;
	 displen+=li+3;
	}//odd
}

void procDTAPcalledNO(u8 dfldno)
{ u8 i,li;

	li=*recbuf;  //get LI
	bytedisp(dfldno)  //主叫号码 li
	*dispbuf++=dfldno+1; //Number plan identification
	*dispbuf++=0;
	*dispbuf++=4;
	*dispbuf++=*recbuf<<4;
	*dispbuf++=0xcc;
	*dispbuf++=dfldno+2; //type of Number
	*dispbuf++=0;
	*dispbuf++=3;
	*dispbuf++=*recbuf<<1;
	*dispbuf++=0xcc;
	displen+=10;
	recbuf++; li--;
	if((*(recbuf+li-1)&0xf0)==0xf0)  //odd
	{*dispbuf++=dfldno+3;  //被叫号码 Number digit
	 *dispbuf++=0;
	 *dispbuf++=li*8-4;
	 for(i=0;i<li;i++) 
	 {*dispbuf++=(*recbuf>>4)|(*recbuf<<4);recbuf++;}
	  *dispbuf++=0xcc;
	  displen+=li+3;
	 }//odd
	else //even
	{*dispbuf++=dfldno+3;  //被叫号码 Number digit
	 *dispbuf++=0;
	 *dispbuf++=li*8;
	 for(i=0;i<li;i++) 
	 {*dispbuf++=(*recbuf>>4)|(*recbuf<<4);recbuf++;}
	 *dispbuf++=0xcc;
	 displen+=li+3;
	}//even
}


void procDTAPdisp()
{  unsigned char i,mt,oddeven,li;

	if((*recbuf&0x0f)==0x03) //call control message
	{procPDandSI(4);//协议鉴别器&事务标识
	 mt=*recbuf;
	 bytedisp(6)

	 switch(mt)
	 {
		 case 0x01://Alerting(network to MS)
			 if((*recbuf&0x7f)==0x1c) procVARInfoUnit(0x07);//Facility
			 if((*recbuf&0x7f)==0x1e)//Progress indicator

⌨️ 快捷键说明

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