`
walksing
  • 浏览: 217125 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用Java实现PDU编码

阅读更多
1.发英文

发英文时可以进行7bit编码或8bit编码.因为英文和数字等小于128的Ascii码,高位为0,所以,我们可以把最高位也利用起来,去掉最高位的0,然后,每个字节的位以次向前移动,这样一条短信就可以发最多160个字符。因为GSM协议规定短信最多是140个字节,这样的话总共是140×8=1120位,如果我们每个字节只占7位的话,那么就可以容下:1120/7=160个字符。

当然也可以用UCS2(也就是UTF-16,每个字符占两个字节),这样的话,发送只能发送最多有70个英文字符

2.发中文

发送中文时,必须用UCS2进行编码,最多可以发140/2=70个汉字。

接收到短消息之后,按编码方式进行解码就行了。

3.参考源代码:



package com.gftech.common;

public class PduPack ...{
// 短消息中心号长度
private String smscLen;

private String smscFormat;

// 短消息中心号
private String smsc;

// 源地址长度
private int addrLen;

private String addrFormat;

// 源地址
private String addr;

// 短消息内容编码方式,tp_dcs
private String msgCoding;

// 时间戳,tp_scts
// private String timestamp;

private int msgLen;

// 短消息内容,tp_ud
private String msgContent;

public PduPack() ...{
  smscLen = "08";
  smscFormat = "91";
  addrLen = 13;
  addrFormat = "91";

}

public PduPack(String src) ...{

  if (src != null && src.length() > 44) ...{
   String temp = src.substring(4, 18);
   smsc = GFString.interChange(temp);
   if (smsc != null && smsc.length() > 1)...{
    smsc = smsc.substring(0, smsc.length() - 1);
    if(smsc.length()==13)
     smsc=smsc.substring(2);
   }

   temp = src.substring(20, 22);
   addrLen = Integer.parseInt(temp, 16);
   if (addrLen % 2 == 0)
    temp = src.substring(24, 24 + addrLen);
   else
    temp = src.substring(24, 24 + addrLen + 1);
   addr = GFString.interChange(temp);
   // 去掉为补齐为偶数加上的那一位
   if (addr != null && addr.length() % 2 == 0) ...{
    addr = addr.substring(0, addr.length() - 1);
    if (addr.length() == 13)// 如果前面有86,去掉它
     addr = addr.substring(2);
   }
   if (addrLen % 2 == 0) ...{
    msgCoding = src.substring(24 + addrLen + 2, 24 + addrLen + 4);
    temp = src.substring(24 + addrLen + 4 + 16);
   } else ...{
    msgCoding = src.substring(24 + addrLen + 3, 24 + addrLen + 5);
    temp = src.substring(24 + addrLen + 5 + 16);
   }
   if (msgCoding.equals("08"))
    msgContent = GFString.unicode2gb(temp);
   else
    msgContent = GFString.decode7bit(temp);

  }
}

public void setSmsc(String s) ...{
  if (s != null) ...{
   String centerNo = null;
   if (s.length() == 11 && s.substring(0, 2).equals("13")) ...{
    centerNo = "86" + s;
   } else if (s.length() == 13
     && s.substring(0, 4).equals("8613")) ...{
    centerNo = s;
   } else if (s.length() == 14
     && s.substring(0, 5).equals("+8613")) ...{
    centerNo = s.substring(1);
   } else
    return;

   this.smsc= GFString.interChange(centerNo);
  }
}

public void setAddr(String ad) ...{
  if (ad != null) ...{
   String centerNo = null;
   if (ad.length() == 11 && ad.substring(0, 2).equals("13")) ...{
    centerNo = "86" + ad;
   } else if (ad.length() == 13 && ad.substring(0, 4).equals("8613")) ...{
    centerNo = ad;
   } else if (ad.length() == 14 && ad.substring(0, 5).equals("+8613")) ...{
    centerNo = ad.substring(1);
   } else if (ad.length() > 0) ...{// 特服号
    addrFormat = "A1";
    addrLen = ad.length();
    centerNo = ad;
   } else
    return;

   addr = GFString.interChange(centerNo);
  }
}

/** *//**
  * 设置编码方式
  *
  * @param encoding
  *            0:表示7-BIT编码 4:表示8-BIT编码 8:表示UCS2编码
  */
public void setMsgCoding(int encoding) ...{
  if (encoding ==
   msgCoding = "08";
  else if (encoding == 4)
   msgCoding = "04";
  else
   msgCoding = "00";

}

/** *//**
  * 短消息内容
  *
  * @param content
  */
public void setMsgContent(String content) ...{
  if (content != null) ...{
   if (content.length() == content.getBytes().length) ...{
    msgCoding = "00";
    msgLen = content.getBytes().length;
    msgContent = encode7bit(content);
    
   } else ...{
    msgCoding = "08";
    msgContent = GFString.gb2unicode(content);
    if(msgContent!=null)
     msgLen=msgContent.length()/2;
    
   }
  
   if(msgContent!=null)...{
    msgContent=msgContent.toUpperCase();
   
   }
  }
}

/** *//**
  *
  * @return 经过PDU编码的结果,十六进制字符串形式
  */
public String getCodedResult() ...{
  String result = null;
  final String tp_mti = "11";
  final String tp_mr = "00";
  final String tp_pid = "00";
  final String tp_vp = "00";

  if (smsc != null && addr != null && msgContent != null) ...{
   result = smscLen + smscFormat + smsc + tp_mti + tp_mr
     + GFString.byte2hex((byte) addrLen) + addrFormat + addr
     + tp_pid + msgCoding + tp_vp
     + GFString.byte2hex((byte) msgLen) + msgContent;
   result = result.toUpperCase();
  }

  return result;
}

public String getAddr() ...{
  return addr;
}

public String getMsgCoding() ...{
  return msgCoding;
}

public String getMsgContent() ...{
  return msgContent;
}

public int getMsgLen() ...{
  return msgLen;
}

public String getSmsc() ...{
  return smsc;
}

//TODO:temp
public static String encode7bit(String src) ...{
  String result = null;
  String hex = null;
  byte value;

  if (src != null && src.length() == src.getBytes().length) ...{
   result = "";
   byte left=0;
   byte[] b = src.getBytes();
   for (int i = 0, j = 0; i < b.length; i++) ...{
    j =i & 7;
    if (j == 0)
     left = b[i];
    else ...{
     value =(byte)((b[i] << (8 - j))|left);
     left=(byte)(b[i]>>j);
     hex = GFString.byte2hex((byte) value);
     result += hex;
     if(i==b.length -1)
      result+=GFString.byte2hex(left);
    }
   }
  
   result=result.toUpperCase();
  }
  return result;
}
}


/** *//**
  * 7-BIT编码 把ASCII码值最高位为0的字符串进行压缩转换成8位二进制表示的字符串
  *
  * @param src
  * @return
  */
public static String encode7bit(String src) ...{
  String result = null;
  String hex = null;
  byte value;

  if (src != null && src.length() == src.getBytes().length) ...{
   result = "";
   byte left=0;
   byte[] b = src.getBytes();
   for (int i = 0, j = 0; i < b.length; i++) ...{
    j =i & 7;
    if (j == 0)
     left = b[i];
    else ...{
     value =(byte)((b[i] << (8 - j))|left);
     left=(byte)(b[i]>>j);
     hex = GFString.byte2hex((byte) value);
     result += hex;
     if(i==b.length -1)
      result+=GFString.byte2hex(left);
    }
   }
  
   result=result.toUpperCase();
  }
  return result;
}
   
/** *//**
  * 对7-BIT编码进行解码
  * @param src 十六进制的字符串,且为偶数个
  * @return 源字符串
  */
public static String decode7bit(String src) ...{
  String result = null;
        int[] b;
        String temp=null;
        byte srcAscii;
        byte left=0;
       
  if (src != null && src.length() %2==0) ...{
   result="";
           b=new int[src.length() /2];
           temp=src+"0";
           for(int i=0,j=0,k=0;i<temp.length() -2;i+=2,j++)...{
             b[j]=Integer.parseInt(temp.substring(i,i+2),16);
            
             k=j % 7;
             srcAscii=(byte)(((b[j]<<k) & 0x7F)|left);
             result+=(char)srcAscii;
             left=(byte)(b[j]>>>(7-k));
             if(k==6)...{
              result+=(char)left;
              left=0;
             }
             if(j==src.length() /2)
              result+=(char)left;
           }
  }
  return result;
}


/** *//**
  * 把UNICODE编码的字符串转化成汉字编码的字符串
  *
  * @param hexString
  * @return
  */
public static String unicode2gb(String hexString) ...{
  StringBuffer sb = new StringBuffer();

  if (hexString == null)
   return null;

  for (int i = 0; i + 4 <= hexString.length(); i = i + 4) ...{
   try ...{
    int j = Integer.parseInt(hexString.substring(i, i + 4), 16);
    sb.append((char) j);
   } catch (NumberFormatException e) ...{
    return hexString;
   }
  }

  return sb.toString();
}

/** *//**
  * 把汉字转化成UNICODE编码的字符串
  *
  * @param gbString
  * @return
  */
public static String gb2unicode(String gbString) ...{
  String result = "";
  char[] c;
  int value;

  if (gbString == null)
   return null;
  // if (gbString.getBytes().length == gbString.length())
  // return gbString;

  String temp = null;
  c = new char[gbString.length()];
  StringBuffer sb = new StringBuffer(gbString);
  sb.getChars(0, sb.length(), c, 0);
  for (int i = 0; i < c.length; i++) ...{
   value = (int) c[i];
   // System.out.println("[" + i + "]:" +value );
   // System.out.println("hex:"+Integer.toHexString(value));
   temp = Integer.toHexString(value);
   result += fill(temp, 4);
  }

  return result.toUpperCase();
}


4.结束语

上面的源代码可能并不十分完整,但最重要的部分都有了。做为大家学习考参的例子。

PDU编码的详细介绍,请参考下面的参考资料

5.参考资料

bhw98的专栏 ttp://blog.csdn.net/bhw98/archive/2003/03/27/19666.aspx

原文地址:http://blog.csdn.net/sinboy/archive/2005/12/10/548549.aspx
分享到:
评论

相关推荐

    基于短信猫,采用PDU编码的短信收发java实现

    本文将详细讲解如何利用Java语言,结合PDU编码来实现基于短信猫的短信通信功能。 首先,我们需要理解PDU(Protocol Data Unit)编码。PDU编码是GSM通信系统中用于短信服务的一种二进制编码方式,它包含了短信的全部...

    短信pdu编码解码_短信_短信PDU编码_pdu_

    短信PDU编码与解码是通信领域中一个关键的概念,特别是在GSM(全球系统移动通信)网络中,用于传输文本消息。PDU全称为Protocol Data Unit...通过深入理解PDU编码,开发者可以更好地实现和优化短信功能,提高用户体验。

    java串口通讯 短信测试 comm编程 PDU编码 进制转换 AT命令

    13751069146 Saro Modem 短信测试.txt Java Comm API编程指南....关于java使用javacomm20.doc 常见的进制转换方法.doc 浅谈Java串行端口技术协议.doc 短信 AT 命令参考.doc 短信PDU编码解码.doc 通过串口收发短消息.doc

    PDU.zip_PDU编码_java 短信猫 pdu_pdu

    文档"手机短信的PDU编码和解码.doc"很可能详细阐述了如何在实际开发中使用PDU编码和解码,包括可能遇到的问题、解决方案,以及如何在Java环境下通过短信猫设备实现这一过程。这可能是对开发者非常有价值的信息,特别...

    GSM-PDU模式短信编解码-java代码

    2、PDU编码主要包括两个主要的部分:一是PDU串的整体数据格式,分别因为发送信息串和接收信息串而有区别;二是文本部分的编码,分别因为字符集而不同 3、PDU模式包括三种编码方式:7bit编码(GSM默认编码方法)、8...

    短信收发PDU编码转换

    1. Convert ASCII to 7-bit PDU 2. Convert 7-bit, 8-bit and 16-bit PDU to ASCII 3. Decode/Parsing the hexadecimal (PDU) of SMS message 4. Encode ASCII characters to be sent as SMS ready string

    pdu编码收发短信例子

    在SmsTest这个示例中,你可能找到了一个程序或代码片段,演示了如何使用Java、Python或其他编程语言来实现PDU编码和解码的过程。这个例子可能涵盖了创建PDU编码的短信、发送短信到指定号码、以及解析接收到的PDU格式...

    PDU 短信编解码工具(升级版)

    在短信编程中,生成PDU编码串是一项技术挑战,因为它涉及到短信的多个组成部分,如:服务中心地址(SCA)、短信类型、短信长度、编码方式以及实际的文本内容。这个升级版的工具提供了便捷的功能,用户只需输入短信...

    使用串口PDU收发短信知识汇集.docx

    本文将详细介绍如何使用Java实现PDU编码来发送和接收短信,以及涉及到的相关知识点。 1. **PDU编码基础** - **7位编码与8位编码**:对于英文和数字等ASCII字符,由于它们的值小于128,可以使用7位编码,这样一条...

    PDU 短信 解码 编码

    在处理PDU短信时,还需要考虑到网络状况、字符集限制(如70个字符的限制,除非使用UCS2编码)以及可能的编码错误。 总之,PDU短信解码和编码是移动通信中不可或缺的一部分,理解这一过程对于开发和维护与短信服务...

    PDU编码 短信的接收与发送

    为了更好地理解和处理PDU编码中的7-bit编码,我们可以实现一个简单的编码转换函数,将普通的文本转换为7-bit格式: ```c int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength) { int nSrc; ...

    短信pdu 生成(源码)

    这些函数可能包括将普通文本转换为PDU编码,处理分段,以及将接收到的PDU解码回可读的文本。这些操作通常涉及对二进制数据的操作,例如位移、位掩码和位填充。 5. **API接口**:在实际开发中,开发者可能会使用如AT...

    smslib-java.rar_ SMS PDU encoding_JAVA SMSLIB PDU_SMSLIB_java 串

    SMS PDU编码是Java SMSLIB库中的一个重要概念,它在无线通信领域,特别是短消息服务(SMS)中扮演着核心角色。SMSLIB是一个开源的Java库,专为开发者设计,用于构建短信应用,如发送、接收和管理短信。这个库支持...

    基于C语言的短信pdu的编码解码所有资料

    本文将深入探讨基于C语言的短信PDU编码与解码过程,以及如何处理长短信的拆分与合并。 一、短信PDU的基本概念 短信PDU模式是GSM 03.40标准定义的,主要用于SMSC(Short Message Service Center)与手机之间的通信。...

    Java pdu短信解码全面解析

    在本文中,我们将深入探讨如何使用Java实现这一过程,特别是基于Python解码方法的转化。 首先,我们需要理解PDU短信的基本结构。PDU格式的短信通常由一系列字节组成,这些字节包含了发送者信息、接收者信息、短信...

    PDU短信息发送案例

    在本文中,我们将深入探讨如何使用PDU(Protocol Data Unit,协议数据单元)模式发送短信息,特别是通过AT命令在GSM通信系统中实现这一过程。PDU模式是GSM短消息服务(SMS)中的一种数据表示形式,适用于传输包含...

    SMSPDU (短信PDU)

    对于开发者来说,许多编程语言提供了处理SMSPDU的库,比如Java的SMPP库、Python的pdu3270等,它们提供了便捷的API来处理PDU的编码和解码。 总之,SMSPDU是短信通信中的核心技术,它使得短信能够在不同设备间无缝...

    通过手机发送短信的程序(电脑通过数据线接手机,PDU编码,发送中文短信)

    标题中的“通过手机发送短信的程序”涉及到的是利用编程技术实现电脑通过数据线与手机连接,然后使用PDU编码方式发送中文短信的功能。这主要涵盖了以下几个IT知识点: 1. **移动设备通信接口**:首先,要实现电脑与...

    GPRS模块的收发短信,PDU模式

    5. **编程实践**:`SmsTest`可能是一个示例程序,它演示了如何使用编程语言(如C、Python、Java等)与GPRS模块交互,实现PDU模式下的短信收发。这个程序可能包含了错误处理、PDU编码和解码的函数,以及如何使用AT...

Global site tag (gtag.js) - Google Analytics