?? 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("創(chuàng)建GB2312.txt失敗");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TestButton1Click(TObject *Sender)
{
void* pInputMsg; //輸入消息聲明
SMSElementDef output_sms; //輸出結(jié)構(gòu)聲明
//初始化
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存儲(chǔ)在文件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是結(jié)構(gòu)為L3_SMSDef形式的消息
pDealMsg = (L3_SMSDef*)pInputMsg;
char burst_Type; //突發(fā)消息類型
char num_Datas; //突發(fā)消息包括char的數(shù)目
char smsmsg_Type;
/*SMS data相關(guān)域的定義*/
char paraID;
char paraLength;
char paraData[200];
char numChar_DataField = 0; //作為判斷是否char域結(jié)束的標(biāo)志
int i; //當(dāng)前字節(jié)位置
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數(shù)目
num_Datas = pDealMsg->smsHeader.num_Fields;
smsmsg_Type = pDealMsg->l3_data[0];
numChar_DataField = 1; //SMS類型占1 byte
/*判斷SMS消息類型,若不是點(diǎn)到點(diǎn)的SMS,則丟棄消息,并退出*/
if(smsmsg_Type!=SMS_POINT_TO_POINT)
{
ShowMessage("不是點(diǎn)到點(diǎn)的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++;
//電信服務(wù)標(biāo)志字段的分析
if(paraID == Teleservice_Identifier)
{
CDMASMS_Tel_Ser_Dec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//服務(wù)策略字段的分析
if(paraID == Service_Category)
{
CDMASMS_Ser_Cate_Dec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//源/目地址參數(shù)的分析 //54頁
if((paraID == Originating_Address)||(paraID == Destination_Address))
{
CDMASMSAddrDec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//源/目子地址參數(shù)的分析
if((paraID == Originating_Subaddress)||(paraID == Destination_Subaddress))
{
CDMASMSSUB_AddrDec(pDealMsg,numChar_DataField,paraLength,output_sms);
}
//傳送應(yīng)答選項(xiàng)字段的分析
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 參數(shù)
numChar_DataField = numChar_DataField+paraLength;
}
SMSDisplay(output_sms);
delete pInputMsg;
ShowMessage("SMS分析結(jié)束,退出");
return;
}
//---------------------------------------------------------------------------
/*********************************************************
函數(shù)說明:
輸入?yún)?shù):pMsg:層三DBM消息
charAddr :源/目地址起始位置對應(yīng)l3_data[]的下標(biāo)(參數(shù)開始位置,不包括ID和長度)
length:源/目地址參數(shù)長度
輸出參數(shù):output_sms結(jié)構(gòu)的源地址域
功能:解析出地址
*********************************************************/
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;
}
//---------------------------------------------------------------------------
/*********************************************************
函數(shù)說明:
輸入?yún)?shù):pMsg:層三DBM消息
charAddr :源/目地址起始位置對應(yīng)l3_data[]的下標(biāo)(參數(shù)開始位置,不包括ID和長度)
length:源/目地址參數(shù)長度
輸出參數(shù):output_sms結(jié)構(gòu)的源地址域
功能:解析出地址
*********************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -