#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include "trans_isup.h"
TTransResult TransResult;
void get_isdn_number(unsigned char *msg, char *number)
{
unsigned char *num_ptr;
unsigned char number_info;
unsigned char even_odd;
int ie_length;
int num_length;
int has_st = 0;
int i,numleg;
ie_length = *msg;
number_info = *(msg+1);
num_ptr = msg+3;
numleg = ie_length-2;
//号码太短
if (ie_length<=2)
{
number[0] = 0;
return;
}
if ( number_info&0x80 )
even_odd = 1;
else
even_odd = 0;
num_length = (ie_length-2)*2;
numleg=ie_length-2;
// 号码太长,截掉
if (num_length>24)
{
num_length = 24;
}
if ((num_ptr[num_length/2-1]&0xF0) == 0xF0)
{
even_odd = 0;
has_st = 1;
}
if ((num_ptr[num_length/2-1]&0x0F) == 0x0F)
{
even_odd = 1;
has_st = 1;
}
if (even_odd == 0)
num_length -= has_st;
else
num_length -= (has_st+1);
for (i=0;i<num_length;i++)
{
if (i%2==0)
{
if ((num_ptr[i/2]&0xF)<=0x09)
number[i] = (num_ptr[i/2]&0x0F)+'0';
else
number[i] = (num_ptr[i/2]&0x0f)- 0xa + 'a';
}
else
{
if ( ((num_ptr[i/2]&0xF0)>>4)<=0x09)
number[i] = ((num_ptr[i/2]&0xF0)>>4)+'0';
else
number[i] = ((num_ptr[i/2]&0xF0)>>4) - 0xa + 'a';
}
}
number[i] = 0;
parse_Number(num_ptr,numleg,&TransResult);
return;
}
void get_Location_number(unsigned char *Location_ptr, char * called)
{
unsigned char *num_ptr;
unsigned char called_info;
unsigned char even_odd;
int Location_length;
int num_length;
int i;
int numleg;
Location_length = *Location_ptr;
called_info = *(Location_ptr+1);
num_ptr = Location_ptr+3;
numleg = Location_length-2;
if (Location_length<=1)
{
called[0] = 0;
return;
}
if ( called_info&0x80 )
even_odd = 1;
else
even_odd = 0;
num_length = (Location_length-2)*2;
numleg = Location_length-2;
if (even_odd == 1)
num_length -= 1;
if (num_length>10)
{
num_length = 10;
}
for (i=0;i<num_length;i++)
{
if (i%2==0)
{
if ((num_ptr[i/2]&0xF)<=0x09)
called[i] = (num_ptr[i/2]&0x0F)+'0';
else
called[i] = (num_ptr[i/2]&0x0f)- 0xa + 'a';
}
else
{
if ( ((num_ptr[i/2]&0xF0)>>4)<=0x09)
called[i] = ((num_ptr[i/2]&0xF0)>>4)+'0';
else
called[i] = ((num_ptr[i/2]&0xF0)>>4) - 0xa + 'a';
}
}
called[i] = 0;
parse_Number(num_ptr,numleg,&TransResult);
return;
}
void get_sam_number(unsigned char *sam_ptr, char * called)
{
unsigned char *num_ptr;
unsigned char called_info;
unsigned char even_odd;
int sam_length;
int num_length;
int i;
int numleg;
sam_length = *sam_ptr;
called_info = *(sam_ptr+1);
num_ptr = sam_ptr+3;
// SAM 号码太短
if (sam_length<=1)
{
called[0] = 0;
return;
}
if ( called_info&0x80 )
even_odd = 1;
else
even_odd = 0;
num_length = (sam_length-1)*2;
numleg = sam_length-1;
if (even_odd == 1)
num_length -= 1;
// SAM 号码太长
if (num_length>10)
{
num_length = 10;
}
for (i=0;i<num_length;i++)
{
if (i%2==0)
{
if ((num_ptr[i/2]&0xF)<=0x09)
called[i] = (num_ptr[i/2]&0x0F)+'0';
else
called[i] = (num_ptr[i/2]&0x0f)- 0xa + 'a';
}
else
{
if ( ((num_ptr[i/2]&0xF0)>>4)<=0x09)
called[i] = ((num_ptr[i/2]&0xF0)>>4)+'0';
else
called[i] = ((num_ptr[i/2]&0xF0)>>4) - 0xa + 'a';
}
}
called[i] = 0;
parse_Number(num_ptr,numleg,&TransResult);
return;
}
void parse_msg_name(_U8 msg_type,TTransResult *pResult)
{
_U8 ie_num;
ie_num = pResult->ie_num;
switch(msg_type)
{
case IAM:
strcpy(pResult->ie[ie_num].ie_str,"0000 0001 [消息类型]:初始地址\r\n");
break;
case ACM:
strcpy(pResult->ie[ie_num].ie_str,"0000 0110 [消息类型]:号码全\r\n");
break;
case ANM:
strcpy(pResult->ie[ie_num].ie_str,"0000 1001 [消息类型]: 应答\r\n");
break;
case CON:
strcpy(pResult->ie[ie_num].ie_str,"0000 0111 [消息类型]: 连接\r\n");
break;
case REL:
strcpy(pResult->ie[ie_num].ie_str,"0000 1100 [消息类型]: 释放\r\n");
break;
case CPG:
strcpy(pResult->ie[ie_num].ie_str,"0010 1100 [消息类型]: 呼叫进展\r\n");
break;
case INF:
strcpy(pResult->ie[ie_num].ie_str,"0000 0100 [消息类型]: 信息\r\n");
break;
case SAM:
strcpy(pResult->ie[ie_num].ie_str,"0000 0010 [消息类型]: 后续地址\r\n");
break;
case INR:
strcpy(pResult->ie[ie_num].ie_str,"0000 0011 [消息类型]: 信息请求\r\n");
break;
case CFN:
strcpy(pResult->ie[ie_num].ie_str,"0010 1111 [消息类型]: 混乱\r\n");
break;
case RLC:
strcpy(pResult->ie[ie_num].ie_str,"0001 0000 [消息类型]: 释放完成\r\n");
break;
case SUS:
strcpy(pResult->ie[ie_num].ie_str,"0000 1101 [消息类型]: 暂停\r\n");
break;
default:
break;
}
strcat(pResult->ie[ie_num].ie_str,"\r\n");
pResult->ie_num++;
}
void parse_sam_number(_U8 *sam_num_ie, TTransResult *pResult)
{
_U8 ie_num;
char called_number[24];
char tmp_str[100];
ie_num = pResult->ie_num;
strcpy(pResult->ie[ie_num].ie_str,"0000 0010 [消息类型]:后续地址\r\n");
strcat(pResult->ie[ie_num].ie_str," ====[参数名]:后续号码====\r\n");
//parse_Parameter_length(*sam_num_ie,&TransResult);
switch ((*(sam_num_ie+1)&0x80)>>7)
{
case 0x00:
sprintf(tmp_str,"0。。。 。。。。 奇偶表示语:地址信号为偶数\r\n");
break;
case 0x01:
sprintf(tmp_str,"1。。。 。。。。 奇偶表示语:地址信号为奇数\r\n");
break;