视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
WapPushAccessProtocol(PAP)介绍
2020-11-09 15:29:41 责编:小采
文档


最近因为某些项目的原因,需要实现WapPush的功能,本想偷懒在网上搜索一下,看有没有合适的内容,结果找不到一个合适的.只好自已动手来写一个. 看了一下PAP协议的内容,其实也并不复杂,属于HTTP协议的扩展,因此,使用.NET的HttpWebRequest类库便可以方便的实现PAP

  最近因为某些项目的原因,需要实现WapPush的功能,本想偷懒在网上搜索一下,看有没有合适的内容,结果找不到一个合适的.只好自已动手来写一个.

  看了一下PAP协议的内容,其实也并不复杂,属于HTTP协议的扩展,因此,使用.NET的HttpWebRequest类库便可以方便的实现PAP的通讯层.剩下的工作便是PAP协议内容的组合了,PAP协议主要有四个方法及一个交互方法,分别是:

  • Submit a Push 提交一个Push信息
  • Cancel a Push 取消一个Push信息
  • Query for status of a Push 查询提交Push信息的状态
  • Query for wireless device capabilities 查询无线设备能力
  •   如果需要接收PPG(推送代理网关)返回的发送结果通知消息,则需要提供一个回调地址,供PPG发送通知响应.PI(推送发起人)与PPG之间的关系如下图:

      PI端与PPG之间使用PAP协议通讯,PPG则调用空中协议传送到手机端.

      

      上图则是PI发送一个WapPush信息,PI与PPG之间的交互过程

    1. PI发起一个推送请求
    2. PPG返回一个接收响应包
    3. PPG推送WapPush到手机终端
    4. 手机终端响应接收结果
    5. PPG推最终发送结果到PI端
    6. PI端返回一个响应包到PPG,完成整个发送过程

      对于Cancel a Push, Query for status of a Push , Query for wireless device capabilities 这三种方式,都是PI与PPG之间的交互,即发起请求,得到响应的方式,因此,不作详细说明.

    消息体格式

      PAP协议的消息体是采用多段的方式提交请求的,即Content-Type类型为"multipart/related",到于具体的信息,可以参考RFC2387.整个PAP协议包包括三种结构,分别为

  • 控制实体(Control Entity):提供一些控制命令
  • 内容实体(Content Entity):提供传送的内容信息
  • 能力实体(Capabilities Entity):提供终端的支持的能力配置信息
  • 除了推送消息需要使用到三种消息以外,其它请求方法都只使用到控制实体包。这三种类型的包都是MIME类型格式,下面是一个请求包的具体格式

    Content-Type: multipart/related; boundary=asdlfkjiurwghasf;
    type="application/xml"

    --asdlfkjiurwghasf
    Content-Type: application/xml


    "http://www.wapforum.org/DTD/pap_2.0.dtd"
    []>

    ..control for PPG..

    --asdlfkjiurwghasf
    Content-Type: text/vnd.wap.si

    ..Service Indication push message example..

    --asdlfkjiurwghasf
    Content-Type: application/xml

    ..assumed client capabilities..

    --asdlfkjiurwghasf--

    控制实体介绍

      控制实体的定义如下

    | push-response
    | cancel-message
    | cancel-response
    | resultnotification-message
    | resultnotification-response
    | statusquery-message
    | statusquery-response
    | ccq-message
    | ccq-response
    | badmessage-response) >
    product-name CDATA #IMPLIED
    >

      它一共支持11种控制命令,这些命令都必须放在PAP节点下面,如:

      

    支持的11种控制命令分别如下:

    push-message :PI -> PPG ,发起一个Push请求
    push-response :PPG -> PI,PPG对Push请求的响应结果
    cancel-message :PI->PPG,取消消息的请求
    cancel-response :PPG -> PI,PPG对取消请求的响应结果
    resultnotification-message :PPG->PI,结果提醒消息,由PPG调用通过PUSH消息时提供的通知地址传送
    resultnotification-response:PI->PPG,PI端对PPG的结果提醒消息的响应
    statusquery-message :PI->PPG,状态查询消息,查询发送消息的当前状态
    statusquery-response :PPG->PI,PPG对查询请求的响应结果
    ccq-message :PI->PPG,发起一个终端能力查询请求
    ccq-response :PPG->PI,PPG对终端能力查询的响应结果
    badmessage-response:PPG->PI,PPG在接收到错误请求包的时候,返回的响应信息

    push-message介绍

    结构定义如下:


    push-id CDATA #REQUIRED
    replace-push-id CDATA #IMPLIED
    replace-method ( pending-only | all ) "all"
    deliver-before-timestamp %Datetime; #IMPLIED
    deliver-after-timestamp %Datetime; #IMPLIED
    source-reference CDATA #IMPLIED
    ppg-notify-requested-to CDATA #IMPLIED
    progress-notes-requested ( true | false ) "false"
    >


    address-value CDATA #REQUIRED
    >


    priority ( high | medium | low ) "medium"
    delivery-method ( confirmed | preferconfirmed
    | unconfirmed | notspecified ) "notspecified"
    network CDATA #IMPLIED
    network-required ( true | false ) "false"
    bearer CDATA #IMPLIED
    bearer-required ( true | false ) "false"
    >

      push-message节点是推送一个消息的控制节点,它有多个属性,含义如下:

    push-id:推送流水ID,由PI端创建管理,需要全局唯一,返回响应包、通知包会根据此ID来判断请求
    replace-push-id:替换推送ID,指被替换的旧PushID,多用于使用新的消息替换以提交却未发送的消息
    replace-method:替换的方法,有pending-only和all两种选项可选,all表示替换旧消息的所有接收者,pending-only则表示替换有可能被取消的接收者
    deliver-before-timestamp:发送终止时间,指超过指定的时间则不发送消息了,格式为标准的UTC时间:YYYY-MM-DDThh:mm:ssZ
    deliver-after-timestamp:发送的开始时间,须在指定的时间才能开始发送,格式为标准的UTC时间:YYYY-MM-DDThh:mm:ssZ
    source-reference:内容提供者的文本名称,PPG网关可能需要此参数判断PI的权限及能力
    ppg-notify-requested-to:PPG发送结果响应请求的Url地址
    progress-notes-requested:是否在响应包中包括处理日志信息
      address节点需要包括在push-message节点下,如果有多个接收人,则增加多个address节点即可,address-value是实际的接收地址,它可以是一个逻辑地址,具体的格式大致如下:
    wappush=12345678/type=PLMN@ppg.operator.com

      quality-of-service节点也须要放在push-message节点下,它描述了当前消息的各种发送属性,如:优先级、使用网络、承载体等,不同的网络或许有不同的参数,请咨询相应的运营商。

    具体的参数说明可以参考标准文档:wap-247

    push-response介绍


    push-id CDATA #REQUIRED
    sender-address CDATA #IMPLIED
    sender-name CDATA #IMPLIED
    reply-time %Datetime; #IMPLIED
    >

      push-response是PI提交push-message到PPG后,PPG返回的响应包结构,它有四个属性,如下:

    push-id:相关的push-id
    sender-address:发送者地址,一般是PPG的地址
    sender-name:发送者名称,一般是PPG的名称
    reply-time:应答时间,标准的UTC时间

    progress-note节点不多介绍,是属于处理日志节点

    response-result节点包含了所发送消息的响应结果,其定义如下:


    code CDATA #REQUIRED
    desc CDATA #IMPLIED
    >
      code是响应的结果,具体可参考标准文档的说明,desc则是相应的描述信息

      对于其它几个请求结构相对简单,此处不再说明,参考标准文档即可。

    HTTP请求处理说明

      PAP协议是基于HTTP协议,因此,建立一个PAP协议只需要发起一个HTTP请求即可,截取一段发送代码如下:

    Code
    //Pap请求
    HttpWebRequest papRequest = (HttpWebRequest)HttpWebRequest.Create(Config.ServiceUrl);
    papRequest.Method = "POST";
    papRequest.ContentType = "multipart/related; type=application/xml;boundary=" + IRequest.Boundary;
    papRequest.Headers.Add("Authorization", Config.EncPass);

    byte[] papData = rqeuestObj.GetBytes(Config.enc);

    Stream requestStream = papRequest.GetRequestStream();
    requestStream.Write(papData, 0, papData.Length);
    requestStream.Close();

    HttpWebResponse response = (HttpWebResponse)papRequest.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream(), Config.enc);
    ret = ReplaceXml(sr.ReadToEnd());
    sr.Close();

    主要设置几个属性,分别为Method、ContentType以及Authorization,对于前两个不作说明,Authorization则表示认证信息,有些PPG网关不需要认证信息,因此可以忽略这个属性。认证属性的值为Base编码的字串,格式为:Base baseString

    用户名和密码以这样的格式编写:UserName:Password,然后对这个串进行编码,放在Base 后面即可。表示基本的Base认证串。对于其它的代码就不多做解释了:)大家可以看源码。

    关于源码:

      目前仅实现了PAP协议的解析、生成等功能,未实现对数据发送的队列控制、流量控制等等,这些都需要进一步完善,如果各位有兴趣完善的话,希望也提交到项目里面咯:)

    下载地址:http://paplib.codeplex.com/

    下载本文
    显示全文
    专题