📄 cdmasms.cpp
字号:
void TForm1::CDMASMS_Ser_Cate_Dec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
out_sms.Ser_cate= (((unsigned short)(pMsg->l3_data[charAddr])<<8)&0xff00)+((unsigned short)(pMsg->l3_data[charAddr+1])&0x00ff);
out_sms.Have_Ser_cate=1;
return;
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :源/目地址起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:源/目地址参数长度
输出参数:output_sms结构的源地址域
功能:解析出地址
*********************************************************/
void TForm1::CDMASMSAddrDec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
char paraID = pMsg->l3_data[charAddr-2]; //判断是源地址还是目的地址
char digit_mode;
char number_mode;
char number_type;
char number_plan;
char number_field;
char field[20];
bool field_flag = false;
int i;
char bitCount = 0; //bit数
/*digit_mode:0 代表二进制DTMF数字 1 代表8 bit字符串*/
digit_mode = (pMsg->l3_data[charAddr]>>7)&0x00000001;
/*number_mode 0 代表地址使用ANSI T1.607 的定义 1 代表使用网络地址形式*/
number_mode = (pMsg->l3_data[charAddr]>>3)&0x00000111;
bitCount = +2;
//分析number_type域
/* digit_mode=0时number_type字段忽略 */
if(digit_mode == 1)
{
number_type = (pMsg->l3_data[charAddr]>>5)&0x00000001;
bitCount = bitCount+3;
}
//分析 number_plan 字段
/*digit_mode=1 number_mode=0该域的处理(4比特);*/
/*digit_mode=0 或 number_mode=1该域被忽略*/
if((digit_mode==1)&&(number_mode==0))
{
bitCount = bitCount+4;
}
//分析 number_field字段 (8bit)
/*copy 8bit */
uint32 copyLength = 8;
BitCopyFromBitStream((byte*)(pMsg->l3_data),(uint32)(charAddr*8+bitCount),(byte)number_field,copyLength);
if(number_field==0)
{
ShowMessage("地址字段分析结束");
return;
}
// number_field字段不为空的处理
bitCount = bitCount+8;
if(digit_mode ==0 )
{
field_flag = true;
for(i=0;i<number_field;i++)
{
BitCopyFromBitStream((byte*)(pMsg->l3_data),(uint32)(charAddr*8+bitCount),(byte)field[i],4);
bitCount = bitCount+4;
}
}
if((paraID == Originating_Address)&&(field_flag==true)) //源地址
{
out_sms.OriAddrLen = number_field;
for(i=0;i<number_field;i++)
{
switch(field[i])
{
case 0:
out_sms.OriAddr[i] = 0;
break;
case 1 :
out_sms.OriAddr[i] = 1;
break;
case 2 :
out_sms.OriAddr[i] = 2;
break;
case 3 :
out_sms.OriAddr[i] = 3;
break;
case 4 :
out_sms.OriAddr[i] = 4;
break;
case 5 :
out_sms.OriAddr[i] = 5;
break;
case 6 :
out_sms.OriAddr[i] = 6;
break;
case 7 :
out_sms.OriAddr[i] = 7;
break;
case 8 :
out_sms.OriAddr[i] = 8;
break;
case 9 :
out_sms.OriAddr[i] = 9;
break;
case 10 :
out_sms.OriAddr[i] = 0;
break;
case 11 :
out_sms.OriAddr[i] = '*';
break;
case 12 :
out_sms.OriAddr[i] = '#';
break;
}
}
}
if(paraID == Destination_Address) //目的地址
{
out_sms.DesAddrLen = number_field;
for(i=0;i<number_field;i++)
{
switch(field[i])
{
case 0:
out_sms.OriAddr[i] = 0;
break;
case 1 :
out_sms.DestAddr[i] = 1;
break;
case 2 :
out_sms.DestAddr[i] = 2;
break;
case 3 :
out_sms.DestAddr[i] = 3;
break;
case 4 :
out_sms.DestAddr[i] = 4;
break;
case 5 :
out_sms.DestAddr[i] = 5;
break;
case 6 :
out_sms.DestAddr[i] = 6;
break;
case 7 :
out_sms.DestAddr[i] = 7;
break;
case 8 :
out_sms.DestAddr[i] = 8;
break;
case 9 :
out_sms.DestAddr[i] = 9;
break;
case 10 :
out_sms.DestAddr[i] = 0;
break;
case 11 :
out_sms.DestAddr[i] = '*';
break;
case 12 :
out_sms.DestAddr[i] = '#';
break;
}
}
}
return;
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :BearData起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:参数长度
输出参数:output_sms结构
功能:解析出SMS
*********************************************************/
void TForm1::CDMASMSSUB_AddrDec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :BearData起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:参数长度
输出参数:output_sms结构
功能:解析出SMS
*********************************************************/
void TForm1::CDMASMSBear_Reply_Dec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
out_sms.Bearer_reply= (pMsg->l3_data[charAddr]>>2)&0x3f;
out_sms.Have_Bearer_reply=1;
return;
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :BearData起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:参数长度
输出参数:output_sms结构
功能:解析出SMS
*********************************************************/
void TForm1::CDMASMSCausel_Codes_Dec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
char currCharAddr = charAddr;
out_sms.Error_class=pMsg->l3_data[currCharAddr]&0x3;
if(out_sms.Error_class!=0)
out_sms.Cause_codes=pMsg->l3_data[currCharAddr+1];
out_sms.Have_Cause_codes=1;
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :BearData起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:参数长度
输出参数:output_sms结构
功能:解析出SMS
*********************************************************/
void TForm1::CDMASMSBearDataDec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
int i;
char subParaID;
char subParaLength;
char currCharAddr = charAddr; //当前处理字节位置
while((currCharAddr-charAddr)<length)
{
subParaID = pMsg->l3_data[currCharAddr];
currCharAddr++;
subParaLength = pMsg->l3_data[currCharAddr];
currCharAddr++;
/*消息类型字段的处理*/
if(subParaID == MESSAGE_IDENTIFIER)
{
MsgID_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*用户数据字段的处理*/
if(subParaID == USER_DATA)
{
UserData_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*用户反应码字段的处理*/
if(subParaID == USER_RESPONSE_CODE)
{
User_RC_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*时间字段的处理*/
if(subParaID == MESSAGE_CENTER_TIME_STAMP)
{
Timer_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*绝对有效期字段的处理*/
if(subParaID == VALIDITY_PERIOD_ABSOLUTE)
{
Val_per_A_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*相对有效期字段的处理*/
if(subParaID == VALIDITY_PERIOD_RELATIVE)
{
Val_per_R_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*绝对延迟发送时间字段的处理*/
if(subParaID == DEFERRED_DELIVERY_TIME_ABSOLUTE)
{
Def_del__time_A_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*相对延迟发送时间字段的处理*/
if(subParaID == DEFERRED_DELIVERY_TIME_RELATIVE)
{
Def_del__time_R_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*优先级标志字段的处理*/
if(subParaID == PRIORITY_INDICATOR)
{
Priority_Indicator_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*密级标志字段的处理*/
if(subParaID == PRIVACY_INDICATOR)
{
Privacy_Indicator_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*应答选项字段的处理*/
if(subParaID == REPLY_OPTION)
{
Reply_Option_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*消息数量字段的处理*/
if(subParaID == NUMBER_OF_MESSAGE)
{
Num_Of_Msgs_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*传输提醒字段的处理*/
if(subParaID == ALERT_ON_MESSAGE_DELIVERY)
{
Alert_On_Msgs_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*语言标志字段的处理*/
if(subParaID == LANGUAGE_INDICATOR)
{
Lan_Indicator_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*回叫号码的处理*/
if(subParaID == CALLBACK_NUMBER)
{
CallbackNumber_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*显示模式字段的处理*/
if(subParaID == MESSAGE_DISPLAY_MODE)
{
Msg_Disp_Mode_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
/*多编码用户数据字段的处理*/
if(subParaID == MULTIPLE_ENCODING_USER_DATA)
{
Mul_Encoding_UD_CDMASMSDec(pMsg,currCharAddr,subParaLength,out_sms);
}
currCharAddr = currCharAddr+ subParaLength;
}
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :UserData起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:参数长度
输出参数:output_sms结构
功能:解析出SMS
*********************************************************/
void TForm1::MsgID_CDMASMSDec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
char msg_type=0;
msg_type=(pMsg->l3_data[charAddr]>>4)&0xf;
out_sms.Msg_type=msg_type;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -