?? 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 + -