GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx
《GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《GSM短信发送PDU编码解码C++控制台实现Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
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地址字符串的长度