📄 mmsnotificationmessage.java~4~
字号:
package gsmmodem.message;
import org.jsmsengine.*;
import java.util.*;
public class MMSNotificationMessage extends COutgoingMessage {
//private static final String UDH="0B05040B8423F00003030101";
private static final String UDH = "0605040B8423F0";
private static final String MMS_HEAD_CONTENTTYPE =
"0006226170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500";
private static final String MMS_HEAD_X_MMS_WAP_APPLICATION_ID = "AF84";
private static final String MMS_HEAD_X_MMS_MESSAGE_TYPE = "8C82";
private static final String MMS_HEAD_X_MMS_VERSION = "8D90";
private static final String MMS_HEAD_X_MMS_MESSAGE_CLASS = "8A80";
private String MMS_HEAD_X_TRANSACTION_ID;
private String MMS_HEAD_X_MMS_MESSAGE_SIZE;
private String MMS_HEAD_X_MMS_EXPIRY;
private String MMS_HEAD_FROM;
private String MMS_HEAD_SUBJECT;
private String mobile;
private String MMS_HEAD_X_MMS_CONTENT_LOCATION;
public MMSNotificationMessage() {
super();
setDate(new Date());
}
//wap push head1
//mms head application/vnd.wap.mms-message
//AF-> X-WAP-APPLICATION-ID 84->04+80
//8C-> X-MMS-MESSAGE-TYPE 82->m-notification-ind 头信息中只有此是必须的,其他均为可选择的
//98-> X-MMS-TRANSACTION-ID 61->ID=61 00->以00补全
//8D-> X-MMS-VERSION 90->1.0
//8A-> X-MMS-MESSAGE-CLASS 80->PERSONAL(82->INFORMATIONAL)
//8E-> X-MMS-MESSAGE-SIZE 02->LENGTH 0E10->SIZE(16*16*14+1*16+0=3600[BYTES])
//88-> X-MMS-EXPIRY 05->LENGTH 81->RELATIVE(80->ABSOULUTE) 03->LENGTH 015180->TIME(1*16*16*16*16+5*16*16*16+1*16*16+8*16=86144[SECONDS])
//83-> MMS ADDRESS 00->END OF MMS ADDRESS
//89-> FROM 10-LENGTH 80->BEGIN OF QUATO 00->END OF FROM
//97-> TO 00->END OF TO
//96-> SUBJECT 00->END OF SUBJECT
//84-> CONTENT-TYPE 00->END OF CONTENT-TYPE
public String getPDU(String smscNumber) {
String ret = "0051000BA13125517849F300F5A77C0B05040B8423F000031101013806226170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF848C82983346363638383231008D90890680796F75790096796F757220706963008A808E016188058103093A8083687474703A2F2F3231392E3233382E3233322E35362F2F61612E6D6D7300";
return ret;
// StringBuffer sb = new StringBuffer();
// sb.append("0051000BA1");
// sb.append(toBCDFormat(mobile));
// sb.append("00F5A7");
// int length = 0;
// length = length + UDH.length();
// length = length + MMS_HEAD_CONTENTTYPE.length();
// length = length + MMS_HEAD_X_MMS_MESSAGE_CLASS.length();
// length = length + MMS_HEAD_X_MMS_MESSAGE_TYPE.length();
// length = length + MMS_HEAD_X_MMS_VERSION.length();
// length = length + MMS_HEAD_X_MMS_WAP_APPLICATION_ID.length();
// length = length + MMS_HEAD_FROM.length();
// length = length + MMS_HEAD_SUBJECT.length();
// length = length + MMS_HEAD_X_MMS_EXPIRY.length();
// length = length + MMS_HEAD_X_MMS_MESSAGE_SIZE.length();
// length = length + MMS_HEAD_X_TRANSACTION_ID.length();
// length = length + MMS_HEAD_X_MMS_CONTENT_LOCATION.length();
// length = length / 2;
// sb.append(Integer.toHexString(length));
// sb.append(UDH);
// sb.append(MMS_HEAD_CONTENTTYPE);
// sb.append(MMS_HEAD_X_MMS_WAP_APPLICATION_ID);
// sb.append(MMS_HEAD_X_MMS_MESSAGE_TYPE);
// sb.append(MMS_HEAD_X_TRANSACTION_ID);
// sb.append(MMS_HEAD_X_MMS_VERSION);
// sb.append(MMS_HEAD_FROM);
// sb.append(MMS_HEAD_SUBJECT);
// sb.append(MMS_HEAD_X_MMS_MESSAGE_CLASS);
// sb.append(MMS_HEAD_X_MMS_MESSAGE_SIZE);
// sb.append(MMS_HEAD_X_MMS_EXPIRY);
// sb.append(MMS_HEAD_X_MMS_CONTENT_LOCATION);
// return sb.toString().toUpperCase();
}
public MMSNotificationMessage(String recipient, String url,
String transactionid, int size, int expiry,
String from, String subject) {
String length, ilength;
setDate(new Date());
MMS_HEAD_X_MMS_CONTENT_LOCATION = "83" + getUTF8Text(url) + "00";
mobile = recipient;
MMS_HEAD_X_TRANSACTION_ID = "98" + transactionid + "00";
MMS_HEAD_SUBJECT = "96" + getUTF8Text(subject) + "00";
MMS_HEAD_X_MMS_MESSAGE_SIZE = getSize(MMS_HEAD_X_MMS_MESSAGE_SIZE, size);
MMS_HEAD_X_MMS_EXPIRY = getExpiry(MMS_HEAD_X_MMS_EXPIRY, expiry);
MMS_HEAD_FROM = "890780" + getUTF8Text(from) + "00";
}
private static String getUTF8Text(String s) {
String ret = "";
try {
byte[] utf8 = s.getBytes("UTF8");
ret = bytesToHexStr(utf8).toUpperCase();
} catch (Exception e) {}
return ret;
}
private static String toBCDFormat(String s) {
String bcd;
int i;
if ((s.length() % 2) != 0) s = s + "F";
bcd = "";
for (i = 0; i < s.length(); i += 2) bcd = bcd + s.charAt(i + 1) +
s.charAt(i);
return bcd;
}
public static final char[] hex = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
public static String bytes2hexStr(byte[] arr, int len) {
StringBuffer sb = new StringBuffer(len * 2);
for (int i = 0; i < len; i++) {
int hi = (arr[i] >>> 4) & 0xf;
sb.append(hex[hi]);
int low = (arr[i]) & 0xf;
sb.append(hex[low]);
}
return sb.toString();
}
public static String bytesToHexStr(byte[] arr) {
return bytes2hexStr(arr, arr.length);
}
//8E-> X-MMS-MESSAGE-SIZE 02->LENGTH 0E10->SIZE(16*16*14+1*16+0=3600[BYTES])
//将size转成16进制的长度格式,如果是奇位数,则前面补0
//length 是计算出的长度,如果是奇位数,则前面补0,在最前面加8E表示为X-MMS-MESSAGE-SIZE
public String getSize(String s, int size) {
String length = "";
s = Integer.toHexString(size);
if (s.length() % 2 == 1)
s = "0" + s;
length = new Integer(s.length() / 2).toString();
if (length.length() % 2 == 1)
s = "8E0" + length + s;
else
s = "8E" + length + s;
return s.toUpperCase();
}
//88-> X-MMS-EXPIRY 05->LENGTH 81->RELATIVE(80->ABSOULUTE) 03->LENGTH 015180->TIME(1*16*16*16*16+5*16*16*16+1*16*16+8*16=86144[SECONDS])
//将expiry转成16进制的长度格式,如果是奇位数,则前面补0
//length 是计算出的长度,如果是奇位数,则前面补810,ilength 长度为length+2,位置在81之前,如果为奇位数,则在前补0,在其之前补88表示X-MMS-EXPIRY
public String getExpiry(String s, int expiry) {
String length = "";
String ilength = "";
s = Integer.toHexString(expiry);
if (s.length() % 2 == 1)
s = "0" + s;
length = new Integer(s.length() / 2).toString();
ilength = new Integer(s.length() / 2 + 2).toString();
if (length.length() % 2 == 1)
s = "810" + length + s;
else
s = "81" + length + s;
if (ilength.length() % 2 == 1)
s = "880" + ilength + s;
else
s = "88" + ilength + s;
return s.toUpperCase();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -