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

📄 tx_puck_smsproc.c

📁 基于SIM300C的短信编码
💻 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 + -