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

📄 csms.cpp

📁 PDU短信的编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
    }
   }
   }
    // 返回目标字符串长度
    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 + -