📄 tx_puck_smsproc.c
字号:
#include "TX_Var_puck.h"
#include "string.h"
/*************************SMS start**********************************************************
+CMGR: 1,,41
08 91 683108200245F0 2405A1 2031F1 2115 60508271009500 19 0780683D003D00684A041228101004740000080A0188884316
OK
********************************************************************************************/
INT16U SMSEncodePdu(INT8U * pSrc, INT8U* pDst,INT8U SMSUdLen)
{
INT16U nLength;
INT16U scalen;
INT16U tpalen;
INT16U nDstLength;
scalen=(INT16U)strlen((char *)(S_ComPara_PUCK.MibleCenter));
TempBuf_Puck[0]=(INT8U)((scalen & 1==0)?scalen:scalen+1)/2+1;
TempBuf_Puck[1]=0x91;
nDstLength=SMSBytes2String(TempBuf_Puck,pDst,2);
nDstLength += SMSInvertNumbers(S_ComPara_PUCK.MibleCenter, &pDst[nDstLength], scalen);
//应用程序目标手机码
tpalen=strlen((char *)(S_ComPara_PUCK.objectphone));
TempBuf_Puck[0]=0x11;
TempBuf_Puck[1]=0x00;
TempBuf_Puck[2]=(INT8U)tpalen;
TempBuf_Puck[3]=0xA1;
nDstLength+=SMSBytes2String(TempBuf_Puck,&pDst[nDstLength],4);
//nDstLength += SMSInvertNumbers(My_commustatus.objectphone, &pDst[nDstLength], tpalen);
nDstLength += SMSInvertNumbers(S_ComPara_PUCK.objectphone, &pDst[nDstLength], tpalen);
//SMSUdLen=strlen(pSrc->TP_UD);
TempBuf_Puck[0]=0x00;
TempBuf_Puck[1]=GSM_CODE;
//TempBuf[2]=0xA8;
TempBuf_Puck[2]=0xA8;
#if(GSM_CODE==GSM_7BIT)
// 7-bit编码方式
TempBuf_Puck[3] = SMSUdLen; // 编码前长度
nLength = SMSEncode7bit(pSrc, &TempBuf_Puck[4], SMSUdLen+1) + 4; // 转换TP-DA到目标PDU串
#endif
#if(GSM_CODE==GSM_UCS2)
//unicode 编码方式
TempBuf_Puck[3] =SMSUdLen; //gsmEncodeUcs2(pSrc->TP_UD, &TempBuf[4], nLength); // 转换TP-DA到目标PDU串
memcpy(TempBuf_Puck+4,pSrc,SMSUdLen);
nLength = TempBuf_Puck[3] + 4; // nLength等于该段数据长度
#endif
#if(GSM_CODE==GSM_8BIT)
//8-bit编码方式
TempBuf_Puck[3] =SMSUdLen; //gsmEncodeUcs2(pSrc->TP_UD, &TempBuf[4], nLength); // 转换TP-DA到目标PDU串
memcpy(TempBuf_Puck+4,pSrc,SMSUdLen);
nLength = TempBuf_Puck[3] + 4; // nLength等于该段数据长度
#endif
nDstLength += SMSBytes2String(TempBuf_Puck, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
nDstLength=nDstLength/2; //一般写法:nDstLength/2-(8+1)
nDstLength=nDstLength-((pDst[0]-0x30)*10+pDst[1]-0x30+1); //TempBuf_Puck[0]和SMSTempBuf[1]组成短消息中心号码的长度
return nDstLength;
}
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
INT16U SMSBytes2String(INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT16U i;
INT8U temptab[18];
strcpy((char *)temptab,(char *)("0123456789ABCDEF"));
for(i=0;i<nSrcLength;i++)
{
*pDst++=temptab[*pSrc>>4];// 输出低4位
*pDst++=temptab[*pSrc&0x0f];// 输出高4位
pSrc++;
}
*pDst = 0x00;
return (INT16U)(nSrcLength*2);
}
INT16U SMSInvertNumbers(INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT16U nDstLength; // 目标字符串长度
INT8U ch; // 用于保存一个字符
INT16U i;
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(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;
}
// 7-bit编码
// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
INT16U SMSEncode7bit(INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
int nSrc; // 源字符串的计数值
INT16U nDst; // 目标编码串的计数值
INT16U nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
INT8U nLeft; // 上一字节残余的数据
// 计数值初始化
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++;
}
// 返回目标串长度
return nDst;
}
INT16U SMSSerializeNumbers(INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT8U ch; // 用于保存一个字符
INT16U i;
// 复制串长度
// 两两颠倒
for(i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 最后的字符是'F'吗?
if(*(pDst-1) == 'F')
{
pDst--;
nSrcLength--; // 目标字符串长度减1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nSrcLength;
}
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
INT16U SMSString2Bytes(INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT16U i;
for(i=0; i<nSrcLength; i+=2)
{
// 输出高4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
pSrc++;
// 输出低4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst |= *pSrc - '0';
}
else
{
*pDst |= *pSrc - 'A' + 10;
}
pSrc++;
pDst++;
}
// 返回目标数据长度
return nSrcLength / 2;
}
/********************************************************************************************
+CMGR: 1,,41
08 91 683108200245F0 24 05 A12031F1 2115 60508271009500 19 0780683D003D00684A041228101004740000080A0188884316
OK
********************************************************************************************/
INT16U SMSDecodePdu(INT8U *pSrc,INT8U *pDst)
{
INT8U tmp,tp_dcs,tp_udl;
INT8U tempbuf[100];
INT16U nDstLength;
SMSString2Bytes(pSrc,&tmp,2);
tmp=(tmp-1)*2; //接收短消息中心号码,减1为减掉0x91
pSrc+=4;
SMSSerializeNumbers(pSrc,tempbuf,tmp);
pSrc+=tmp;
SMSString2Bytes(pSrc,&tmp,2);
pSrc+=2;
//if(tmp&0x80)
{
SMSString2Bytes(pSrc,&tmp,2);
if(tmp&1) tmp+=1;
pSrc+=4;
SMSSerializeNumbers(pSrc,tempbuf,tmp);
strcpy((char *)(S_ComPara_PUCK.objectphone),(char *)tempbuf); //提取发送方手机号码
pSrc+=tmp;
}
SMSString2Bytes(pSrc, tempbuf, 2); // 取协议标识(TP-PID)
pSrc += 2; // 指针后移
SMSString2Bytes(pSrc, &tp_dcs, 2); // 取编码方式(TP-DCS)
pSrc += 2; // 指针后移
SMSSerializeNumbers(pSrc, tempbuf, 14); // 服务时间戳字符串(TP_SCTS)
pSrc += 14; // 指针后移
SMSString2Bytes(pSrc, &tp_udl, 2); // 用户信息长度(TP-UDL)
pSrc += 2; // 指针后移
switch(tp_dcs)
{
case GSM_7BIT:
nDstLength=SMSString2Bytes(pSrc,TempBuf_Puck,tp_udl*2);
nDstLength=gsmDecode7bit(TempBuf_Puck,pDst,nDstLength);
return nDstLength;
case GSM_8BIT:
nDstLength=SMSString2Bytes(pSrc,TempBuf_Puck,tp_udl*2);
nDstLength=SMSDecode8bit(TempBuf_Puck,pDst,nDstLength);
return nDstLength;
case GSM_UCS2:
nDstLength=SMSString2Bytes(pSrc,pDst,tp_udl*2);
return nDstLength;
}
DEBUG_PRINT("Decode SMS Error!");
return 0;
}
/***********************************************************************************/
INT16U gsmDecode7bit(INT8U* pSrc, INT8U* pDst, INT16U nSrcLength)
{
INT16U nSrc; // 源字符串的计数值
INT16U nDst; // 目标解码串的计数值
INT16U nByte; // 当前正在处理的组内字节的序号,范围是0-6
INT8U nLeft; // 上一字节残余的数据
nSrc = 0;
nDst = 0;
nByte = 0;
nLeft = 0;
while(nSrc<nSrcLength)
{
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
nLeft = *pSrc >> (7-nByte);
pDst++;
nDst++;
nByte++;
if(nByte == 7)
{
*pDst = nLeft;
pDst++;
nDst++;
nByte = 0;
nLeft = 0;
}
pSrc++;
nSrc++;
}
*pDst = 0;
return nDst;
}
/********************************************************************************************/
INT16U SMSDecode8bit(INT8U *pSrc,INT8U *pDst,INT16U nSrcLenth)
{
INT16U i;
INT8U ch;
for(i=0;i<nSrcLenth;i++)
{
ch=*pSrc;
*pDst=ch;
pDst++;
pSrc++;
}
return nSrcLenth;
}
/********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -