WAP PUSH的发送是通过将一个PAP(PAP Push Access Server Push访问协议)信息包发送到PUSH代理网关(PPG),就可以实现WAP PUSH。如果PUSH代理网关(PPG)是基于HTTP实现的PAP协议,那么可以使用HTTP POST将PAP消息发送到PPG。
PAP消息一般包括三部分:控制实体、内容实体和能力实体
在多部分(multipart)消息中,控制实体包括所有相关的控制信息,内容实体包括发给无线设备的内容,能力实体则包括用户代理结构(USP ROF)格式的客户能力。
控制实体含有PAP单元的XML文档,每个PAP请求和响应中必须有控制实体。内容实体的类型可以是任何类型,只要它被多用途网际邮件扩充协议(MIME)描述过。内容实体仅包含在推送提交的消息中。能力实体包含PI假定的无线设备或用户代理的能力,如果不存在就按默认值确定无线设备或用户代理的能力。以下是PI(PI:PUSH Initiator 推送发起者)向PPG发送的SI消息,如果把内容实体改成SL的内容,则消息就成为SL消息。
Content-Type: multipart/related; type=application/xml; boundary=BOUNDARY
--BOUNDARY
Content-Type: application/xml; charset=UTF-8
<?xml version="1.0"?>
<!DOCTYPE pap PUBLIC "-//WAPFORUM//DTD PAP 1.0//EN" "http://www.wapforum.org/DTD/pap_1.0.dtd">
<pap>
<push-message push-id="20752/149/Openwave Push">
<address address-value="WAPPUSH=189000000/TYPE=PLMN@www.openwave.com"/>
</push-message>
</pap>
--BOUNDARY
Content-Type: text/vnd.wap.si; charset=UTF-8
<?xml version="1.0"?>
<!DOCTYPE si PUBLIC "-//WAPFORUM//DTD SI 1.0//EN"
"http://www.wapforum.org/DTD/si.dtd">
<si>
<indication href="http://wap.baidu.com" action="signal-medium">
test
</indication>
</si>
--BOUNDARY—
采用.net提供的 HttpWebRequest类实现HTTP POST,将PAP消息发送的PPG。要将HTTP请求的ContentType属性设置为: multipart/related; type=application/xml; boundary=BOUNDARY,表示发送到HTTP请求包是一个multipart/related多结构包,其中boundary表示结构之间的边界分割线。<address address-value=wappush=18600000001/type=PLMN@www.openwave.com />表示接受人的手机号码。<indication href="http://wap.baidu.com" action="signal-medium">表示PUSH的地址。
.net具体实现方法:
/// <summary>
/// 发送wap push
/// </summary>
public class SendPush
{
private string strdata = "--WPL11woVbhESdfalYevGqpdzLCs/r/nContent-Type: application/xml; charset=UTF-8/r/n/r/n"
+"<?xml version=/"1.0/"?><!DOCTYPE pap PUBLIC /"-//WAPFORUM//DTD PAP 1.0//EN/" /"http://www.wapforum.org/DTD/wml_1.1.xml/">"
+"<pap><push-message push-id=/"{0}/">"
+"<address address-value=/"wappush={1}/type=PLMN@www.openwave.com/" />"
+"<quality-of-service network=/"GSM/" network-required=/"true/" bearer=/"SMS/" bearer-required=/"true/"/>"
+"</push-message></pap>/r/n--WPL11woVbhESdfalYevGqpdzLCs/r/nContent-Type: text/vnd.wap.si; charset=UTF-8/r/n/r/n"
+"<?xml version=/"1.0/"?><!DOCTYPE si PUBLIC /"-//WAPFORUM//DTD SI 1.0//EN/" /"http://www.wapforum.org/DTD/si.dtd/">"
+"<si><indication href=/"{2}/" action=/"signal-medium/">/r/n{3}/r/n</indication></si>/r/n"
+"--WPL11woVbhESdfalYevGqpdzLCs--";
/// <summary>
/// 发送wap push
/// </summary>
public SendPush()
{
}
/// <summary>
/// 发送基于Http协议的PAP wap push(无SAG)
/// </summary>
/// <param name="url">PPG地址</param>
/// <param name="strCallerID">接受号码</param>
/// <param name="strPushAddr">接受URL</param>
/// <param name="strText">push标题</param>
/// <returns>PPG返回结果</returns>
public string getSend(string url, string strCallerID, string strPushAddr, string strText)
{
string ret;
try
{
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);
myRequest.Method = "POST";
myRequest.ContentType = "multipart/related; type=application/xml;boundary=WPL11woVbhESdfalYevGqpdzLCs";
Random myRan = new Random();
string strpush = string.Format(strdata, DateTime.Now.ToString("yyyyMMddmmhhss") + myRan.Next(9).ToString(), strCallerID, strPushAddr, strText);
byte[] bytedate = Encoding.UTF8.GetBytes(strpush);
ret = XmlhttpSend(myRequest, bytedate);
}
catch (Exception ex)
{
ret = ex.ToString();
}
return ret;
}
/// <summary>
/// 发送push
/// </summary>
/// <param name="theRequest">http请求</param>
/// <param name="papData">发送数据</param>
/// <returns></returns>
private string XmlhttpSend(HttpWebRequest theRequest, byte[] papData)
{
string ret = string.Empty;
try
{
Stream requestStream = theRequest.GetRequestStream();
requestStream.Write(papData, 0, papData.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)theRequest.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
}
catch(Exception ex)
{
ret = "error:"+ex.ToString();
// throw;
}
return ret;
}
}
.net实现WAP PUSH
最新推荐文章于 2024-09-05 10:40:40 发布