📄 pdusms.java
字号:
import java.util.*;
public class PduSms {
private String Pdu; //整个PDU串
protected int Index; // 2 短信索引 +CMGL:2,1,,67
protected int State;//1
protected int PduLen; //67
protected String SCA; //短信中心地址
protected int Head;//头字节
protected int MTI; //短信发送方向
protected int SRI; //
protected int UDHI; //User Data中是否有头字节
protected int RP; //回复路径
protected int FCS=0; //短信报告中,发生错误的原因
protected String OA; //发生者的地址
protected int PID; //协议编号
protected int DCS; //解码类型 08 04 00 unicode ascii gms
protected String SCTS; //短信中心时间戳
protected int UDL; //用户数据长度
protected String UD; //用户数据
public int Sms_Type; //短信类型
public PduData pduData; //对应不同类型的短信,
//使用不同的对象PduData进行处理
public static final String[] SMS_TYPE={"SMS-DELIVER","SMS-SUBMIT",
"SMS-STATUS-REPORT","SMS-MMS-NOTIFICATION"};
public PduSms(String prefix, String pdu )throws Exception
{
Pdu=pdu;
String s=prefix.substring(6); //12,1,,146
String[] ss=s.split(",");
if(ss.length>3)
{
Index=Integer.parseInt(ss[0].trim(),10);
State=Integer.parseInt(ss[1].trim(),10);
PduLen=Integer.parseInt(ss[3].trim(),10);
}
if (State>1) throw new Exception("SMS State=0 or 1 ");
//只解释收到的短信
//解释消息头
decodePduHead();//解释短信头
getPduData(); //解释短信中的User Data 字段
}
private void decodePduHead() throws Exception
{
// Pdu * 08 91683108707305F0 04 0D91685198371792F0
//00 08 700191702504237E300A6C8156ED6625002D6CF360274EA4300BFF1A002098CE96E86E7F96346BDB002C98DE884051FA96349053002C5DF2662F4E244EBA8D6467616761002C552F67099E215DF47FD8002C75BC4E5F4E0D51FA58F0002C53EA628A6625676553EB002E5F8552307CBE6DB256DB5C0465F6002E597957285E8A4E0A7B11002E
int p=0;
int len=PduUtil.ReadByte(Pdu,p);
p=p+2;
String sc=Pdu.substring(p, p+len*2);
p=p+len*2;
SCA=PduUtil.ReadAddr(sc);
Head=PduUtil.ReadByte(Pdu,p);
p=p+2;
MTI=Head&0x03;
Sms_Type=MTI;
SRI=(Head&0x80)/128;
UDHI=(Head&0x40)/64;
RP=(Head&20)/32;
if((MTI==0) && (UDHI==1)) Sms_Type=3; //MMS
if(Sms_Type==2) // throw new Exception("SC->>MS:SMS-STATUS-REPORT=10 SMS-SUBMIT-REPORT=01");
{//短信Report下,有一字节用于说明FCS
FCS=PduUtil.ReadByte(Pdu,p);
p=p+2;
};
len=PduUtil.ReadByte(Pdu,p);
if(len%2==1)len=len+1;
p=p+2;
String oa=Pdu.substring(p,p+len+2);
OA=PduUtil.ReadAddr(oa);
p=p+len+2;
if(Sms_Type!=2)
{
PID=PduUtil.ReadByte(Pdu,p);
p=p+2;
DCS=(PduUtil.ReadByte(Pdu,p)& 12)/4;
p=p+2;
}
String scts=Pdu.substring(p,p+14);
SCTS=PduUtil.SwapByte(scts);
p=p+14;
if(MTI==0)
{//MIT=10 01 Report方式下,无UDL
UDL=PduUtil.ReadByte(Pdu,p);
p=p+2;
}
UD=Pdu.substring(p);
}
protected void getPduData() throws Exception
{//处理UD 和短信类型,依据this,建立合适的对象
pduData=PduData.newPduData(this);
}
public String getSCTS()
{
return PduUtil.getTime(SCTS);
}
public String getSCA() { return SCA; }
public String getOA() { return OA; }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -