📄 preprocmsg.cpp
字号:
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 + -