WAP PUSH分析(3)-Androidでの実装

Tian Haili @ CSDN

2012-06-30

 

SMS PDUとWSPの分析がAndroidに実装され、WBXMLによってカプセル化されたデータが取得され、ブロードキャスト「android.provider.Telephony.WAP_PUSH_RECEIVED」が発行されました。ネイティブ実装は、WAP PUSHSIおよびWAPPUSH SLのmimeTypeを使用したブロードキャストにまだ応答していません。つまり、WBXMLによってカプセル化されたPUSHデータの処理が不足しています。この記事では、Androidのネイティブ実装を分析および要約し、WAP PUSH SI / SLの実装リファレンスを提供します。

 

1.Androidでのネイティブ実装


著者は、SMS受信プロセスとSMS PDU / WSP / WBXMLのパッケージ形式について説明しているいくつかの記事を持っています。

 

要約は次のとおりです。

  1. RILで新しいSMSを受信し、android.telephony.SmsMessage.newFromCMT()を呼び出してPDUをデコードし、結果をSmsMessageに入れます。android.telephony.SmsMessage.newFromCMT()電話の種類に応じて、com.android.internal.telephony.gsm.SmsMessageまたはcom.android.internal.telephony.cdma.SmsMessageのnewFromCMT()を使用して、PDUデコードを実際に実現します。
  2. SmsDispatcher(特定の実装クラスGsmSmsDispatcher / CdmaSmsDispatcher)のdispatchMessage()を実行して、メッセージmsgを配布します。ターゲットポートがあり、ターゲットポートがWAP PUSH(SmsHeader.PORT_WAP_PUSH)の場合は、WapPushOverSms :: dispatchWapPdu()を使用して処理します。
  3. WapPushOverSms :: dispatchWapPdu()でWSPを解析して、ContentTypeに対応するMIMEタイプを取得します。サービス表示(SI)は「application / vnd.wap.sic」、サービス負荷(SL)は「application /vnd.wap.slc」です。SIおよびSLタイプの場合は、dispatchWapPdu_default()を呼び出します。

以下は、dispatchWapPdu_default()の実装です。

    private void dispatchWapPdu_default(byte[]pdu, int transactionId, int pduType,
                                        StringmimeType, int headerStartIndex, int headerLength) {
        byte[] header = new byte[headerLength];
        System.arraycopy(pdu, headerStartIndex,header, 0, header.length);
        int dataIndex = headerStartIndex +headerLength;
        byte[] data;
 
        data = new byte[pdu.length -dataIndex];
        System.arraycopy(pdu, dataIndex, data,0, data.length);
 
        Intent intent = newIntent(Intents.WAP_PUSH_RECEIVED_ACTION);
        intent.setType(mimeType);
        intent.putExtra("transactionId", transactionId);
        intent.putExtra("pduType",pduType);
        intent.putExtra("header",header);
        intent.putExtra("data",data);
 
        mSmsDispatcher.dispatch(intent,"android.permission.RECEIVE_WAP_PUSH");
    }


        上記はすべてフレームワークで処理されます。SI/ SLWBXMLによってカプセル化されたデータがフレームワークで解析され、ブロードキャストを通じてブロードキャストされていることがわかります。次に、mimeTypeによって識別される特定のビジネスの処理は、アプリケーション層の仕事です。mimeTypeが「application / vnd.wap.sic」(SI)および「application / vnd.wap.slc」(SL)のWAP_PUSH_RECEIVEDの処理は、Androidのネイティブ実装では実装されていません。

        ブロードキャストのインテントパラメータに注意してください。

  •  mimeType:“ application / vnd.wap.sic "or application / vnd.wap.slc";
  •  header:ContentTypeを識別するために使用される、WSPによって解析されたヘッダーには、すでにmimeTypeがあり、これには意味がありません。
  •  データ:WBXMLによってカプセル化されたSIまたはSLXMLデータ。

 

次の場合に限り、完全なWAPPUSHを実現します。

  •  mimeTypeが「application / vnd.wap.sic」(SI)および「application / vnd.wap.slc」(SL)のWAP_PUSH_RECEIVEDの処理を実現します。
  •  受信したブロードキャストでは、WBXMLによってカプセル化されたSI / SLが解析され、メッセージライブラリに挿入されます。

MMSでの「application / vnd.wap.mms-message」(MMS)タイプのWAP_PUSH_RECEIVED処理の実装を参照してください。

 

二、再理 "android.provider.Telephony.WAP_PUSH_RECEIVED"

 

「android.provider.Telephony.WAP_PUSH_RECEIVED」を処理するには、BroardcastReceiver実装クラスWapPushReceiverを定義し、「application / vnd.wap.sic」(SI)と「application / vnd.wap.slc」(SL)を追加します。 )WAP_PUSH_RECEIVED処理ステートメントのタイプ。

        <receiver android:name=".transaction.WapPushReceiver"
           android:permission="android.permission.BROADCAST_WAP_PUSH">
           <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
                <data android:mimeType="application/vnd.wap.sic" />
                <data android:mimeType="application/vnd.wap.slc" />
           </intent-filter>
        </receiver>

3.WapPushReceiverでのWBXML解析


ネイティブ実装のMMSでのPushReceiverの処理を参照し、次の実装を実行します。

  1. WapPushReceiverのonReceive()は、インテントの「data」パラメーターを介してWBXMLによってカプセル化されたPushDataを取得します。
  2. バックグラウンドでAsyncTaskを開始して、WBXMLによってカプセル化されたPushDataを解析し、PushData(XML形式)を解析します。
  3. PushDataをXML形式で解析して、URL /コンテンツ/信号などの情報を取得します。
  4. 3の結果に従って、メッセージデータベースに参加し、ユーザーに通知することを選択します。

ここで重要なのは、WBXML形式の解析です。MIUIROMを参照してWAP PUSHSMSのパッチ受け取ることができます これは、Xiaomi携帯電話用のWAPPUSH解析の実装です。WBXML解析のソースコードを参照できます。ただし、WBXMLで定義されたTAGと属性のサポートが不完全な場合、読者は必要に応じて必要なサポートを追加できます。

 

参照

1. Google Android source2.3.7_r1

        Androidネイティブ実装ソースコード

2.  WAPバイナリXMLContentフォーマット

        WBXML標準、必見!

3.  MIUIROMはWAPPUSHSMSパッチを受信します

        AndroidでのWAPPUSH解析の実装にはソースコードがありますが、解析は不完全です。

4.  SMS経由WAPプッシュ

        SMSを介したWAPPUSHの概要(英語)

5.  WAPプッシュSMSのエンコーディング

        WAP PUSHサービス表示パッケージの例(英語)

6.  ActiveXpertsSMSおよびMMSツールキットを使用してSMSWAPPushメッセージを送信する

    WAPPUSHを送信するためのツール。使用説明書です。実装の詳細はありませんが、WBXMLのトークンと属性の比較を参照できます。(英語)

 

おすすめ

転載: blog.csdn.net/thl789/article/details/7705494