📄 cdmasms.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include "cdmasms.h"
#include "utility.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Form1->Visible = false;
Form1->SMSMemo->Lines->Clear();
if(creat_code_table("GB2312.txt") == -1)
{
ShowMessage("创建GB2312.txt失败");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TestButton1Click(TObject *Sender)
{
void* pInputMsg; //输入消息声明
SMSElementDef output_sms; //输出结构声明
//初始化
output_sms.timer.year = 0xff;
output_sms.OriAddr[0] = 0xff;
output_sms.DestAddr[0] = 0xff;
output_sms.callbackNumber[0] = 0xff;
output_sms.data[0] = 0xff;
output_sms.Res_code=0;
output_sms.Msg_type=0;
output_sms.Val_per_A_len=0;
output_sms.Val_per_A.year=0xff;
output_sms.Have_Val_per_R=0;
output_sms.Def_del_time_A_len=0;
output_sms.Def_del_time_A.year=0xff;
output_sms.Have_Def_del_time_R=0;
output_sms.Have_Priority_Indicator=0;
output_sms.Have_Privacy_Indicator=0;
output_sms.Have_Reply_Option=0;
output_sms.Have_Num_Of_Msgs=0;
output_sms.Have_Alert_on_msg=0;
output_sms.Have_Lan_Indicator=0;
output_sms.Have_Msg_disp_mode=0;
output_sms.Mul_data[0]=0xff;
output_sms.Mul_data_Len=0;
output_sms.Have_Ser_cate=0;
output_sms.Have_Bearer_reply=0;
output_sms.Have_Cause_codes=0;
/*************************************************************/
/******************** 测试代码 ****************************/
struct L3_SMSDef l3_smsContent;
/* char buffer[259] = {0x01,0x03,0x01,0x29,
0x00,0x00,0x02,0x10,0x02,
0x04,0x07,0x02,0xc4,0xea,
0x9d,0xa8,0x8d,0xa8,0x06,
0x01,0x04,0x08,0x16,0x00,
0x03,0x20,0x04,0x30,0x01,
0x06,0x10,0x2b,0x26,0x4c,
0x99,0x32,0x08,0x01,0x80,
0x0a,0x01,0x40,0x0d,0x01,
0x01};*/
/*
00000000
00000000
00000010
00010000
00000010
00000100
00000111
00000010
11000100
11101010
10011101
10101000
10001101
10101000
00000110
00000001
00000100
00001000
00010110
00000000
00000011
00100000
00000100
00110000
00000001
00000110
00010000
00101011
00100110
01001100
10011001
00110010
00001000
00000001
10000000
00001010
00000001
01000000
00001101
00000001
00000001
*/
/* char buffer[259] = {0x01,0x03,0x01,52,
0x00,0x00,0x02,0x10,0x02,
0x02,0x07,0x02,0xc4,0xc0,
0x1d,0x80,0x8d,0x80,0x06,
0x01,0x00,0x08,0x21,0x00,
0x03,0x10,0x00,0x00,0x01,
0x06,0x20,0x13,0x60,0x8b,
0x60,0x88,0x03,0x06,0x04,
0x03,0x16,0x22,0x12,0x30,
0x08,0x01,0x00,0x0e,0x07,
0x05,0x89,0xd5,0x3b,0x51,
0x1b,0x50}; */
/*
00000000 0
00000000 1
00000010 2
00010000 3
00000010 4
00000010 5
00000111 6
00000010 7
11000100 8
11000000 9
00011101 10
10000000 11
10001101 12
10000000 13
00000110 14
00000001 15
00000000 16
00001000 17
00100001 18
00000000 19
00000011 20
00010000 21
00000000 22
00000000 23
00000001 24
00000110 25
00100000 26
00010011 27
01100000 28
10001011 29
01100000 30
10001000 31
00000011 32
00000110 33
00000100 34
00000011 35
00010110 36
00100010 37
00010010 38
00110000 39
00001000 40
00000001 41
00000000 42
00001110 43
00000111 44
00000101 45
10001001 46
11010101 47
00111011 48
01010001 49
00011011 50
01010000 51
*/
char buffer[259] = {0x01,0x03,0x01,52,
0x00,
0x00,0x02,0x10,0x02,
0x01,0x02,0x00,0x08,
0x02,0x07,0x02,0xc4,0xc0,0x1d,0x80,0x8d,0x80,
0x06,0x01,0x00,
0x07,0x02,0x03,0x03,
0x08,0x4e, //BD头字段
0x00,0x03,0x10,0x00,0x00,
0x01,0x06,0x20,0x13,0x60,
0x8b,0x60,0x88,0x03,0x06,
0x04,0x03,0x16,0x22,0x12,
0x30,0x08,0x01,0x00,0x0e,
0x07,0x05,0x89,0xd5,0x3b,
0x51,0x1b,0x50,
0x02,0x01,0x01,0x04,0x06,
0x04,0x04,0x04,0x04,0x04,
0x04,0x05,0x01,0x05,0x06,
0x06,0x06,0x06,0x06,0x06,
0x06,0x06,0x07,0x01,0xc6,
0x09,0x01,0xc0,0x0a,0x01,
0xc0,0x0b,0x01,0x12,0x0c,
0x01,0x80,0x0d,0x01,0x01,
0x0f,0x01,0x80};
//显示SMS的处理,SMS存储在文件sms中
l3_smsContent.smsHeader.burst_Type = buffer[1];
l3_smsContent.smsHeader.msg_Number = buffer[0];
l3_smsContent.smsHeader.num_Msgs = buffer[2];
l3_smsContent.smsHeader.num_Fields = buffer[3];
memcpy(l3_smsContent.l3_data,&buffer[4],255);
pInputMsg = (void*)&l3_smsContent;
Form1->cdmasmsDec(pInputMsg,output_sms);
output_sms.data[0] = 0x40;
output_sms.data[1] = 0xa1;
return;
}
//---------------------------------------------------------------------------
void TForm1::cdmasmsDec(void* pInputMsg, SMSElementDef& output_sms)
{
//输入pInputMsg是结构为L3_SMSDef形式的消息
pDealMsg = (L3_SMSDef*)pInputMsg;
char burst_Type; //突发消息类型
char num_Datas; //突发消息包括char的数目
char smsmsg_Type;
/*SMS data相关域的定义*/
char paraID;
char paraLength;
char paraData[200];
char numChar_DataField = 0; //作为判断是否char域结束的标志
int i; //当前字节位置
burst_Type = pDealMsg->smsHeader.burst_Type;
/*如果消息类型不是SMS,则丢弃消息,并退出*/
if((burst_Type!=SHORT_MESSAGE_SERVICES)
&&(pDealMsg->smsHeader.msg_Number != 1)
&&(pDealMsg->smsHeader.num_Msgs != 1)
&&(pDealMsg->smsHeader.num_Fields <= 0))
{
ShowMessage("DBM 包不正确!");
delete pInputMsg;
return;
}
//有效char数目
num_Datas = pDealMsg->smsHeader.num_Fields;
smsmsg_Type = pDealMsg->l3_data[0];
numChar_DataField = 1; //SMS类型占1 byte
/*判断SMS消息类型,若不是点到点的SMS,则丢弃消息,并退出*/
if(smsmsg_Type!=SMS_POINT_TO_POINT)
{
ShowMessage("不是点到点的SMS");
delete pInputMsg;
return;
}
while(numChar_DataField<num_Datas)
{
paraID = pDealMsg->l3_data[numChar_DataField];
numChar_DataField++;
paraLength = pDealMsg->l3_data[numChar_DataField];
numChar_DataField++;
//电信服务标志字段的分析
if(paraID == Teleservice_Identifier)
{
CDMASMS_Tel_Ser_Dec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//服务策略字段的分析
if(paraID == Service_Category)
{
CDMASMS_Ser_Cate_Dec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//源/目地址参数的分析 //54页
if((paraID == Originating_Address)||(paraID == Destination_Address))
{
CDMASMSAddrDec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//源/目子地址参数的分析
if((paraID == Originating_Subaddress)||(paraID == Destination_Subaddress))
{
CDMASMSSUB_AddrDec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//传送应答选项字段的分析
if(paraID == Bearer_Reply_Option)
{
CDMASMSBear_Reply_Dec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//字段的分析
if(paraID == Cause_Codes)
{
CDMASMSCausel_Codes_Dec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
if(paraID == Bearer_Data) //61页
{
CDMASMSBearDataDec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//更新 numChar_DataField 参数
numChar_DataField = numChar_DataField+paraLength;
}
SMSDisplay(output_sms);
delete pInputMsg;
ShowMessage("SMS分析结束,退出");
return;
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :源/目地址起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:源/目地址参数长度
输出参数:output_sms结构的源地址域
功能:解析出地址
*********************************************************/
void TForm1::CDMASMS_Tel_Ser_Dec(L3_SMSDef* pMsg,int charAddr,int length,SMSElementDef& out_sms)
{
out_sms.Tel_ser= (((unsigned short)(pMsg->l3_data[charAddr])<<8)&0xff00)+((unsigned short)(pMsg->l3_data[charAddr+1])&0x00ff);
return;
}
//---------------------------------------------------------------------------
/*********************************************************
函数说明:
输入参数:pMsg:层三DBM消息
charAddr :源/目地址起始位置对应l3_data[]的下标(参数开始位置,不包括ID和长度)
length:源/目地址参数长度
输出参数:output_sms结构的源地址域
功能:解析出地址
*********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -