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