1. 程式人生 > >藍芽pbap協議原始碼解析

藍芽pbap協議原始碼解析

PBAP協議

使用場景:智慧車載中同步聯絡人等資訊

其實,不僅可以同步聯絡人,還可以同步通話記錄等資訊。

1.協議概述

協議程式碼路徑: 

frameworks\opt\bluetooth\src\android\bluetooth\client\pbap這個包中

Jar包名稱,android.bluetooth.client. pbap

所以進行開發時,在mk檔案中需要新增這個包,

並且,在AndroidManifest檔案中必須匯入Obex庫,<uses-libraryandroid:name="javax.obex" />

pbap這個包中檔案如下,


使用pbap協議同步聯絡人/通話記錄時的開發流程和其他的協議不一樣,並且pbap協議只有客戶端,沒有服務端. BluetoothPbapClient是其客戶端,在此先不看其客戶端的方法。

2開發步驟

1) 構造BluetoothPbapClient物件,

2) 呼叫BluetoothPbapClient物件方法,處理對應的回撥訊息。

3詳細開發過程

3.1構造BluetoothPbapClient

BluetoothPbapClient如何構造呢?原始碼有2個構造方法,其中一種如下 ,

public BluetoothPbapClient(BluetoothDevice device, Handler handler) { 
        mClientHandler = handler; 
        mSessionHandler = new SessionHandler(this); 
        addSdp();
        mSession = new BluetoothPbapSession(device, mSessionHandler);
    }

從中可以看到,構造方法有2個引數, device當然是遠端藍芽裝置了,這個很容易獲取,

另外一個Handler物件,主要用於一些訊息的回撥,那就先新建一個Handler物件。

所以可以很簡單的進行構造,

mPbapClient = new BluetoothPbapClient(device, mPbapHandler);

3.2方法以及回撥處理

客戶端BluetoothPbapClient的主要方法以及對應的回撥訊息如下,

方法

回撥訊息

setPhoneBookFolderRoot

刷選同步條件/

根目錄/子目錄/父目錄

EVENT_SET_PHONE_BOOK_DONE

setPhoneBookFolderUp

setPhoneBookFolderDown

pullPhoneBookSize

電話本大小

EVENT_PULL_PHONE_BOOK_SIZE_DONE

pullVcardListingSize

檔案數量

EVENT_PULL_VCARD_LISTING_SIZE_DONE

pullPhoneBook

同步電話本

EVENT_PULL_PHONE_BOOK_DONE

pullVcardListing

同步檔案

EVENT_PULL_VCARD_LISTING_DONE

pullVcardEntry

同步單個檔案

EVENT_PULL_VCARD_DONE

BluetoothPbapClient一些字串定義如下,

public static final String ICH_PATH = "telecom/ich.vcf"; // 手機來電記錄
public static final String OCH_PATH = "telecom/och.vcf"; // 手機去電記錄
public static final String MCH_PATH = "telecom/mch.vcf";// 手機未接電話記錄
public static final String CCH_PATH = "telecom/cch.vcf";  // 所有通話記錄
public static final String PB_PATH = "telecom/pb.vcf";      // 手機聯絡人

對應的SIM卡上的通話記錄以及聯絡人路徑如下,

public static final String SIM_ICH_PATH = "SIM1/telecom/ich.vcf";
public static final String SIM_OCH_PATH = "SIM1/telecom/och.vcf";
public static final String SIM_MCH_PATH = "SIM1/telecom/mch.vcf";
public static final String SIM_CCH_PATH = "SIM1/telecom/cch.vcf";
public static final String SIM_PB_PATH = "SIM1/telecom/pb.vcf";

同步聯絡人的詳細開發如下,

 設定路徑,呼叫pullPhoneBook方法,

private String mDownloadSpinner = "telecom/pb.vcf";
mPbapClient. pullPhoneBook(mDownloadSpinner);

 回撥處理

ArrayList<VCardEntry>pullPhoneBook; // 儲存同步的聯絡人
private final Handler mPbapHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
               case BluetoothPbapClient.EVENT_PULL_PHONE_BOOK_DONE: 
                	pullPhoneBook = (ArrayList<VCardEntry>) msg.obj;
                    break;
                }
};

到此, pullPhoneBook就儲存了同步的聯絡人,後續就可以進行處理了。

同樣的,也可以設定其他路徑以方法同步通話記錄等。

ArrayList<BluetoothPbapCard> pullVcardListing = null; // 儲存同步檔案
VCardEntry pullVcardEntry = null;  // 儲存同步單個檔案

 4流程圖

同步的方法呼叫流程幾乎是一模一樣的,所以以pullPhoneBook方法為例,




流程圖很簡單,沒有跨程序通訊,只是單開一個執行緒同步聯絡人,每個聯絡人對應一個VCardEntry物件。VCardEntry物件在VCardEntryConstructor類中建立,在BluetoothPbapVcardList的內部類CardEntryHandler的onEntryCreated方法新增到名為mCards的ArrayList中。同步完之後, BluetoothPbapClient中的SessionHandler物件首先獲取mCards,然後通過EVENT_PULL_PHONE_BOOK_DONE訊息將mCards(VCardEntry陣列)發出,因此在開發時處理該訊息就可以獲取同步的聯絡人。


5 VCardEntry簡析

VCardEntry可以儲存聯絡人/通話記錄的各種資訊,看列舉EntryLabel

public enum EntryLabel {

        NAME,

        PHONE,

        EMAIL,

        POSTAL_ADDRESS,

        ORGANIZATION,

        IM,

        PHOTO,

        WEBSITE,

        SIP,

        NICKNAME,

        NOTE,

        BIRTHDAY,

        ANNIVERSARY,

        ANDROID_CUSTOM

    }

    

每一個列舉物件都對應一個聯絡人資訊,比如名字/電話號碼,也對應一個VCardEntry的內部類,它們都繼承內部介面EntryElement。

看下VCardParser_V21類parseOneVCard方法

private boolean parseOneVCard() throws IOException, VCardException {
        // reset for this entire vCard.
        mCurrentEncoding = DEFAULT_ENCODING;
        mCurrentCharset = DEFAULT_CHARSET;

        boolean allowGarbage = false;
        if (!readBeginVCard(allowGarbage)) {
            return false;
        }
        for (VCardInterpreter interpreter : mInterpreterList) {
            interpreter.onEntryStarted();
        }
        parseItems();
        for (VCardInterpreter interpreter : mInterpreterList) {
            interpreter.onEntryEnded();
        }
        return true;
    }

onEntryStarted最後會構造VCardEntry, parseItems會呼叫VCardEntry的addProperty方法完成各種資訊的儲存,最後呼叫onEntryEnded將所有VCardEntry物件打包到ArrayList中。

在這14個列舉中,並沒有時間資訊,即使是獲取通話記錄,也並沒有時間的資訊。如何同步時間資訊呢?

檢視PBAP協議,有一個這樣的欄位,X-IRMC-CALL-DATETIME,說明可以同步時間資訊的。通過對VCardParserImpl_V21和VCardEntry的addProperty方法進行除錯,發現X-IRMC-CALL-DATETIME引數是有輸出的,只是VCardEntry中沒有該列舉和對應的類而已。在VCardEntry中新增列舉和對應的內部類就可以實現同步時間的功能。

  1,,在列舉EntryLabel最後新增一項,

DATETIME

  2,, 新增對應的內部類

public static class DatetimeData implements EntryElement {
        private final String mDatetime;

        public DatetimeData(String datetime) {
            mDatetime = datetime;
        }
        @Override
        public EntryLabel getEntryLabel() {
            return EntryLabel. DATETIME;
        }
        @Override
        public boolean isEmpty() {
            return TextUtils.isEmpty(mDatetime);
        }
        @Override
        public void constructInsertOperation(List<ContentProviderOperation>
 operationList, int backReferenceIndex) { 
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof DatetimeData)) {
                return false;
            }
            DatetimeData datetimeData = (DatetimeData) obj;
            return TextUtils.equals(mDatetime, datetimeData.mDatetime);
        }
        @Override
        public int hashCode() {
            return mDatetime != null ? mDatetime.hashCode() : 0;
        }
        @Override
        public String toString() {
            return "call datetime: " + mDatetime;
        }
        public String getCallDatetime() {
            return mDatetime;
        }
    }
 3,addProperty 方法
if(propertyName.equals(VCardConstants.PROPERTY_ DATETIME)) {
            mDatetimeData = new DatetimeData(propValue);  
}

4,,新增getter方法

public final String getCallDatetime() {
     return mCallDatetimeData != null ? mCallDatetimeData.mCallDatetime : null;
  }
在VCardConstants類中新增字串,
public static final String PROPERTY_ DATETIME = "X-IRMC-CALL-DATETIME";

相關推薦

pbap協議原始碼解析

PBAP協議 使用場景:智慧車載中同步聯絡人等資訊 其實,不僅可以同步聯絡人,還可以同步通話記錄等資訊。 1.協議概述 協議程式碼路徑:  frameworks\opt\bluetooth\src\android\bluetooth\client\pbap這個包中 Jar

map協議原始碼解析

 MAP協議 使用場景:智慧車載中同步簡訊,彩信等資訊 1 協議概述 協議程式碼路徑:  frameworks\opt\bluetooth\src\android\bluetooth\client\ map這個包中 Jar包名稱,android.bluetooth.cli

通話功能原始碼解析

3 藍芽耳機服務 在開啟藍芽過程中,會開啟一些對應的服務,在此只將和通話相關的一個服務, HeadsetClientService。手機上只有開啟了這個服務,才可以將該手機當作一個藍芽耳機,通話時聲音才可以傳輸過來。 3.1 準備 首先在啟動apk時,會首先啟動該apk的A

bluetooth() AVRCP協議概念及程式碼流程解析

一 概念   AVRCP全稱:The Audio/Video Remote Control Profile (AVRCP) 翻譯成中文就是:音視訊遠端控制協議。概念:AVRCP定義了藍芽裝置之間的音視訊傳輸的特點和流程,來確保不同藍芽裝置之間音視訊傳輸控制的相容。一般包括暫停,停止,播放,音量控制等遠端控制

學習(三)-- 低功耗(BLE)協議

BLE協議棧為什麼要分層?怎麼理解BLE“連線”?如果BLE協議只有ATT層沒有GATT層會發生什麼? 協議棧框架  一般而言,我們把某個協議的實現程式碼稱為協議棧(protocol stack),BLE協議棧就是實現低功耗藍芽協議的程式碼,理解和掌握BLE協議是實現BLE協議棧的前

HFP協議AT命令流程

藍芽HFP協議主要是指HF和AG之間的信令互動,我們知道藍芽耳機和手機配對之後,耳機會發三個最基本的AT命令,分別是 AT+BRSF, AT+CIND=?, AT+CIND? 協議棧接收AT命令的流程 1 BTA層從rfcomn接收藍芽耳機發送過來的AT命令,在bta_

GATT協議介紹

在這之前我們得先了解一下一些專業詞彙: 1、PROFILE profile可以理解為一種規範,一個標準的通訊協議,它存在於從機中。藍芽組織規定了一些標準的profile,例如 HID OVER GATT ,防丟器 ,心率計等。每個profile中會包含多個service,每個

相關協議

藍芽協議是藍芽裝置間交換資訊所應該遵守的規則。與開放系統互聯(OSI)模型一樣,藍芽技術的協議體系也採用了分層結構,從底層到高層形成了藍芽協議棧,各層協議定義了所完成的功能和使用資料分組格式,以保證藍芽產品間的互操作性。 藍芽協議主要有傳輸協議、中介協議、應用協議; 傳輸協議負責藍芽裝

上層協議,服務端的啟動,獲取以及裝置的連線

1,藍芽協議/服務端的啟動 上一篇文章中,分析了Bluetooth.apk啟動過程,啟動Bluetooth.apk時,一般啟動了AdapterService這一對應的服務。檢視package/app/Bluetooth的原始碼,裡面主要是一些具體的協議,其中每一個協議對應一

微信Airsync協議demo工程實現

基於Ti CC2541 SDK自帶的simpleBLEPeripheral工程實現微信藍芽Airsync協議,同時支援微信串列埠透傳和一般APP串列埠透傳。相關原始碼和開發資料請閱讀《微信藍芽開發板體驗

TIBLE 協議棧程式碼學習——OSAL(上)

TI的藍芽4.0BLE協議棧為BLE-CC254x-1.4.0,即現在的版本是1.4版本的。可以從TI官方下載或從附件中下載安裝,預設是安裝在C盤中。因為上一篇博文提到進行空中韌體升級,當時沒有安裝在C盤下,死活生成不了bin檔案,改在C盤下生成了。所以,我個人建議,還是

mesh協議初讀

藍芽mesh協議棧共8層,由上到下分別是ModelLayer,foundation model layer,Access layer,upper transport layer,lower transportlayer,network layer,bear layer,Blu

ANDROID4.0開發_開發例項原始碼下載

一個整合目前主流藍芽的demo、android藍芽4.0開發、專案中使用到了搜尋BLE終端和讀寫BLE終端、另外還有在程式裡面開房藍芽、在Demo裡面還處理了收到BLE終端資料互動的事件、程式碼裡都有中文註釋、要讀性應該非常好的、應該會對開發有一定幫助、有興趣的哥們可以下

CoreBluetooth掃描協議問題

ios藍芽協議比較簡單,實現一些常用的功能只需要呼叫相對的方法就會觸發相應的協議,不過在ios8中呼叫掃描方法卻無法觸發相對應的協議,不知道為什麼? 解決方法如下: //開始掃瞄 -(void)sc

解析(3):BLE協議解析

轉自http://www.wowotech.net/bluetooth/ble_stack_overview.html 1. 前言 本文從協議棧設計者的角度,思考如下問題: 為什麼會有藍芽協議棧(Why)? 怎樣實現藍芽協議棧(How)? 藍芽協議棧的最終樣子是什麼(

解析(2):協議架構分析

轉自http://www.wowotech.net/bluetooth/bt_protocol_arch.html   1. 前言   本文是藍芽解析的第二篇文章,在part1的基礎上,從整體架構的角度,瞭解藍芽協議的組成,以便加深對藍芽的理解。 2. 協議層

協議 HFP,HSP,A2DP,AVRCP,OPP,PBAP

簡介:   HSP(手機規格)– 提供手機(行動電話)與耳機之間通訊所需的基本功能。   HFP(擴音規格)– 在 HSP 的基礎上增加了某些擴充套件功能,原來只用於從固定車載擴音裝置來控制行動電話。   A2DP(高階音訊傳送規格)– 允許傳輸

檔案傳輸之obex層之上的分析【Android原始碼解析

 在上節中我們仔細分析了藍芽檔案傳輸過程中涉及到的UI介面,最終定格在藍芽裝置掃描的介面,我們只要選擇自己想要傳輸的藍芽裝置就可以進行藍芽檔案的傳輸了。那就是這樣一個簡單的裝置選擇的點選會引發哪些

nrf51822 BLE 4.0 低功耗協議 解析(一)

參考文件: 《TI 2013研討會藍芽4.0講解部分PPT 20130508.pdf》重點 《TI_BT-LE-TRAINNING.PDF》 《05_BLE Intro.pdf》 BLE: Bluetooth Low Energy 協議棧結構和配置

無線通訊原理及協議棧(ZigBee、等)解析

1、天線 說起無線電通訊,不可不提起天線。 在無線電裝置中,用來輻射和接收無線電波的裝置稱為天線。 在發射端,發射機產生的已調製的高頻振盪電流(能量)經饋電(指被控制裝置向控制點的送電,即對一個使用者