목차
HTTP请求处理说明
关于源码:
데이터 베이스 MySQL 튜토리얼 Wap Push Access Protocol(PAP)介绍

Wap Push Access Protocol(PAP)介绍

Jun 07, 2016 pm 03:43 PM
access pap protocol push wap

最近因为某些项目的原因,需要实现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之间的关系如下图:

Wap Push Access Protocol(PAP)介绍

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

  Wap Push Access Protocol(PAP)介绍

  上图则是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  


br />          "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请求即可,截取一段发送代码如下:

 

Wap Push Access Protocol(PAP)介绍Wap Push Access Protocol(PAP)介绍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网关不需要认证信息,因此可以忽略这个属性。认证属性的值为Base64编码的字串,格式为:Base base64String

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

关于源码:

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

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

 

 

 

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Windows 11에서 백그라운드 애플리케이션을 비활성화하는 방법_Windows 11 튜토리얼에서 백그라운드 애플리케이션을 비활성화하는 방법 Windows 11에서 백그라운드 애플리케이션을 비활성화하는 방법_Windows 11 튜토리얼에서 백그라운드 애플리케이션을 비활성화하는 방법 May 07, 2024 pm 04:20 PM

1. Windows 11에서 설정을 엽니다. Win+I 단축키나 다른 방법을 사용할 수 있습니다. 2. 앱 섹션으로 이동하여 앱 및 기능을 클릭합니다. 3. 백그라운드에서 실행되는 것을 방지하려는 애플리케이션을 찾으세요. 점 3개 버튼을 클릭하고 고급 옵션을 선택합니다. 4. [백그라운드 애플리케이션 권한] 섹션을 찾아 원하는 값을 선택하세요. 기본적으로 Windows 11은 전원 최적화 모드를 설정합니다. 이를 통해 Windows는 애플리케이션이 백그라운드에서 작동하는 방식을 관리할 수 있습니다. 예를 들어, 배터리를 절약하기 위해 배터리 절약 모드를 활성화하면 시스템은 모든 앱을 자동으로 닫습니다. 5. 애플리케이션이 백그라운드에서 실행되는 것을 방지하려면 [안함]을 선택합니다. 프로그램이 알림을 보내지 않거나 데이터를 업데이트하지 못하는 경우 등을 확인할 수 있습니다.

DeepSeek PDF를 변환하는 방법 DeepSeek PDF를 변환하는 방법 Feb 19, 2025 pm 05:24 PM

DeepSeek은 파일을 PDF로 직접 변환 할 수 없습니다. 파일 유형에 따라 공통 문서 (Word, Excel, PowerPoint) : Microsoft Office, LibreOffice 및 기타 소프트웨어를 사용하여 PDF로 내보내십시오. 이미지 : 이미지 뷰어 또는 이미지 처리 소프트웨어를 사용하여 PDF로 저장하십시오. 웹 페이지 : 브라우저의 "PDF로 인쇄"기능 또는 전용 웹 페이지에서 PDF 도구를 사용하십시오. 드문 형식 : 오른쪽 변환기를 찾아 PDF로 변환하십시오. 올바른 도구를 선택하고 실제 상황에 따라 계획을 개발하는 것이 중요합니다.

iPhone에서 카메라 및 마이크에 대한 접근을 허용할 수 없습니다 iPhone에서 카메라 및 마이크에 대한 접근을 허용할 수 없습니다 Apr 23, 2024 am 11:13 AM

앱을 사용하려고 할 때 "카메라 및 마이크에 대한 접근을 허용할 수 없습니다"라는 메시지가 표시됩니까? 일반적으로 필요에 따라 특정 사람에게 카메라 및 마이크 권한을 부여합니다. 단, 권한을 거부할 경우 카메라와 마이크가 작동하지 않으며 대신 이런 오류 메시지가 표시됩니다. 이 문제를 해결하는 것은 매우 기본적이며 1~2분 안에 완료할 수 있습니다. 수정 1 – 카메라, 마이크 권한 제공 설정에서 직접 필요한 카메라 및 마이크 권한을 제공할 수 있습니다. 1단계 - 설정 탭으로 이동합니다. 2단계 – 개인 정보 보호 및 보안 패널을 엽니다. 3단계 - 거기에서 "카메라" 권한을 켭니다. 4단계 - 내부에서 휴대폰 카메라에 대한 권한을 요청한 앱 목록을 찾을 수 있습니다. 5단계 - 지정된 앱의 "카메라"를 엽니다.

자바에서 dao는 무엇을 의미합니까? 자바에서 dao는 무엇을 의미합니까? Apr 21, 2024 am 02:08 AM

Java의 DAO(Data Access Object)는 애플리케이션 코드와 지속성 계층을 분리하는 데 사용되며 다음과 같은 장점이 있습니다. 분리: 애플리케이션 로직에서 독립되어 수정이 쉽습니다. 캡슐화: 데이터베이스 액세스 세부 정보를 숨기고 데이터베이스와의 상호 작용을 단순화합니다. 확장성: 새로운 데이터베이스 또는 지속성 기술을 지원하기 위해 쉽게 확장할 수 있습니다. DAO를 사용하면 애플리케이션은 데이터베이스 세부 정보를 직접 처리하지 않고도 엔터티 생성, 읽기, 업데이트 및 삭제와 같은 데이터베이스 작업을 수행하는 메서드를 호출할 수 있습니다.

Java에서 필드는 무엇을 의미합니까? Java에서 필드는 무엇을 의미합니까? Apr 25, 2024 pm 10:18 PM

Java에서 "필드"는 데이터나 상태를 저장하는 데 사용되는 클래스나 인터페이스의 데이터 멤버입니다. 필드의 속성에는 유형(Java 데이터 유형일 수 있음), 액세스 권한, 정적(인스턴스가 아닌 클래스에 속함), 최종(불변) 및 임시(직렬화되지 않음)가 포함됩니다. 필드는 객체 데이터 저장, 객체 상태 유지 등 클래스나 인터페이스의 상태 정보를 저장하는 데 사용됩니다.

Oracle 저장 프로시저 실행 계획을 읽는 방법 Oracle 저장 프로시저 실행 계획을 읽는 방법 Apr 18, 2024 pm 10:18 PM

Oracle 저장 프로시저 실행 계획은 액세스 경로, 예상 행 수, 조인 순서 및 비용을 포함한 실행 정보를 제공합니다. 실행 계획을 보려면 EXPLAIN PLAN 명령을 실행하고 "실행 계획" 섹션을 찾으세요. 실행 계획에는 헤더와 본문이 포함되어 있으며 ID, 작업 유형, 행 수, 비용, 액세스 경로, 필터 조건, 관련 테이블 및 인덱스, 연결이 있는 경우 연결 순서를 자세히 표시합니다.

Java 리플렉션 메커니즘은 클래스의 동작을 어떻게 수정합니까? Java 리플렉션 메커니즘은 클래스의 동작을 어떻게 수정합니까? May 03, 2024 pm 06:15 PM

Java 리플렉션 메커니즘을 사용하면 프로그램은 소스 코드를 수정하지 않고도 클래스의 동작을 동적으로 수정할 수 있습니다. Class 객체를 통해 클래스를 조작하면 newInstance()를 통해 인스턴스를 생성하고, 프라이빗 필드 값을 수정하고, 프라이빗 메서드를 호출하는 등의 작업을 수행할 수 있습니다. 그러나 리플렉션은 예상치 못한 동작 및 보안 문제를 일으킬 수 있고 성능 오버헤드가 있으므로 주의해서 사용해야 합니다.

vue에서 도메인 간 iframe을 사용하는 방법 vue에서 도메인 간 iframe을 사용하는 방법 May 02, 2024 pm 10:48 PM

Vue에서 iframe 교차 도메인 문제를 해결하는 방법: CORS: 백엔드 서버에서 CORS 지원을 활성화하고 XMLHttpRequest를 사용하거나 API를 가져와 Vue에서 CORS 요청을 보냅니다. JSONP: 백엔드 서버의 JSONP 엔드포인트를 사용하여 Vue에서 JSONP 스크립트를 동적으로 로드합니다. 프록시 서버: 요청을 전달하도록 프록시 서버를 설정하고, Vue에서 타사 라이브러리(예: axios)를 사용하여 요청을 보내고, 프록시 서버 URL을 설정합니다.

See all articles