📄 csms.cpp
字号:
}
}
}
// 返回目标字符串长度
return nDstLength;
}
//返回号码长度
INT8U CSmsPdu::Que_Number_Length(const INT8U *Src)
{
INT8U n=0;
for(INT8U m=0;m<8;m++)
{
if((Src[m]&0xf0)==0xf0)
break;
n++;
if((Src[m]&0x0f)==0x0f)
break;
n++;
}
return n;
}
INT16U CSmsPdu::AnySmsEncode_NoCenter(const INT8U *SrcNumber,INT8U type,const INT8U *DataSrc,INT16U datalen, INT8U* pDst)
{
SmsType tmpSms;
INT8U len8;
len8=Que_Number_Length(SrcNumber);
len8=(len8+1)>>1;
tmpSms.TPA[0]=0x86;
BufToBuf(&tmpSms.TPA[1],SrcNumber,len8);
tmpSms.TP_DCS=type&0x0c;
tmpSms.TP_PID=0;
return (GsmEncodePdu_NoCenter(tmpSms,DataSrc,datalen,pDst));
}
//不加短信中心号码
INT16U CSmsPdu:: GsmEncodePdu_NoCenter(const SmsType pSrc,const INT8U *DataSrc,INT16U datalen, INT8U* pDst)
{
INT16U nLength; // 内部用的串长度
INT16U nDstLength=0; // 目标PDU串长度
INT8U buf[256]; // 内部用的缓冲区
// SMSC地址信息段
buf[0]=0;//SCA
nDstLength += Hex_To_Ascii(buf, pDst, 1);
// TPDU段基本参数、目标地址等
buf[0]=0x11;//PDUTYPE
buf[1]=0x00;//MR
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], 2);
// SMSC地址信息段
nLength = Que_Number_Length(pSrc.TPA);// TP-DA地址字符串的长度
buf[0] = (INT8U)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], 2);
nLength=Hex_Num_Encode(pSrc.TPA,buf,nLength);
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength],nLength); // 转换TP-DA到目标PDU串
// TPDU段协议标识、编码方式、用户信息等
buf[0] = 0; // 协议标识(TP-PID)
buf[1] = pSrc.TP_DCS&0x0c; // 用户信息编码方式(TP-DCS)
buf[2] = 0x8f; // 有效期(TP-VP)为12小时
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength],3);
if((pSrc.TP_DCS&0x0c) == GSM_7BIT)
{
// 7-bit编码方式
buf[0] = datalen; // 编码前长度.7位方式表示编码前的长度
nLength = GsmEncode7bit(DataSrc, &buf[1], datalen);
nLength+=1;
// 转换 TP-DA到目标PDU串
}
else if((pSrc.TP_DCS&0x0c) == GSM_UCS2)
{
// UCS2编码方式
buf[0] = GsmEncodeUcs2(DataSrc, &buf[1], datalen); // 转换TP-DA到目标PDU串
nLength = buf[0] + 1; // nLength等于该段数据长度
}
else
{
// 8-bit编码方式
buf[0] = GsmEncode8bit(DataSrc, &buf[1], datalen); // 转换TP-DA到目标PDU串
nLength = buf[0] + 1; // nLength等于该段数据长度
}
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
// 返回目标字符串长度
return nDstLength;
}
INT16U CSmsPdu:: GsmEncodePdu_Center(const SmsType pSrc,const INT8U *DataSrc,INT16U datalen, INT8U* pDst)
{
INT16U nLength; // 内部用的串长度
INT16U nDstLength=0; // 目标PDU串长度
INT8U buf[256]; // 内部用的缓冲区
// SMSC地址信息段
nLength = Que_Number_Length(pSrc.SCA); // SMSC地址字符串的长度
buf[0] = (INT8U)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength = Hex_To_Ascii(buf, pDst, 2); // 转换2个字节到目标PDU串
nLength=Hex_Num_Encode(pSrc.SCA,buf,nLength);
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength],nLength); // 转换SMSC到目标PDU串
// TPDU段基本参数、目标地址等
buf[0]=0x11;//PDUTYPE
buf[1]=0x00;//MR
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], 2);
// SMSC地址信息段
nLength = Que_Number_Length(pSrc.TPA);// TP-DA地址字符串的长度
buf[0] = (INT8U)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], 2);
nLength=Hex_Num_Encode(pSrc.TPA,buf,nLength);
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength],nLength); // 转换TP-DA到目标PDU串
// TPDU段协议标识、编码方式、用户信息等
buf[0] = 0; // 协议标识(TP-PID)
buf[1] = pSrc.TP_DCS&0x0c; // 用户信息编码方式(TP-DCS)
buf[2] = 0x8f; // 有效期(TP-VP)为12小时
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength],3);
if((pSrc.TP_DCS&0x0c) == GSM_7BIT)
{
// 7-bit编码方式
buf[0] = datalen; // 编码前长度.7位方式表示编码前的长度
nLength = GsmEncode7bit(DataSrc, &buf[1], datalen);
nLength+=1;
// 转换 TP-DA到目标PDU串
}
else if((pSrc.TP_DCS&0x0c)== GSM_UCS2)
{
// UCS2编码方式
buf[0] = GsmEncodeUcs2(DataSrc, &buf[1], datalen); // 转换TP-DA到目标PDU串
nLength = buf[0] + 1; // nLength等于该段数据长度
}
else
{
// 8-bit编码方式
buf[0] = GsmEncode8bit(DataSrc, &buf[1], datalen); // 转换TP-DA到目标PDU串
nLength = buf[0] + 1; // nLength等于该段数据长度
}
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
// 返回目标字符串长度
return nDstLength;
}
// 两两颠倒的字符串转换为正常顺序的字符串
// 如:"8613693092030" -. "683196032930F0"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
INT8U CSmsPdu::Hex_Num_Encode(const INT8U *pSrc,INT8U *pDst,INT8U nSrcLength)
{
INT8U nDstLength=nSrcLength;
if(nDstLength&0x01)
nDstLength+=1;
for(INT8U i=0;i<nDstLength;i+=2)
{
*pDst=(*pSrc<<4)|(*pSrc>>4);
pDst++;
pSrc++;
}
if(nSrcLength&1)
{
*(pDst-1)&=0x0f;
*(pDst-1)|=0xf0;
}
return (nDstLength>>1);
}
// 两两颠倒的字符串转换为正常顺序的字符串
// 如:"8613693092030" -. "683196032930F0"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
INT8U CSmsPdu:: Hex_Num_Decode(const INT8U *pSrc,INT8U *pDst,INT8U nSrcLength)
{
INT8U nDstLength=nSrcLength;
if(nDstLength&0x01)
nDstLength+=1;
for(INT8U i=0;i<nDstLength;i+=2)
{
*pDst=(*pSrc<<4)|(*pSrc>>4);
pDst++;
pSrc++;
}
if(nSrcLength&1)
{
*(pDst-1)&=0xf0;
*(pDst-1)|=0x0f;
}
return (nDstLength>>1);
}
/*
// 两两颠倒的字符串转换为正常顺序的字符串
// 如:"8613693092030" -. "683196032930F0"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
INT16U GsmSerializeNumbers(const INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT16U nDstLength; // 目标字符串长度
INT8U ch; // 用于保存一个字符
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(INT16U i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 最后的字符是'F'吗?
if(*(pDst-1) == 'F')
{
pDst--;
nDstLength--; // 目标字符串长度减1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nDstLength;
}
//PDU串中的号码和时间,都是两两颠倒的字符串。利用下面两个函数可进行正反变换:
// 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
// 如:"8613693092030" -. "683196032930F0"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
INT16U GsmInvertNumbers(const INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT16U nDstLength; // 目标字符串长度
INT8U ch; // 用于保存一个字符
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(INT16U i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 源串长度是奇数吗?
if(nSrcLength & 1)
{
*(pDst-2) = 'F'; // 补'F'
nDstLength++; // 目标串长度加1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nDstLength;
}
//加短信中心号码
INT16U GsmEncodePdu(const SM_PARAM* pSrc, INT8U* pDst)
{
INT16U nLength; // 内部用的串长度
INT16U nDstLength; // 目标PDU串长度
INT8U buf[256]; // 内部用的缓冲区
// SMSC地址信息段
nLength = strlen(pSrc.SCA); // SMSC地址字符串的长度
buf[0] = (INT8U)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength = Hex_To_Ascii(buf, pDst, 2); // 转换2个字节到目标PDU串
nDstLength += GsmInvertNumbers(pSrc.SCA, &pDst[nDstLength], nLength); // 转换SMSC到目标PDU串
// TPDU段基本参数、目标地址等
nLength = strlen(pSrc.TPA); // TP-DA地址字符串的长度
CString rec_number=CString(pSrc.TPA);
buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
buf[1] = 0; // TP-MR=0
buf[2] = (INT8U)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
buf[3] = 0x91; // 固定: 用国际格式号码
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
nDstLength += GsmInvertNumbers(pSrc.TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
// TPDU段协议标识、编码方式、用户信息等
nLength = strlen(pSrc.TP_UD); // 用户信息字符串的长度
buf[0] = pSrc.TP_PID; // 协议标识(TP-PID)
buf[1] = pSrc.TP_DCS; // 用户信息编码方式(TP-DCS)
buf[2] = 0; // 有效期(TP-VP)为5分钟
if(pSrc.TP_DCS == GSM_7BIT)
{
// 7-bit编码方式
buf[3] = nLength; // 编码前长度
nLength = GsmEncode7bit(pSrc.TP_UD, &buf[4], nLength+1) + 4;
// 转换 TP-DA到目标PDU串
}
else if(pSrc.TP_DCS == GSM_UCS2)
{
// UCS2编码方式
buf[3] = GsmEncodeUcs2(pSrc.TP_UD, &buf[4], nLength); // 转换TP-DA到目标PDU串
nLength = buf[3] + 4; // nLength等于该段数据长度
}
else
{
// 8-bit编码方式
buf[3] = GsmEncode8bit(pSrc.TP_UD, &buf[4], nLength); // 转换TP-DA到目标PDU串
nLength = buf[3] + 4; // nLength等于该段数据长度
}
nDstLength += Hex_To_Ascii(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
// 返回目标字符串长度
return nDstLength;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -