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

藍芽map協議原始碼解析

 MAP協議

使用場景:智慧車載中同步簡訊,彩信等資訊

1 協議概述

協議程式碼路徑: 

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

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

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

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

map這個包中檔案如下,


MAP和PBAP協議開發流程以及細節幾乎完全一樣。

 2開發步驟

1) 構造BluetoothMasClient物件,

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

3詳細開發過程

3.1構造BluetoothMasClient

BluetoothMasClient的構造方法如下,

public BluetoothMasClient(BluetoothDevice device, SdpMasRecord mas, Handler callback) {
        mDevice = device;
        mMas = mas;
        mCallback = callback;

        mPath = new ArrayDeque<String>();
    }

有三個引數, device當然是遠端藍芽裝置了,這個很容易獲取,

mas 是遠端藍芽裝置的一個mas代理,是如何獲取的呢?

Callback 是Handler物件,主要用於一些訊息的回撥.

通過註冊廣播,接收廣播可以獲取SdpMasRecord物件,

 註冊廣播

IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_SDP_RECORD);
registerReceiver(mReceiver, filter);

 接收廣播

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
 @Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equals(BluetoothDevice.ACTION_SDP_RECORD)){
       BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        ParcelUuid uuid = intent.getParcelableExtra(BluetoothDevice.EXTRA_UUID); 
        if(uuid.equals(BluetoothUuid.MAS)){
             SdpMasRecord masrec =
 intent.getParcelableExtra(BluetoothDevice.EXTRA_SDP_RECORD);
             BluetoothMasClient mapclient = new BluetoothMasClient(mDevice, masrec, 
                            mMapHandler);
                }
    };

3.2方法以及回撥處理

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

方法

回撥訊息

connect

連線裝置

EVENT_CONNECT

setFolderRoot

設定路徑/

根目錄/子目錄/父目錄

EVENT_SET_PATH

setFolderUp

setFolderDown

getMessagesListing

獲取簡訊

EVENT_GET_MESSAGES_LISTING

getMessagesListingSize

簡訊條數

EVENT_GET_MESSAGES_LISTING_SIZE

getMessage

獲取當前檔案簡訊

EVENT_GET_MESSAGE

setMessageReadStatus

設定簡訊是否已讀

EVENT_SET_MESSAGE_STATUS

setMessageDeletedStatus

設定簡訊是否刪除

EVENT_SET_MESSAGE_STATUS

pushMessage

新建簡訊

EVENT_PUSH_MESSAGE

updateInbox

更新簡訊箱

EVENT_UPDATE_INBOX

已讀簡訊/未讀簡訊/草稿箱通過setFolderRoot方法來設定,路徑分別如下,

String inbox = "telecom/msg/inbox";
String outbox = "telecom/msg/outbox";
String draft= "telecom/msg/draft";

可以通過setMessageReadStatus方法設定同步的簡訊的狀態(已讀/未讀)

可以通過setMessageDeletedStatus方法設定同步的簡訊的狀態(刪除/不刪除)

還有通過pushMessage來新建簡訊,通過updateInbox來更新簡訊箱。


同步簡訊的詳細開發如下,

 1,首先連線裝置,呼叫connect方法,
mapclient. connect()
2,設定路徑,呼叫setFolderRoot方法,還需要處理EVENT_SET_PATH訊息
mapclient. setFolderRoot()

3,呼叫getMessagesListing 方法同步短息
mapclient.getMessagesListing()
4,處理EVENT_GET_MESSAGES_LISTING回撥訊息
ArrayList<BluetoothMapMessage> getMessagesListing; // 儲存同步簡訊
    BluetoothMapBmessage getMessage; //儲存同步簡訊
private final Handler mMapHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
              case BluetoothMasClient.EVENT_GET_MESSAGES_LISTING: 
                getMessagesListing = (ArrayList< BluetoothMapMessage >) msg.obj;
                    break;
                }
};

到此, getMessagesListing就儲存了同步的簡訊,後續就可以進行處理了。

 4流程圖

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


流程圖比同步聯絡人更簡單,每條簡訊對應一個BluetoothMapMessage物件。同步完之後, BluetoothMasClient中的SessionHandler物件首先獲取BluetoothMapMessage陣列,然後通過EVENT_GET_MESSAGES_LISTING訊息將BluetoothMapMessage發出,因此在開發時處理該訊息就可以獲取同步的簡訊。

5 BluetoothMapMessage簡析

檢視BluetoothMapMessage原始碼,可以看到同步簡訊所儲存的資訊,

private final String mHandle;
private final String mSubject;
private final Date mDateTime;
private final String mSenderName;
private final String mSenderAddressing;
private final String mReplytoAddressing;
private final String mRecipientName;
private final String mRecipientAddressing;
private final Type mType;
private final int mSize;
private final boolean mText;
private final ReceptionStatus mReceptionStatus;
private final int mAttachmentSize;
private final boolean mPriority;
private final boolean mRead;
private final boolean mSent;
private final boolean mProtected;

對應的get方法如下,



每條簡訊的資訊都在BluetoothMapMessage構造方法中賦值,並且每個字元/boolean值都有對應的獲取/判斷方法,一一對應,相對來說,比pbap協議的要簡單得多。

相關推薦

map協議原始碼解析

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

pbap協議原始碼解析

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

通話功能原始碼解析

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)模型一樣,藍芽技術的協議體系也採用了分層結構,從底層到高層形成了藍芽協議棧,各層協議定義了所完成的功能和使用資料分組格式,以保證藍芽產品間的互操作性。 藍芽協議主要有傳輸協議、中介協議、應用協議; 傳輸協議負責藍芽裝

set\list\map部分原始碼解析

一:整體繼承的關係 List、Set實現Collection介面。Map並沒有實現任何介面,但內部聚合了一個Collection物件   二:陣列與集合的不同 陣列只能存放單一的資料型別、集合可以儲存和運算元目不固定的一組資料 所有的JAVA集合

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

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. 協議層

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