⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdmasms.cpp

📁 针对CDMA2000层3信令的SMS的unicode ,解析出文本格式的SMS的源码,在c++builder环境下开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//---------------------------------------------------------------------------

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