GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx

上传人:b****6 文档编号:18234831 上传时间:2022-12-14 格式:DOCX 页数:18 大小:22.84KB
下载 相关 举报
GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx_第1页
第1页 / 共18页
GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx_第2页
第2页 / 共18页
GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx_第3页
第3页 / 共18页
GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx_第4页
第4页 / 共18页
GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx

《GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx

CONSTLEN 

1024

CONST1100 

1100"

CONST000800 

000800"

CONST0 

//短消息参数结构,编码/解码共用

//其中,字符串以0结尾

typedefstruct{

charSCA[16];

//短消息服务中心号码(SMSC地址)

charTPA[16];

//目标号码或回复号码(TP-DA或TP-RA)

charTP_PID;

//用户信息协议标识(TP-PID)

charTP_DCS;

//用户信息编码方式(TP-DCS)

charTP_SCTS[16];

//服务时间戳字符串(TP_SCTS),接收时用到

charTP_UD[161];

//原始用户信息(编码前或解码后的TP-UD)

charindex;

//短消息序号,在读取时用到

}SM_PARAM;

intlen;

chardata[16384];

}SM_BUFF;

classSendMsg

{

public:

intgsmInvertNumbers(constchar*pSrc,char*pDst,intnSrcLength);

intgsmSerializeNumbers(constchar*pSrc,char*pDst,intnSrcLength);

intgsmEncodeUcs2(constchar*pSrc,unsignedchar*pDst,intnSrcLength);

intgsmDecodeUcs2(constunsignedchar*pSrc,char*pDst,intnSrcLength);

intgsmBytes2String(constunsignedchar*pSrc,char*pDst,intnSrcLength);

intgsmString2Bytes(constchar*pSrc,unsignedchar*pDst,intnSrcLength);

intgsmEncode7bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength);

intgsmDecode7bit(constunsignedchar*pSrc,char*pDst,intnSrcLength);

intgsmEncode8bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength);

intgsmDecode8bit(constunsignedchar*pSrc,char*pDst,intnSrcLength);

intgsmEncodePdu(constSM_PARAM*pSrc,char*pDst);

intgsmDecodePdu(constchar*pSrc,SM_PARAM*pDst);

BOOLgsmSendMessage(constSM_PARAM*pSrc);

voidgsmReadMessageList();

BOOLgsmDeleteMessage(constintindex);

intgsmGetResponse(SM_BUFF*pBuff);

intgsmParseMessageList(SM_PARAM*pMsg,SM_BUFF*pBuff);

BOOLOpenComm(constchar*pPort,intnBaudRate,intnParity,intnByteSize,intnStopBits);

BOOLCloseComm();

voidWriteComm(void*pData,intnLength);

intReadComm(void*pData,intnLength);

BOOLgsmInit();

////初始化GSM状态

SendMsg(){}

~SendMsg(){}

};

GSM短信发送PDU编码解码C++控制台实现

(二)

//SendMsg.cpp

#include"

StdAfx.h"

SendMsg.h"

HANDLEhComm;

//串口设备句柄

//正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'

F'

凑成偶数

//如:

"

8613722216254"

-->

683127226152F4"

//pSrc:

源字符串指针

//pDst:

目标字符串指针

//nSrcLength:

源字符串长度

//返回:

目标字符串长度

intSendMsg:

:

gsmInvertNumbers(constchar*pSrc,char*pDst,intnSrcLength)

intnDstLength;

//目标字符串长度

charch;

//用于保存一个字符

//复制串长度

nDstLength=nSrcLength;

//两两颠倒

for(inti=0;

i<

nSrcLength;

i+=2)

ch=*pSrc++;

//保存先出现的字符

*pDst++=*pSrc++;

//复制后出现的字符

*pDst++=ch;

//复制先出现的字符

}

//源串长度是奇数吗?

if(nSrcLength&

1)

*(pDst-2)='

;

//补'

nDstLength++;

//目标串长度加1

//输出字符串加个结束符

*pDst='

\0'

//返回目标字符串长度

returnnDstLength;

//两两颠倒的字符串转换为正常顺序的字符串

gsmSerializeNumbers(constchar*pSrc,char*pDst,intnSrcLength)

intnDstLength;

charch;

//复制串长度

nDstLength=nSrcLength;

//两两颠倒

for(inti=0;

{

}

//最后的字符是'

吗?

if(*(pDst-1)=='

pDst--;

nDstLength--;

//目标字符串长度减1

//输出字符串加个结束符

*pDst='

//返回目标字符串长度

returnnDstLength;

//7-bit编码

目标编码串指针

目标编码串长度

gsmEncode7bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength)

intnSrc;

//源字符串的计数值

intnDst;

//目标编码串的计数值

intnChar;

//当前正在处理的组内字符字节的序号,范围是0-7

unsignedcharnLeft;

//上一字节残余的数据

//计数值初始化

nSrc=0;

nDst=0;

//将源串每8个字节分为一组,压缩成7个字节

//循环该处理过程,直至源串被处理完

//如果分组不到8字节,也能正确处理

while(nSrc<

nSrcLength)

//取源字符串的计数值的最低3位

nChar=nSrc&

7;

//处理源串的每个字节

if(nChar==0)

//组内第一个字节,只是保存起来,待处理下一个字节时使用

nLeft=*pSrc;

else

//组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节

*pDst=(*pSrc<

<

(8-nChar))|nLeft;

//将该字节剩下的左边部分,作为残余数据保存起来

nLeft=*pSrc>

>

nChar;

//修改目标串的指针和计数值pDst++;

nDst++;

}

//修改源串的指针和计数值

pSrc++;

nSrc++;

//返回目标串长度

returnnDst;

//7-bit解码

源编码串指针

源编码串长度

gsmDecode7bit(constunsignedchar*pSrc,char*pDst,intnSrcLength)

//目标解码串的计数值

intnByte;

//当前正在处理的组内字节的序号,范围是0-6

//组内字节序号和残余数据初始化

nByte=0;

nLeft=0;

//将源数据每7个字节分为一组,解压缩成8个字节

//循环该处理过程,直至源数据被处理完

//如果分组不到7字节,也能正确处理

//将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节

*pDst=((*pSrc<

nByte)|nLeft)&

0x7f;

(7-nByte);

//修改目标串的指针和计数值

pDst++;

//修改字节计数值

nByte++;

//到了一组的最后一个字节

if(nByte==7)

//额外得到一个目标解码字节

*pDst=nLeft;

*pDst=0;

// 

8bit编码

输入:

pSrc 

源字符串指针

nSrcLength 

源字符串长度

输出:

pDst 

目标编码串指针

返回:

目标编码串长度

gsmEncode8bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength)

{

简单复制

memcpy(pDst, 

pSrc, 

nSrcLength);

return 

nSrcLength;

8bit解码

源编码串指针

源编码串长度

目标字符串指针

目标字符串长度

gsmDecode8bit(constunsignedchar*pSrc,char*pDst,intnSrcLength)

输出字符串加个结束符

*pDst 

'

\0'

//UCS2编码

//输入:

pSrc-源字符串指针

//nSrcLength-源字符串长度

//输出:

pDst-目标编码串指针

gsmEncodeUcs2(constchar*pSrc,unsignedchar*pDst,intnSrcLength)

//UNICODE宽字符数目

WCHARwchar[128];

//UNICODE串缓冲区

//字符串-->

UNICODE串

nDstLength=MultiByteToWideChar(CP_ACP,0,pSrc,nSrcLength,wchar,128);

//高低字节对调,输出

nDstLength;

i++)

*pDst++=wchar[i]>

8;

//先输出高位字节

*pDst++=wchar[i]&

0xff;

//后输出低位字节

//返回目标编码串长度

returnnDstLength*2;

//UCS2解码

pSrc-源编码串指针

//nSrcLength-源编码串长度

pDst-目标字符串指针

//

gsmDecodeUcs2(constunsignedchar*pSrc,char*pDst,intnSrcLength)

//高低字节对调,拼成UNICODE

nSrcLength/2;

wchar[i]=*pSrc++<

//先高位字节

wchar[i]|=*pSrc++;

//后低位字节

//UNICODE串-->

字符串

nDstLength=WideCharToMultiByte(CP_ACP,0,wchar,nSrcLength/2,pDst,160,NULL,NULL);

pDst[nDstLength]='

//可打印字符串转换为字节数据

C8329BFD0E01"

{0xC8,0x32,0x9B,0xFD,0x0E,0x01}

目标数据指针

目标数据长度

gsmString2Bytes(constchar*pSrc,unsignedchar*pDst,intnSrcLength)

i+=2)

//输出高4位

if(*pSrc>

='

0'

&

&

*pSrc<

9'

*pDst=(*pSrc-'

)<

4;

A'

+10)<

//输出低4位

*pDst|=*pSrc-'

+10;

//返回目标数据长度

returnnSrcLength/2;

//字节数据转换为可打印字符串

{0xC8,0x32,0x9B,0xFD,0x0E,0x01}-->

源数据指针

源数据长度

gsmBytes2String(constunsignedchar*pSrc,char*pDst,intnSrcLength)

constchartab[]="

0123456789ABCDEF"

//0x0-0xf的字符查找表

*pDst++=tab[*pSrc>

4];

*pDst++=tab[*pSrc&

0x0f];

returnnSrcLength*2;

//PDU编码,用于编制、发送短消息

源PDU参数指针

目标PDU串指针

目标PDU串长度

gsmEncodePdu(constSM_PARAM*pSrc,char*pDst)

intnLength;

//内部用的串长度

//目标PDU串长度

unsignedcharbuf[256];

//内部用的缓冲区

//SMSC地址信息段

nLength=strlen(pSrc->

SCA);

//SMSC地址字符串的长度 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1