- 浏览: 106934 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
luiprw:
...
Java在线视频聊天 -
luiprw:
注释很详细.. 回去研究..谢谢分享
Java在线视频聊天 -
寂寞秋江:
老兄真是贴心,顺道把slick svn 也上传上来了,赞一个, ...
Subclipse会提示JavaHL找不到的错误。 -
gaohongliang:
...
Swing 线程之SwingUtilities.invokeLater() -
lydawen:
对wappush协议有了深入的了解。三大运营商主要是在CMPP ...
wappush
import java.io.UnsupportedEncodingException;
/**
* wap push消息体工具类
* @version 1.0
* @author xmy
*/
public class PushTool {
####*/
private static byte []WDP =
new byte[] {
0x0B, //User-Data-Header (UDHL) Length = 11
0x05, //UDH IE identifier: Port numbers
0x04, //UDH port number IE length
0x0B, (byte) 0x84, 0x23, (byte) 0xF0, //the following message is a wap push
0x00, //UDH IE identifier: SAR
0x03, //UDH SAR IE length
0x03, //reference number
0x01, 0x01 /*
* 这两个只有当OTA内容过长时,短信会被拆分为两条
* 或多条,这时候第1个字节表明OTA短信共有几个数据
* 包,也就是共被拆分为几条短信;第2个字节表明当前
* 数据包是第几个数据包。
* 默认情况下,我们只有一个数据包,并且当前包是第一
* 个数据包。所以就是0x01 0x01
*
*/
};
private static byte []WSP =
new byte[] {
0x29,
0x06,
0x06,
0x03,
(byte) 0xAE,
(byte) 0x81,
(byte) 0xEA,
(byte) 0x8D,
(byte) 0xCA
};
private static byte []WBXMLHEAD =
new byte[] {
0x02, //标记位
0x05, //版本信息: -//WAPFORUM//DTD SI 1.0//EN
0x6A, //编码方式UTF-8
0x00, //XML标记开始
0x45, // "<si>"
(byte) 0xC6, // "<indication"
0x08, // "<action=signal-high> "
0x0C, // "href=http://"
0x03 // URL开始标记
};
/*
* URL标记为去掉http://后的UTF8编码
* */
// private byte []URL = null;
private static byte []URLTAIL = new byte []{
0x00, //URL字符串结束标记
0x01 // ">"
};
private static byte []CONTENTHEAD = new byte []{0x03}; //文本字符串开始
/*
* 说明文本
* */
// private static byte []CONTENT = null;
private static byte []CONTENTTAIL = new byte []{0x00}; //文本字符串结束标记
private static byte []WBXMLTAIL =
new byte[] {
0x01, // "</si>"
0x01 // "</indication>"
};
/**
* 填充PUSH短信Msg_Content字段
* @param url
* @param content
* @return
*/
public static byte[] getMsgContent(String url,String content) {
String url_ = UrlFilter(url);
// URL
byte []URL = null;
byte []msgContent = null;
try {
URL = url_.getBytes("utf-8");
// msgContent = chString2UTF8_byte(content);
msgContent = content.getBytes("utf-8");
// msgContent = chString2UTF8_byte(content);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte []res = new byte[PushTool.WDP.length
+ PushTool.WSP.length
+ PushTool.WBXMLHEAD.length
+ URL.length
+ PushTool.URLTAIL.length
+ PushTool.CONTENTHEAD.length
+ msgContent.length
+ PushTool.CONTENTTAIL.length
+ PushTool.WBXMLTAIL.length];
System.arraycopy(PushTool.WDP, 0, res, 0, PushTool.WDP.length);
System.arraycopy(PushTool.WSP, 0, res, PushTool.WDP.length, PushTool.WSP.length);
System.arraycopy(PushTool.WBXMLHEAD, 0, res,
PushTool.WSP.length
+ PushTool.WDP.length,
PushTool.WBXMLHEAD.length);
System.arraycopy(URL, 0, res,
PushTool.WSP.length
+ PushTool.WDP.length
+ PushTool.WBXMLHEAD.length,
URL.length);
System.arraycopy(PushTool.URLTAIL, 0, res,
PushTool.WDP.length
+ PushTool.WSP.length
+ PushTool.WBXMLHEAD.length
+ URL.length ,
PushTool.URLTAIL.length);
System.arraycopy(PushTool.CONTENTHEAD, 0, res,
PushTool.WDP.length
+ PushTool.WSP.length
+ PushTool.WBXMLHEAD.length
+ URL.length
+ PushTool.URLTAIL.length ,
PushTool.CONTENTHEAD.length);
System.arraycopy(msgContent, 0, res,
PushTool.WDP.length
+ PushTool.WSP.length
+ PushTool.WBXMLHEAD.length
+ URL.length
+ PushTool.URLTAIL.length
+ PushTool.CONTENTHEAD.length,
msgContent.length);
System.arraycopy(PushTool.CONTENTTAIL, 0, res,
PushTool.WDP.length
+ PushTool.WSP.length
+ PushTool.WBXMLHEAD.length
+ URL.length
+ PushTool.URLTAIL.length
+ PushTool.CONTENTHEAD.length
+ msgContent.length,
PushTool.CONTENTTAIL.length);
System.arraycopy(PushTool.WBXMLTAIL, 0, res,
PushTool.WDP.length
+ PushTool.WSP.length
+ PushTool.WBXMLHEAD.length
+ URL.length
+ PushTool.URLTAIL.length
+ PushTool.CONTENTHEAD.length
+ msgContent.length
+ PushTool.CONTENTTAIL.length,
PushTool.WBXMLTAIL.length);
return res;
}
/**
* 去掉URL的"http://"开头
*/
private static String UrlFilter(String url) {
if (url.contains("http://")) {
return url.substring(7);
}
return url;
}
/**
* 把汉字转化成UNICODE编码的字符串
*
* @param s 中文字符串
* @return
*/
public static String Chinese2unicode(String s) {
String s1 = new String();
String s2 = new String();
byte abyte0[] = null;
try {
abyte0 = s.getBytes("Unicode");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for(int j = 2; j < abyte0.length; j += 2)
{
String s3 = Integer.toHexString(abyte0[j + 1]);
int i = s3.length();
if(i < 2) {
s1 = s1 + "0" + s3;
} else {
s1 = s1 + s3.substring(i - 2);
}
s3 = Integer.toHexString(abyte0[j]);
i = s3.length();
if(i < 2) {
s1 = s1 + "0" + s3;
} else {
s1 = s1 + s3.substring(i - 2);
}
}
return s1;
}
/**
* 将UTF-8编码字符串转化为byte数组
* @param str
* @return
*/
private static byte[] chString2UTF8_byte(String str) {
byte[] result = null;
try{
str = new String(str.getBytes(),"GB2312");
result = str.getBytes("UTF-8");
}catch (Exception e){
e.printStackTrace();
}
return result;
}
/**
* byte数组转化为16进制字符串
* @param buf
* @return
*/
public static String byteToHexStr(byte buf[]) {
StringBuffer sb = new StringBuffer(2 * buf.length);
for(int i = 0; i < buf.length; i++) {
int h = (buf[ i ] & 0xf0) >> 4;
int l = (buf[ i ] & 0x0f);
sb.append(new Character((char)((h > 9) ? 'a' + h - 10 : '0' + h)));
sb.append(new Character((char)((l > 9) ? 'a' + l - 10 : '0' + l)));
}
return sb.toString().toUpperCase();
}
}
注意udhi 1
fmt 为4
import java.io.UnsupportedEncodingException;
/**
* CMPP通过短信网关上发WAP PUSH短信的Msg_Content部分的内容。
* </br>
* 请设置submit短信中以下位:
* TP_pID = 0
* TP_udhi = 1
* Msg_Fmt = 0x04
*
* @version 1.0
* @author xmy
*
*/
public class SpWapPushMsg {
/*
* 0x0B WAP PUSH头部的总长度
* 0x05, 0x04, 0x0B, (byte) 0x84, 0x23, (byte) 0xF0 接下来的内容是一个wap push
* 0x00 表示是Concatenated Short Messages
* 0x03 长度
* 0x03 reference number 参考gsm 9.2.3.6
* */
private static byte []WAP_PUSH_HEADER1 =
new byte[]{0x0B, 0x05, 0x04, 0x0B, (byte) 0x84, 0x23, (byte) 0xF0, 0x00, 0x03, 0x03};
/*
* msgCount 拆分后的短消息条数,默认只有一条短信
* msgOrder 拆分后的短消息序号,默认短信编号为第一条
* */
private byte msgCount = 0x01;
private byte msgOrder = 0x01;
/* WSP */
private static byte []WAP_PUSH_HEADER2 =
new byte[]{0x29, 0x06, 0x06, 0x03, (byte) 0xAE, (byte) 0x81, (byte) 0xEA, (byte) 0x8D, (byte) 0xCA};
/*
* 0x02 标记位
* 0x05 -//WAPFORUM//DTD SI 1.0//EN
* 0x6A URL和TEXT编码方式UTF-8
* 0x00 标记开始
* 0x45 <si>
* 0xC6 <indication
* 0x0C href="http://
* 0x03 字符串开始
* */
private static byte []WAP_PUSH_INDICATOR =
new byte[]{0x02, 0x05, 0x6A, 0x00, 0x45, (byte) 0xC6, 0x0C, 0x03};
/*
* 0x00 URL 字符串结束
* 0x01 '>'
* 0x03 内容描述字符串开始
* */
private static byte []WAP_Push_TEXT_HEADER = new byte[]{0x00, 0x01, 0x03};
/*
* 0x00 内容描述字符串结束
* 0x01 </si>
* 0x01 </indication>
* */
private static byte []END_Of_WAP_PUSH = new byte[]{0x00, 0x01, 0x01};
/* 当url和content空白时候的Msg_Content长度 */
private static int BASIC_LENGTH = WAP_PUSH_HEADER1.length
+ 2
+ WAP_PUSH_HEADER2.length
+ WAP_PUSH_INDICATOR.length
+ WAP_Push_TEXT_HEADER.length
+ END_Of_WAP_PUSH.length;
/*
* Msg_Fmt == 0 ==> MAX_MSG_LENGTH = 160
* Msg_Fmt != 0 ==> MAX_MSG_LENGTH = 140
* */
private static int MAX_MSG_LENGTH = 140;
/* 去掉 "http://" 的URL地址*/
private String url = null;
/* 文本消息内容 */
private String text = null;
public SpWapPushMsg(String url,String text) {
this.url = (true == url.contains("http://")? url.substring(7) : url);
this.text = text;
}
public SpWapPushMsg() {};
/**
* 获取Msg_Content内容
* @return 拆分后的字节数组
*/
public byte [][]getMsgContent() {
byte []url_ = UTF8Encoding(url);
byte []text_ = UTF8Encoding(text);
/* 计算拆分后的短信条数 */
msgCount += (url_.length + text_.length) / (MAX_MSG_LENGTH - BASIC_LENGTH);
/*
* 结果数组
*
* 第一维为拆分后的第一条短信编号,第二维为拆分后的第二条短信内容,依次类推,即:
* msgCountent[0] = 第一条拆分的短信
* msgCountent[1] = 第二条拆分的短信
* ...
* msgCountent[n] = 第n+1条拆分的短信
* */
byte []msgContent[] = new byte[msgCount][];
msgContent = combinMsgContent(msgContent,url_,text_);
realese();
return msgContent;
}
/**
* 组装WAP PUSH短信的msg_content字段
* @param msgContent
* @return
*/
private byte[][] combinMsgContent(byte [][]msgContent,byte []url,byte []text) {
// /* 以URL和TEXT填充消息体后的余数,两部分余数在整数填充完后将额外填充成一条短信 */
// int url_remainder = url.length % (MAX_MSG_LENGTH - BASIC_LENGTH);
// int text_remainder = text.length % (MAX_MSG_LENGTH - BASIC_LENGTH);
//
// /* 单以URL部分和TEXT部分分别填充短信将会填充的数量 */
// int url_msg_count = url.length / (MAX_MSG_LENGTH - BASIC_LENGTH);
// int text_msg_count = text.length / (MAX_MSG_LENGTH - BASIC_LENGTH);
//
// boolean flag = true;
// for ( ; msgOrder <= msgCount ; msgOrder++) {
// /* 填充url部分*/
// for (int pos = 0 ; msgOrder <= url_msg_count ; msgOrder++,pos++) {
// msgContent[msgOrder - 1] = buildMsgContent(url
// , pos * (MAX_MSG_LENGTH - BASIC_LENGTH)
// , (pos + 1) * (MAX_MSG_LENGTH - BASIC_LENGTH)
// , text,0,0);
// }
//
// /* 填充URL的余数部分和TEXT的开始一段 */
// if (flag) {
// msgContent[msgOrder - 1] = buildMsgContent(url
// , url.length - url_remainder
// , url.length
// , text,0,text_remainder);
// flag = false;
// continue; //填充完该条短信后面的代码暂时中止运行
// }
//
//
// /* 填充余下的TEXT部分 */
// for (int pos = 0 ;msgOrder - url_msg_count - 1 <= text_msg_count; msgOrder++,pos++) {
// msgContent[msgOrder - 1] = buildMsgContent(url ,0 ,0
// , text
// , text_remainder + pos * (MAX_MSG_LENGTH - BASIC_LENGTH)
// , text_remainder + (pos + 1) * (MAX_MSG_LENGTH - BASIC_LENGTH));
// }
//
// }
// 首先对url和text合并成一个新数组,数组长度为两者之和,然后对合并后的数组填充到bytes数组中
int len = url.length + text.length;
byte [] bytes = new byte[len];
System.arraycopy(url, 0, bytes, 0, url.length);
System.arraycopy(text, 0, bytes, url.length, text.length);
// 计算完整填充的短信条数以及填充后的余数部分
int msgs = bytes.length / (MAX_MSG_LENGTH - BASIC_LENGTH);
int remainder = bytes.length % (MAX_MSG_LENGTH - BASIC_LENGTH);
// 对能填充成为整数部分的短信内容填充
for (int i = 0 ; msgOrder <= msgs ; msgOrder++,i++) {
msgContent[msgOrder - 1] = buildMsgContent(bytes
, i * (MAX_MSG_LENGTH - BASIC_LENGTH)
, (i+1)* (MAX_MSG_LENGTH - BASIC_LENGTH)
, bytes,0,0);
}
// 对余数部分内容填充
msgContent[msgOrder - 1] = buildMsgContent(bytes
, bytes.length - remainder
, bytes.length
, bytes,0,0);
return msgContent; /* 以URL和TEXT填充消息体后的余数,两部分余数在整数填充完后将额外填充成一条短信 */
int url_remainder = url.length % (MAX_MSG_LENGTH - BASIC_LENGTH);
int text_remainder = text.length % (MAX_MSG_LENGTH - BASIC_LENGTH);
/* 单以URL部分和TEXT部分分别填充短信将会填充的数量 */
int url_msg_count = url.length / (MAX_MSG_LENGTH - BASIC_LENGTH);
int text_msg_count = text.length / (MAX_MSG_LENGTH - BASIC_LENGTH);
boolean flag = true;
for ( ; msgOrder <= msgCount ; msgOrder++) {
/* 填充url部分*/
for (int pos = 0 ; msgOrder <= url_msg_count ; msgOrder++,pos++) {
msgContent[msgOrder - 1] = buildMsgContent(url
, pos * (MAX_MSG_LENGTH - BASIC_LENGTH)
, (pos + 1) * (MAX_MSG_LENGTH - BASIC_LENGTH)
, text,0,0);
}
/* 填充URL的余数部分和TEXT的开始一段 */
if (flag) {
msgContent[msgOrder - 1] = buildMsgContent(url
, url.length - url_remainder
, url.length
, text,0,text_remainder);
flag = false;
continue; //填充完该条短信后面的代码暂时中止运行
}
/* 填充余下的TEXT部分 */
for (int pos = 0 ;msgOrder - url_msg_count - 1 <= text_msg_count; msgOrder++,pos++) {
msgContent[msgOrder - 1] = buildMsgContent(url ,0 ,0
, text
, text_remainder + pos * (MAX_MSG_LENGTH - BASIC_LENGTH)
, text_remainder + (pos + 1) * (MAX_MSG_LENGTH - BASIC_LENGTH));
}
}
return msgContent;
}
/**
* 构建拆分后的Msg_Content骨架,URL和TEXT指定的字节开始和结束添加到到骨架中
* @param url URL
* @param urlBegin URL开始字节下标
* @param urlEnd URL结束字节下标
* @param text 文本说明字符串
* @param textBegin 文本开始字节下标
* @param TextEnd 文本结束字节下标
* @return 一条拆分好的短消息
*/
private byte[] buildMsgContent(byte []url
, int urlBegin
, int urlEnd
, byte []text
, int textBegin
, int textEnd) {
//System.out.println("\nBASIC_LENGTH : " + BASIC_LENGTH);
//System.out.println("URL_LENGTH : " + (urlEnd - urlBegin));
//System.out.println("TEXT_LENGTH : " + (textEnd - textBegin));
int size = BASIC_LENGTH + (urlEnd - urlBegin) + (textEnd - textBegin);
byte []res = new byte[size];
System.arraycopy(WAP_PUSH_HEADER1, 0, res, 0, WAP_PUSH_HEADER1.length);
System.arraycopy(new byte[]{msgCount,msgOrder}, 0, res, WAP_PUSH_HEADER1.length, 2);
System.arraycopy(WAP_PUSH_HEADER2, 0
, res
, WAP_PUSH_HEADER1.length + 2
, WAP_PUSH_HEADER2.length);
System.arraycopy(WAP_PUSH_INDICATOR
, 0
, res
, WAP_PUSH_HEADER1.length + 2 + WAP_PUSH_HEADER2.length
, WAP_PUSH_INDICATOR.length);
System.arraycopy(url
, urlBegin
, res
, WAP_PUSH_HEADER1.length + 2 + WAP_PUSH_HEADER2.length + WAP_PUSH_INDICATOR.length
, urlEnd - urlBegin);
System.arraycopy(WAP_Push_TEXT_HEADER
, 0
, res
, WAP_PUSH_HEADER1.length + 2 + WAP_PUSH_HEADER2.length + WAP_PUSH_INDICATOR.length + (urlEnd - urlBegin)
, WAP_Push_TEXT_HEADER.length);
System.arraycopy(text
, textBegin
, res
, WAP_PUSH_HEADER1.length + 2 + WAP_PUSH_HEADER2.length + WAP_PUSH_INDICATOR.length + (urlEnd - urlBegin) + WAP_Push_TEXT_HEADER.length
, textEnd - textBegin);
System.arraycopy(END_Of_WAP_PUSH
, 0
, res
, WAP_PUSH_HEADER1.length + 2 + WAP_PUSH_HEADER2.length + WAP_PUSH_INDICATOR.length + (urlEnd - urlBegin) + WAP_Push_TEXT_HEADER.length + (textEnd - textBegin)
, END_Of_WAP_PUSH.length);
return res;
}
/**
* 将内容UTF8编码为字节数组
* @param s 待编码字符
* @return 字节数组
*/
private byte []UTF8Encoding(String s) {
if (null != s) {
try {
return s.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return null;
}
/**
* byte数组转化为hex字符串,终端打印调试用
* @return
*/
public static String ByteToHexStr(byte []byteArr) {
StringBuffer strBuf = new StringBuffer(byteArr.length * 3);
for (int i = 0 ; i < byteArr.length ; i++) {
int l = byteArr[i] & 0x0F;
int h = (byteArr[i] & 0xF0) >> 4;
char ll = (char) (l > 9 ? 'a' + l - 10 : '0' + l);
char hh = (char) (h > 9 ? 'a' + h - 10 : '0' + h);
strBuf.append(hh);
strBuf.append(ll);
strBuf.append(" ");
// strBuf.append(Integer.toHexString(byteArr[i] & 0xFF));
// strBuf.append(" ");
}
return strBuf.toString().toUpperCase();
}
private void realese() {
msgCount = 0x01;
msgOrder = 0x01;
}
public void setUrl(String url) {
this.url = (true == url.contains("http://")? url.substring(7) : url);
}
public void setText(String text) {
this.text = text;
}
}
============================================================================
/**
* 将SpWapPushMsg封装成一个SINGLETON模式的工具类。
*
* @version 1.0
* @author xmy
*
*/
public class SpWapPushMsgTool {
private static SpWapPushMsg instance;
/**
* 获取submit短消息的Msg_Content部分内容
* @param url URL地址
* @param text 文本字符串
* @return 分包后的WAP PUSH消息的Msg_Content.</br>
* 其返回为一个二维数组,如下:</br>
* 返回结果[0] = 第一条拆分的短信</br>
* 返回结果[1] = 第二条拆分的短信</br>
* ...</br>
* 返回结果[n] = 第n+1条拆分的短信</br>
*/
public static byte [][]getMsgContent(String url,String text) {
if (null == instance) {
instance = new SpWapPushMsg(url,text);
} else {
instance.setText(text);
instance.setUrl(url);
}
return instance.getMsgContent();
}
}
===========================================================================
public class testSpWapPushMsg {
public static void main(String[] args) {
String url = "http://tieba.baidu.com/f?ct=&tn=&rn=&pn=&lm=&cm=0&kw=linux&rs2=0&sc=&un=&rs1=&rs5=&sn=&rs6=&myselectvalue=0&word=linux&tb=on";
String text = "神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长,神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长,神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长神秘激情地带,江湖儿女情长";
// String url = "http://baike.baidu.com/view/391454.htm";
// String text = "神秘激情地带";
//
//
// SpWapPushMsg swpm = new SpWapPushMsg(url,text);
//
// byte [][]content = swpm.getMsgContent();
//
// for (int i = 0 ; i < content.length ; i++) {
// System.out.println("第" + i + "包:");
// System.out.println(SpWapPushMsg.ByteToHexStr(content[i]));
// }
//
byte [][]content = SpWapPushMsgTool.getMsgContent(url,text);
for (int i = 0 ; i < content.length ; i++) {
System.out.println("第" + (i+1) + "包:");
System.out.println(SpWapPushMsg.ByteToHexStr(content[i]));
}
System.out.println("------------------------------------------");
url = "wap.sina.com.cn";
text = "好好学习";
byte [][]content_ = SpWapPushMsgTool.getMsgContent(url, text);
for (int i = 0 ; i < content_.length ; i++) {
System.out.println("第" + (i+1) + "包:");
System.out.println(SpWapPushMsg.ByteToHexStr(content_[i]));
}
}
}
测试结果:
第1包:
0B 05 04 0B 84 23 F0 00 03 03 06 01 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 74 69 65 62 61 2E 62 61 69 64 75 2E 63 6F 6D 2F 66 3F 63 74 3D 26 74 6E 3D 26 72 6E 3D 26 70 6E 3D 26 6C 6D 3D 26 63 6D 3D 30 26 6B 77 3D 6C 69 6E 75 78 26 72 73 32 3D 30 26 73 63 3D 26 75 6E 3D 26 72 73 31 3D 26 72 73 35 3D 26 73 6E 3D 26 72 73 36 3D 26 6D 79 73 65 6C 65 63 74 76 61 6C 75 65 3D 30 26 77 6F 72 64 00 01 03 00 01 01
第2包:
0B 05 04 0B 84 23 F0 00 03 03 06 02 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 3D 6C 69 6E 75 78 26 74 62 3D 6F 6E 00 01 03 E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 00 01 01
第3包:
0B 05 04 0B 84 23 F0 00 03 03 06 03 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 00 01 03 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF 2C E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C 00 01 01
第4包:
0B 05 04 0B 84 23 F0 00 03 03 06 04 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 00 01 03 E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 00 01 01
第5包:
0B 05 04 0B 84 23 F0 00 03 03 06 05 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 00 01 03 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF 2C E7 A5 9E E7 A7 98 00 01 01
第6包:
0B 05 04 0B 84 23 F0 00 03 03 06 06 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 00 01 03 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF E7 A5 9E E7 A7 98 E6 BF 80 E6 83 85 E5 9C B0 E5 B8 A6 2C E6 B1 9F E6 B9 96 E5 84 BF E5 A5 B3 E6 83 85 E9 95 BF 00 01 01
------------------------------------------
第1包:
0B 05 04 0B 84 23 F0 00 03 03 01 01 29 06 06 03 AE 81 EA 8D CA 02 05 6A 00 45 C6 0C 03 77 61 70 2E 73 69 6E 61 2E 63 6F 6D 2E 63 6E 00 01 03 E5 A5 BD E5 A5 BD E5 AD A6 E4 B9 A0 00 01 01
收工睡觉 回家打战地2去了
发表评论
-
Hibernate4 调用存储过程
2014-05-07 13:52 922Session se = hibernateBaseDAO ... -
使用eclipse生成文档(javadoc)及碰到问题解决
2014-04-08 14:38 1766使用eclipse生成文档(javadoc)及碰到问题解决 ... -
nutch和solr集成
2012-12-10 16:52 885org.apache.solr.common.SolrExce ... -
BeanPostProcessor 小例子
2012-04-18 17:11 0今天学习了一下Spring的BeanPostProcessor ... -
Spring代码案例003-MessageSource
2012-04-18 16:37 1105SpringDemo.java package cn.b ... -
Java与php共享Memcached存储数据中的问题与解决方法
2011-02-21 12:18 2448Java与php共享Memcached存储数据中的问题与解决方 ... -
Notify()和notifyall()的原理
2011-01-18 16:28 1325在java多线程编程中,就要涉及到了对于资源的访问,当多个线程 ... -
Java 虚拟机类装载:原理、实现与应用
2010-12-01 15:25 876Java 虚拟机类装载:原理、实现与应用 一、引言 J ... -
JVM 原理及相关配置
2010-12-01 10:01 982Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很 ... -
rose 安装
2010-11-26 09:30 1338下面是安装步骤,你在检查一下,看有没有遗漏。1. 安装好Rat ... -
wappush
2010-11-09 16:34 5923Wap push的发送应该有两 ... -
solr基础配置
2010-11-06 20:41 1342可以通过以下三种方式之一设置 Solr 的主位置: ... -
Memcached for windows 安装
2010-11-06 19:26 3124Memcached 绝对是一个必须要掌握的东西, 我是这么 ... -
短信编程的一些概念
2010-11-05 13:36 1217SPIP:Short Message Gateway Inte ...
相关推荐
9. **com.esendex.articles.wappush.csproj**: 这是一个项目文件,包含了整个WAP Push源码项目的配置信息,如编译设置、引用的库和其他依赖项。 10. **App.ico**: 这是项目的图标文件,用于在应用程序或系统中显示...
在这个“WAPpush.zip”压缩包中,包含的是一个名为“e3.war”的Web应用程序文件和一个名为“www.pudn.com.txt”的文本文件,很可能与WAP Push服务的实现有关。 Java是实现WAP Push服务的常见编程语言,因为Java平台...
压缩包中的"wap_push"文件很可能是Java实现的WAP Push服务端或客户端的源代码。源码可能包含以下几个关键部分: 1. **消息构建模块**:这部分代码负责根据WAP Push规范创建消息结构,包括设置推送消息的类型、目标...
4. **Wappush_java**:这可能是指具体的Java库或框架,用于处理WAP Push服务的实现,包括创建、发送和处理WAP Push消息。 压缩包内的文件结构通常包含: - `.classpath`:这是Eclipse IDE的一个配置文件,记录了...
WapPushSDK-2.0是一款专为JAVA开发者设计的工具包,它包含完整的源码和示例,旨在帮助开发者轻松实现WAP PUSH服务。WAP PUSH是移动通信领域中一种重要的数据推送技术,尤其在构建智能移动应用时,它能有效提高信息...
Java手机与计算机互发彩信源码是一种技术实现,它允许使用Java编程语言在移动设备(手机)和桌面计算机之间发送和接收多媒体信息,通常称为彩信或MMS(Multimedia Messaging Service)。这个源码包可能包含了一系列...
为了优化移动网络环境下的性能,WAP浏览器可能会实现缓存机制,存储已访问过的页面,减少重复加载。此外,还有可能包括数据压缩技术,如WAP Push服务,用来减少数据传输量,提高浏览速度。 在安全性方面,由于WAP...
在本资源中,我们主要探讨的是一个基于Java技术实现的手机与计算机互发彩信的实例源码。这个项目的核心是利用Java编程语言构建一个能够跨设备发送多媒体信息(彩信)的应用。Java作为一种广泛应用于服务器端开发和...
彩信(MMS)的处理则更为复杂,通常涉及创建MMS消息对象,设置多媒体内容,然后通过WAP Push技术发送。Android系统中的Pdu类和MMSThread类等可能会在处理彩信时用到。在源码中,开发者可能已经实现了处理MMS的逻辑,...
2. **协议处理层**:负责解析和生成各种彩信相关的协议报文,如WAP Push、HTTP、MM7等。这一层需要对这些协议有深入理解,并能正确处理消息传输过程中的加密、压缩等问题。 3. **消息处理层**:处理彩信的存储、...
描述中提到,这个Java实现的SMPP开发包包含了丰富的源码示例,可以帮助开发者理解和应用如何通过SMPP协议与短信网关建立连接,进而实现短信发送和WAP推送功能。这意味着,除了基本的短信服务外,该库还支持WAP Push...
综上所述,"cmpp短信网关协议实现"涵盖了从理论到实践的多个方面,包括协议规范、Java实现、华为源码以及测试案例。通过深入理解和应用这些知识,开发者可以构建自己的短信服务系统,与中国移动的短信网关进行有效...
在Android源码中,MMS服务涉及到多个组件和模块,包括PDU解析、WAP Push协议处理、MMS存储以及用户界面等多个方面。下面将详细介绍这些关键知识点: 1. **PDU解析**:PDU(Protocol Data Unit)是MMS消息的数据格式...
在源码中,`MMSService`类扮演了核心角色,处理MMS的发送和接收,可能涉及`WAP Push`协议来传递MMS消息。 6. **UI组件**:源码中的`Activity`和`Fragment`类提供了短信应用的用户界面。例如,`...
Mms应用需要理解和处理WAP Push协议,这是MMS消息传递的基础。通过查看PduParser和PduComposer类,可以了解如何解析和构造PDU对象。 **4. UI设计**: Mms应用的UI设计遵循Android的Material Design指南。通过分析...
附带的源码可能包含了书中示例的完整实现,读者可以下载这些代码,跟随书中的步骤进行实践,加深理解。这些源码通常涵盖各种功能,例如简单的游戏、实用工具应用、网络通信示例等。 总之,《j2me midp2.0无线设备...
Midp2.0源码包含了大量的Java类库和API实现,这些源代码为开发者提供了深入理解平台工作原理的机会,有助于优化应用性能,解决兼容性问题,以及进行定制化开发。其中的关键组件包括: 1. **CLDC(Connected Limited...
8. **推送服务**: 理解如何使用Java Push Registry (JPR)和PushRegistry类,实现在移动设备上接收服务器端推送的消息。 9. **性能优化**: 针对J2ME应用的内存限制和性能问题,学习如何优化代码和资源,提高用户体验...
2. **MMS协议实现**:源码中可能包含了对MMS协议的具体实现,包括HTTP和WAP-XPUSH协议的封装,用于传输MMS数据。 3. **多媒体处理**:为了支持不同类型的媒体文件,代码可能包含对图片、音频和视频的编码和解码模块...
5. **MMS消息结构**:学习MMS消息的组成部分,如MIME类型、WAP Push消息格式等。 6. **调试与测试**:学习如何测试MMS应用程序,确保其在不同环境下正常运行。 7. **Android MMS开发**:如果此源码是针对Android...