PDU编码的方案网上很多,可以参考一下,我们只要按照协议格式去做就行了。要注意的一点是短消息内容需要进行Unicode编码转换。
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;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
PduPack
...
{
// 短消息中心号长度
private String smscLen;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private String smscFormat;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 短消息中心号
private String smsc;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 源地址长度
private int addrLen;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private String addrFormat;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 源地址
private String addr;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 短消息内容编码方式,tp_dcs
private String msgCoding;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 时间戳,tp_scts
// private String timestamp;
private int msgLen;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 短消息内容,tp_ud
private String msgContent;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public PduPack() ...{
smscLen = "08";
smscFormat = "91";
addrLen = 13;
addrFormat = "91";
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public PduPack(String src) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (src != null && src.length() > 44) ...{
String temp = src.substring(4, 18);
smsc = GFString.interChange(temp);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (smsc != null && smsc.length() > 1)...{
smsc = smsc.substring(0, smsc.length() - 1);
if(smsc.length()==13)
smsc=smsc.substring(2);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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);
// 去掉为补齐为偶数加上的那一位
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (addr != null && addr.length() % 2 == 0) ...{
addr = addr.substring(0, addr.length() - 1);
if (addr.length() == 13)// 如果前面有86,去掉它
addr = addr.substring(2);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (addrLen % 2 == 0) ...{
msgCoding = src.substring(24 + addrLen + 2, 24 + addrLen + 4);
temp = src.substring(24 + addrLen + 4 + 16);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ...{
msgCoding = src.substring(24 + addrLen + 3, 24 + addrLen + 5);
temp = src.substring(24 + addrLen + 5 +