receive sms in linux and decode chinese

int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)
{
    int nDstLength;            // 目标PDU串长度
    unsigned char tmp;        // 内部用的临时字节变量
    unsigned char buf[256];    // 内部用的缓冲区

    PString bufsmsget=pSrc;
    // SMSC地址信息段
    // SMSC地址信息段
                    gsmString2Bytes((const char*)bufsmsget, &tmp, 2);    // 取长度
                    
                     tmp = ( tmp - 1) * 2;//tmp = (tmp - 1) * 2;    // SMSC号码串长度
                    int ntmp = tmp;//14
                    PTRACE(1,"smsc len="<<ntmp<<"/r/n");
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-4);//pSrc += 4;            // 指针后移,忽略了SMSC地址格式
                    //683108501945F4 040D91 685169005953F1 00F060 016151615423 02421C
                    char SCA[16];//683108501945F4
                        PTRACE(1,"gsmSerializeNumbers/r/n");
                    gsmSerializeNumbers((const char*)bufsmsget,  SCA, ntmp);    // 转换SMSC号码到目标PDU串
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-ntmp);//pSrc += tmp;
                    //040D91 685169005953F1 00F060 016151615423 02421C                
                        PTRACE(1,"gsmSerializeNumbers tmp="<<ntmp<<"/r/n");// 指针后移
                    // TPDU段基本参数
                    gsmString2Bytes((const char*)bufsmsget, &tmp, 2);    // 取基本参数
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2;        // 指针后移
                    //0D91 685169005953F1 00F060 016151615423 02421C

                    // 取回复号码
                    gsmString2Bytes((const char*)bufsmsget, &tmp, 2);    // 取长度->0d=13
                    if(tmp & 1) tmp += 1;    // 调整奇偶性 ntmp=14;
                     ntmp=tmp;
                    PTRACE(1,"ret len="<<ntmp<<"/r/n");
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-4);//pSrc += 4;            // 指针后移,忽略了回复地址(TP-RA)格式
                    //685169005953F1 00F060 016151615423 02421C
                    char TPA[16];
                    gsmSerializeNumbers((const char*)bufsmsget,  TPA, tmp);    // 取TP-RA号码
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-tmp);//pSrc += tmp;        // 指针后移
                    //00F060 016151615423 02421C

                    // TPDU段协议标识、编码方式、用户信息等
                    char TP_PID;
                    gsmString2Bytes((const char*)bufsmsget, (unsigned char*)&TP_PID, 2);    // 取协议标识(TP-PID)
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2;        // 指针后移
                    //F060 016151615423 02421C
                    char TP_DCS;
                    gsmString2Bytes((const char*)bufsmsget, (unsigned char*)&TP_DCS, 2);    // 取编码方式(TP-DCS)
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2;        // 指针后移
                    //60 016151615423 02421C
                    char TP_SCTS[16];
                    gsmSerializeNumbers((const char*)bufsmsget, TP_SCTS, 14);        // 服务时间戳字符串(TP_SCTS)
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-14);//pSrc += 14;        // 指针后移
                    //02
                    gsmString2Bytes((const char*)bufsmsget, &tmp, 2);    // 用户信息长度(TP-UDL)
                    bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2;        // 指针后移
                    //421C


                        if(TP_DCS == GSM_7BIT)    
                        {
                            // 7-bit解码
                            int srclen =  tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4;
                            PString msg = bufsmsget.Left(srclen);                        
                            bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//pSrc += srclen;    
                            PTRACE(1,"7-bit解码 "<<srclen<<"/r/n");

                        }
                        else if( TP_DCS == GSM_UCS2)
                        {
                            // UCS2解码
                            int srclen = tmp*2;
                            PString msg = bufsmsget.Left(srclen);    

                            
                            char to[256]="";
                            const char * from = msg;
                            int fromlen = srclen;
                            int outdatalen = gsmDecodeUni2Gb((const unsigned char*)from, (  unsigned char*)to, fromlen);
//                            LogMessage(1,TPA);
//                            LogMessage(1, to);
                                        PTRACE(1,"TPA="<<TPA<<",to= "<<to<<"/r/n");  
                                        nDstLength=strlen(to);
                                        sprintf(pDst->TPA,TPA);
                                        sprintf(pDst->TP_UD,to);
                                    
                            /
                            bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//pSrc += srclen;    
                            
                            PTRACE(1,"UCS2解码 "<<srclen<<"/r/n");  

                        }
                        else
                        {
                            // 8-bit解码
                            int srclen = tmp*2;
                            PString msg = bufsmsget.Left(srclen);
                        
                            bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//    pSrc += srclen;    
                            
                            PTRACE(1,"8-bit解码 "<<srclen<<"/r/n");
                        }

    // 返回目标字符串长度
    return nDstLength;
}

#ifdef _WINDOWS
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{

    int nDstLength;        // UNICODE宽字符数目
    unsigned short wchar[128];    // UNICODE串缓冲区

    // 高低字节对调,拼成UNICODE
    for(int i=0; i<nSrcLength/2; i++)
    {
        wchar[i] = *pSrc++ << 8;    // 先高位字节
        wchar[i] |= *pSrc++;        // 后低位字节
    }

    // UNICODE串-->字符串
    nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);

    // 输出字符串加个结束符
    pDst[nDstLength] = '/0';

    // 返回目标字符串长度
    return nDstLength;
}
#else
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
    return gsmDecodeUni2Gb((const unsigned char*)pSrc,( unsigned char* )pDst,nSrcLength);
}
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值