Android 藍牙開發(fā)(1)

聲明

普通藍牙設備官方文檔

Android 平臺包含藍牙網(wǎng)絡堆棧支持鲤嫡,憑借此支持钙畔,設備能以無線方式與其他藍牙設備交換數(shù)據(jù)蕴忆。應用框架提供了通過 Android Bluetooth API 訪問藍牙功能的途徑茧跋。使用 Bluetooth API Android 應用可以執(zhí)行下面的操作:

  • 掃描其他藍牙設備
  • 查詢本地藍牙適配器的配對藍牙設備
  • 建立 RFCOMM 通道
  • 通過服務發(fā)現(xiàn)連接到其他設備
  • 與其他設備進行雙向數(shù)據(jù)傳輸
  • 管理多個連接

傳統(tǒng)藍牙適用于電池使用強度較大的操作慰丛,例如 Android 設備之間的流傳輸和通信等。針對具有低功耗要求的藍牙設備瘾杭,Android 4.3(API 18)中引入了面向低功耗藍牙的 API 支持诅病。

基礎知識

使用 Android Bluetooth API 來完成使用藍牙進行通信的四項主要任務:設置藍牙查找局部區(qū)域內(nèi)的配對設備或可用設備粥烁、連接設備贤笆,以及在設備之間傳輸數(shù)據(jù)

關于藍牙的 API 在 android.bluetooth 包中讨阻,下面介紹一下和藍牙相關的主要類

BluetoothAdapter

本地藍牙適配器芥永,是所有藍牙交互的入口點,表示藍牙設備自身的一個藍牙設備適配器钝吮,整個系統(tǒng)只有一個藍牙適配器埋涧。通過它可以發(fā)現(xiàn)其他藍牙設備,查詢綁定(配對)設備的列表奇瘦,使用已知的 Mac 地址實例化 BluetoothDevice 以及創(chuàng)建 BluetoothServerSocket 用來偵聽來自其他設備的通信棘催。

BluetoothDevice

表示遠程的藍牙設備。利用它可以通過 BluetoothSocket 請求與某個遠程設備建立連接耳标,或查詢有關該設備的信息醇坝,例如設備的名稱、地址次坡、類和綁定狀態(tài)等呼猪。

BluetoothSocket

表示藍牙套接字接口(與 TCP Socket 相似)。這是允許應用通過 InputStreamOutputStream 與其他藍牙設備交換數(shù)據(jù)的節(jié)點砸琅。正是利用這個對象來完成藍牙設備間的數(shù)據(jù)交換宋距,

BluetoothServerSocket

表示用于偵聽傳入請求的開發(fā)服務器套接字(類似于 TCP ServerSocket)要連接兩臺 Android 設備,其中一臺設備必須使用此類開發(fā)的一個服務器套接字明棍。當一臺遠程藍牙設備向此設備發(fā)出連接請求時乡革,BluetoothServerSocket 將會在接受連接后返回已連接的 BluethoothSocket寇僧。

BluetoothClass

描述藍牙設備的一般特性和功能摊腋。這是一組只讀屬性沸版,用于定義設備的主要和次要設備類及其服務。不過兴蒸,它不能可靠地描述設備支持的所有藍牙配置文件和服務视粮,而是適合作為設備類型提示。

BluetoothProfile

表示藍牙配置文件的接口橙凳。藍牙配置文件是適用于設備間藍牙通信的無線接口規(guī)范蕾殴。免提配置文件便是一個示例。如需了解關于配置文件的詳細討論岛啸,參考下面配置文件的講解

BluetoothHeadset

提供藍牙耳機支持钓觉,以便與手機配合使用。其中包括藍牙耳機和免提(1.5版)配置文件坚踩。BluetoothProfile 的實現(xiàn)類

BlutoothA2dp
定義高質(zhì)量音頻如何通過藍牙連接和流式傳輸荡灾,從一臺設備傳輸?shù)搅硪慌_設備∷仓“A2DP”代表高級音頻分發(fā)配置文件批幌。是 BluetoothProfile 的實現(xiàn)類

BluetoothHealth
表示用于控制藍牙服務的健康設備配置文件代理。 BluetoothProfile 的實現(xiàn)類嗓节。

BluetoothGatt

BluetoothProfile 的實現(xiàn)類荧缘。與低功耗藍牙通信有關的配置文件代理

BluetoothHealthCallback
用于實現(xiàn) BluetoothHealth 回調(diào)的抽象類。必須擴展此類并實現(xiàn)回調(diào)方法拦宣,以接收關于應用注冊狀態(tài)和藍牙通道狀態(tài)變化的更新內(nèi)容截粗。
BluetoothHealthAppConfiguration
表示第三方藍牙健康應用注冊的應用配置,以便與遠程藍牙健康設備通信
BluetoothProfile.ServiceListener
在 BluetoothProfile IPC 客戶端連接到服務(即鸵隧,運行特定配置文件的內(nèi)部服務)或斷開服務連接時向其發(fā)送通知的接口桐愉。

藍牙權限

使用藍牙必須聲明權限 BLUETOOTH 才可以執(zhí)行藍牙通信。

 <mainifest>
    <uses-permission android:name = "android.permission.BLUETOOTH"/>
    <!--啟用應用啟動設備發(fā)現(xiàn)或者操作藍牙設備的超級管理員-->
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
</mainifest>

設置藍牙

  1. 獲取藍牙適配器
    所有的藍牙 Activity 都是需要 BluetoothAdapter 的掰派。獲取 BluetoothAdapter 調(diào)用 BluetoothAdapter 的靜態(tài)方法 getDefaultAdapter() 方法从诲。會返回一個表示設備自身的藍牙適配器(藍牙無線裝置)的 BluetoothAdapter。
    整個系統(tǒng)有一個藍牙適配器靡羡,我們的應用可以通過 BluetoothAdapter 這個對象與之交互系洛。如果 getDefaultAdapter()返回 null 則說明該設備不支持藍牙
    
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if(mBluetoothAdapter == null){
        // 說明此設備不支持藍牙操作
    }
  1. 啟用藍牙
    需要確認是否已經(jīng)開啟藍牙isEnabled()略步。返回 false 則說明藍牙處于關閉狀態(tài)描扯。請求啟用藍牙。使用 ACTION_REQUEST_ENABLE 操作 Intent 調(diào)用 startActivityForResult()將通過系統(tǒng)設置發(fā)出啟用藍牙的請求趟薄。也可以通過 mBluetoothAdapter.enable() 直接打開藍牙绽诚。
   // 沒有開始藍牙
   if(!mBluetoothAdapter.isEnabled()){
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent,REQUEST_ENBLE_BT);
   }

我們的應用也可以選擇偵聽 ACTION_STATE_CHANGED 廣播 Intent。每當藍牙狀態(tài)發(fā)生變化時,系統(tǒng)會廣播此 Intent恩够。此廣播包含額外字段 EXTRA_STATEEXTRA_PREVIOUS_STATE 分別表示新的和舊的藍牙狀態(tài)卒落。

查找設備

使用 BluetoothAdapter 可以通過設備發(fā)現(xiàn)或通過查詢配對設備的列表來查找遠程藍牙設備。
設備發(fā)現(xiàn)是一個掃描過程蜂桶,它會搜索局部區(qū)域內(nèi)已啟用藍牙功能的設備儡毕,然后請求一些關于各臺設備的信息。這個過程也稱為發(fā)現(xiàn)扑媚、查詢腰湾、掃描。局部區(qū)域內(nèi)的藍牙設備僅在其當前已啟用可檢測性時才會響應發(fā)現(xiàn)請求疆股。如果設備可以檢測到费坊,它將通過共享一些信息(例如設備名稱、類及其唯一MAC地址)來響應發(fā)現(xiàn)請求旬痹。利用此信息葵萎,執(zhí)行發(fā)現(xiàn)的設備可以選擇發(fā)起到被發(fā)現(xiàn)設備的連接。

在首次與遠程設備建立連接后唱凯,將會自動向用戶顯示配對請求羡忘。設備完成配對后,將會保存關于該設備的基本信息(如 設備名稱磕昼、MAC 地址)卷雕。并且可以使用 Bluetooth API 讀取這些信息。利用遠程設備的已知 Mac 地址可以隨時向其發(fā)起連接票从,而不需執(zhí)行發(fā)現(xiàn)操作(假定該設備處于有效范圍內(nèi))漫雕。

被配對和被連接之間存在差別被配對意味著兩臺設備知曉彼此的存在峰鄙,具有可用于身份驗證的共享鏈路密鑰浸间,并且能夠與彼此建立加密連接。被連接意味著設備當前共享一個 RFCOMM 通道吟榴,并且能夠向彼此傳輸數(shù)據(jù)魁蒜。當前的 Android Bluetooth API 要求對設備進行配對,然后才能建立 RFCOMM 連接(在使用 Bluetooth API 發(fā)起加密連接時吩翻,會自動執(zhí)行配對)兜看。Android 設備是默認處于不可檢測狀態(tài)的。

查詢配對的設備

在執(zhí)行設備發(fā)現(xiàn)之前狭瞎,有必要查詢已配對的設備集合细移。用來了解設備是否處于已知狀態(tài)。通過 getBondedDevices() 來實現(xiàn)熊锭,這將返回表示已配對設備的一組 BluetoothDevice 弧轧。

例如:我們可以查詢所有已配對的設備雪侥,然后使用 ArrayAdapter 向用戶顯示每臺設備的名稱:

    
    Set<BluetoothDevice> pairedDevices = mBlutooothAdapter.getBondedDevices();
    
    if(pairedDevices.size() > 0){
        for(BluetoothDevice device:pairedDevices){
            // 把名字和地址取出來添加到適配器中
            mArrayAdapter.add(device.getName()+"\n"+ device.getAddress());
        }
    }

要發(fā)起連接僅需要知道目標藍牙設備的 Mac 地址就可以了。

發(fā)現(xiàn)設備

發(fā)現(xiàn)設備使用 startDiscovery()該進程為異步進程精绎。該方法會立刻返回一個布爾值速缨,指示是否已成功啟動發(fā)現(xiàn)操作。發(fā)現(xiàn)進程通常包含約 12 秒的查詢掃描捺典,之后對發(fā)現(xiàn)的設備進行掃描,以檢索其藍牙設備的名字从祝。

我們的應用必須針對 ACTION_FOUND Intent 注冊一個 BroadcastReceiver襟己,以便接受每臺發(fā)現(xiàn)的設備的信息。針對每臺設備牍陌,系統(tǒng)會廣播 ACTION_FOUND Intent擎浴。這個 Intent 會攜帶額外的字段 EXTRA_DEVICE 和 EXTRA_CLASS。這兩者分別包含 BluetoothDevice 和 BluetoothClass毒涧。

   // 創(chuàng)建一個接受 ACTION_FOUND 的 BroadcastReceiver
   private final BroadcastReceiver mReceiver = new BroadcastReceiver(){
   
        public void onReceive(Context context,Intent intent){
            String action = intent.getAction();
            // 當 Discovery 發(fā)現(xiàn)了一個設備  
            if(BluetoothDevice.ACTION_FOUND.equals(action)){
                // 從 Intent 中獲取發(fā)現(xiàn)的 BluetoothDevice 
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // 將名字和地址放入要顯示的適配器中
                mArrayAdapter.add(device.getName + "\n" + device.getAddress());
                
            }
        }
   };
   // 注冊這個 BroadcastReceiver
   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
   registerReceiver(mReiver,filter);
   
   // 在 onDestroy 中 unRegister

注意 執(zhí)行 discovery 對于藍牙適配器來說是一個非常繁重的過程贮预,并且會消耗大量資源。在找到要連接的設備后契讲,要確保使用 cancelDiscovery() 來停止發(fā)現(xiàn)仿吞,然后嘗試連接。如果您已經(jīng)和某臺設備進行連接捡偏,那么這個時候執(zhí)行發(fā)現(xiàn)操作會大幅度的減少此連接可用的帶寬唤冈!因此不應該在處于連接狀態(tài)的時候執(zhí)行發(fā)現(xiàn)操作!

啟用可檢測性

如果我們希望我們的設備是可以被其他設備檢測到的银伟,可以使用 ACTION_REQUEST_DISCOVERABLE 來操作 Intent 調(diào)用 startActivityForResult(Intent,int)你虹。這樣會通過系統(tǒng)設置發(fā)出啟用可檢測到模式的請求(無需停止我們的應用)。默認情況下彤避,設備會變?yōu)榭蓹z測狀態(tài)并且持續(xù) 120 秒鐘傅物。我們還可以通過 EXTRA_DISCOVERABLE_DURATION Intent Extra
來定義不同的持續(xù)時間×鹪ぃ可以設置的最大持續(xù)時間為 3600 秒董饰。值為 0 表示始終可以被檢測到。任何小于 0 或者大于 3600 的值都會自動設置為 120 秒鐘圆米。

例如:

   
   Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
   discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
   startActivityForResult(discoverableIntent);

將顯示對話框尖阔,請求用戶允許將設備設為可檢測到。如果用戶響應為 YES榨咐,則設備將變?yōu)榭蓹z測到并持續(xù)指定的時間量介却。然后您的 Activity 將會收到對 onActivityResult() 回調(diào)的調(diào)用,其結果代碼等于設備可檢測到的持續(xù)時間块茁。如果用戶響應 NO 或者出現(xiàn)錯誤齿坷,結果代碼為 RESULT_CANCELED

如果設備沒有打開藍牙桂肌,則啟用設備可檢測性的時候會自動啟用藍牙。

設備將在分配的時間內(nèi)以靜默方式保持可檢測到模式永淌。如果我們希望在可檢測到模式發(fā)生變化時收到通知崎场,可以利用 ACTION_SCAN_MODE_CHANGED Intent 注冊 BroadcastReceiver。它將包含額外字段 EXTRA_SCAN_MODE 和 EXTRA_PREVIOUS_SCAN_MODE,兩者分別告訴我們新的和舊的掃描模式遂蛀。每個字段可能包括SCAN_MODE_CONNECTABLE_DISCOVERABLE(可檢測到模式)谭跨、SCAN_MODE_CONNECTABLE(未處于可檢測模式但可以接受連接)、SCAN_MODE_NOE(未處于可檢測到模式并且無法連接)

連接設備

要在兩臺設備上的應用之間創(chuàng)建連接李滴,必須同時實現(xiàn)服務端和客戶端機制螃宙,因為其中一臺設備必須開放服務器套接字,而另一臺設備必須發(fā)起連接(使用服務器設備的 MAC 地址發(fā)起連接)所坯。當服務器和客戶端在同一 RFCOMM 通道上分別擁有已連接的 BluetoothSocket 時谆扎,二者將被視為彼此連接。在這種情況下每臺設備都能獲得輸入和輸出流式傳輸芹助,并且可以開始傳輸數(shù)據(jù)堂湖。

服務端和客戶端分別以不同的方式來獲得 BluetoothSocket 。服務器將在傳入連接被接受時收到套接字状土∥薹洌客戶端將在其打開到服務器的 RFCOMM 通道時收到該套接字。

一種實現(xiàn)方式是自動將每臺設備準備為一個服務器蒙谓,從而使每臺設備開發(fā)一個服務器套接字并偵聽連接酱讶。然后任一設備可以發(fā)起與另一臺設備的連接,并成為客戶端彼乌⌒嚎希或者其中一臺設備可顯示“托管”連接并按需開放一個服務器套接字,從而另一臺設備則直接發(fā)起連接慰照。

在連接之前如果兩個設備沒有配對灶挟,則系統(tǒng)會自動發(fā)出配對請求

連接為服務器

當連接兩臺設備時,其中一臺必須保持開發(fā)的 BluetoothServerSocket 來充當服務器毒租,用于監(jiān)聽傳入的連接請求稚铣,在接受了請求后提供一個已經(jīng)連接的 BluetoothSocket。從 BluetoothServerSocket 連接獲取 BluetoothSocket 后就可以調(diào)用 close 來關閉這個等待了墅垮。

關于 UUID

通用唯一標識符(UUID)惕医,用于表示唯一標識信息的字符串ID,128位算色√牛可以使用網(wǎng)絡上眾多的隨機 UUID 生成器,然后通過 formString(String) 來初始化一個 UUID灾梦。

服務器套接字接受連接的基本過程

  • 通過 listenUsingRfcommWithServiceRecord(String,UUID)獲取 BluetoothServerSocket

    字符串是我們自己定義的服務的可識別名稱峡钓,可以直接使用包名妓笙。系統(tǒng)會自定將其寫入到設備上的新服務發(fā)現(xiàn)協(xié)議(SDP)數(shù)據(jù)庫條目中。UUID 也在 SDP 中能岩,作為與客戶端設備連接協(xié)議的匹配規(guī)則寞宫。只有客戶端和這里的UUID 一樣了才可以會被連接

  • accept() 偵聽連接請求

    阻塞調(diào)用,將在連接被接受或者發(fā)生異常的時候返回拉鹃,操作成功后辈赋,會返回 BluetoothSocket

  • 除非要接受更多的連接膏燕,否則調(diào)用 close() 來關閉這個監(jiān)聽

    這樣會釋放服務器套接字及其所有資源钥屈,但不會關閉已經(jīng)連接的 BluetoothSocket。與 TCP/IP 不同的是煌寇,RFCOMM 一次只允許每個通道有一個已經(jīng)連接的客戶端焕蹄。

放在子線程中去執(zhí)行逾雄。

例子:

private class AcceptThread extend Thread{
    private final BluetoothServerSocket mServerSocket;
    public AcceptThread(){
        mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);
    }
    
    public void run(){
        BluetoothSocket socket = null;
        while(true){
            socket = mServerSocket.accept();
            if(socket!=null){
                // 自定義方法
                manageConnectedSocket(socket);
                mServerSocket.close();
                break;
            }
              
        } 
    }
    public void cancle(){
        mServerSocket.close();
    }
    
}
連接為客戶端

要想和保持開發(fā)服務器套接字的設備建立連接阀溶,必須首先要獲取該設備的 BluetoothDevice 對象。然后使用這個對象來獲取 BluetoothSocket 并發(fā)起連接鸦泳。

客戶端連接的基本過程

  • 通過 BluetoothDevice 的 createRfcommSocketToServiceRecord(UUID) 獲取 BluetoothSocket 對象

    這里的 UUID 要和服務器端的一致

  • 通過 connect() 發(fā)起連接

    執(zhí)行此方法后银锻,系統(tǒng)將會在遠程設備上執(zhí)行 SDP 查找袱瓮,來匹配 UUID爪模。如果查找成功了并且遠程設備接受了該連接峡继,它將共享 RFCOMM 通道在連接期間使用梯啤。這個時候 connect() 就會返回号俐。這個方法也是阻塞的寞秃,如果失敗或者超時(12秒之后)宙帝,將引發(fā)異常斯嚎。

    調(diào)用 connect() 的時候要確狈钩ⅲ客戶端沒有執(zhí)行發(fā)現(xiàn)操作肯腕。如果執(zhí)行了會大幅度降低連接的速度,增加失敗的可能性

例子

private class ConnectThread extend Thread{
    private BluetoothDevice mDevice;
    private BluetoothSocket mSocket;
    public ConnectThread(BluetoothSocket device){
        mDevice = device;
        // 這里的 UUID 需要和服務器的一致
        mSocket = device.createRfcommSocketToServiceRecord(My_UUID);
    }
    
    public void run(){
        // 關閉發(fā)現(xiàn)設備
        mBluetoothAdapter.cancelDiscovery();
        try{
             mSocket.connect();
        }catch(IOException connectException){
            try{
                mSocket.close();
            }catch(IOException closeException){
                return;
            }
        }
        // 自定義方法
        manageConnectedSocket(mmSocket);
       
    }
    
    public void cancle(){
        try{
            mSocket.close();
        }cathc(IOException closeException){
            
        }
    }
    
}

在連接之前調(diào)用 cancleDiscovery() 在進行連接之前應該始終調(diào)用這個方法钥平,而且調(diào)用的時候無需檢測是否正在掃描实撒。

管理連接

建立連接后的兩個設備都有一個 BluetoothSocket 通過這個 Socket 就可以在這兩個設備間傳輸數(shù)據(jù)了。

過程:

  • 獲取 InputStream 和 OutputStream
  • 使用 read(byte[])和 write(byte [])讀取或者寫入流式傳輸

使用配置文件

從 Android 3.0 開始涉瘾, Bluetooth API 便支持使用藍牙配置文件知态。藍牙配置文件是適用于設備間藍牙通信的無線接口規(guī)范。

藍牙配置文件就是設備間通信(藍牙設備)的一種規(guī)范

免提配置文件便是一個示例立叛,對于連接到無線耳機的手機负敏,兩臺設備都必須支持免提配置文件。我們也可以通過實現(xiàn)接口 BluetoothProfile 來寫入自己的類來支持特定的藍牙配置文件秘蛇。Android API 提供了以下的幾種藍牙配置文件的實現(xiàn):

  • 耳機:耳機配置文件提供了藍牙耳機的支持原在。也就是這個配置文件提供了手機和藍牙耳機進行通信的一種規(guī)范友扰。使用 BluetoothHeadset 類,用于進程間通信來控制藍牙耳機服務的代理庶柿。這個類包含 AT 命令支持村怪。
  • A2DP: 高級音頻分發(fā)配置文件(A2DP)。定義了高質(zhì)量音頻如何通過藍牙連接和流式傳輸浮庐,從一個設備傳輸?shù)搅硪粋€設備甚负。BluetoothAdp 類,是用于通過進程間通信(IPC)來控制藍牙 A2DP 服務的代理审残。
  • 健康設備: Android 4.0(API 14)引入了對藍牙健康設備配置文件(HDP)的支持梭域。這樣就允許我們創(chuàng)建的應用可以使用藍牙與支持藍牙功能的健康設備進行通信。(心率檢測儀搅轿、血糖儀病涨、溫度計等等)。詳解的配置要查看健康設備配置文件璧坟。

使用配置文件的基本步驟

  • 獲取默認適配器 BluetoothAdapter
  • 使用 getProfileProxy() 既穆,建立到配置文件所關聯(lián)的配置文件代理對象的連接。
  • 設置監(jiān)聽BluetoothProfile.ServiceListener雀鹃。這個監(jiān)聽會在客戶端連接到服務或者斷開服務連接的時候發(fā)送通知幻工。
  • onServiceConnected() 中獲取配置文件代理對象的句柄。
  • 獲取配置文件代理對象后黎茎,可以里脊將其用于監(jiān)聽連接狀態(tài)和執(zhí)行其他與該配置文件相關的操作囊颅。

例子: 如何連接到 BluetoothHeadset 代理對象,以便能夠控制耳機配置文件:

BluetoothHeadset mBluetoothHeadset;
// 獲取默認藍牙適配器
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 設置監(jiān)聽(監(jiān)聽連接狀態(tài))
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener(){
    public void onServiceConnected(int profile,BluetoothProfile proxy){
        if(profile == BluetoothProfile.HEADSET){
            mBluetoothHeadset = (BluetoothHeadset)
        }
    }
    public void onServiceDisconnected(int profile){
        if(profile == BluetoothProfile.HEADSET){
            mBluetoothHeadset = null;
        }
    }
}

// 建立與配置文件代理的連接
mBluetoothAdapter.getProfileProxy(contenxt,mProfileListener,BluetoothProfile.HEADSET);
// 使用 mBluetoothHeadset 代理內(nèi)部的方法

// 使用完畢后關閉
mBluetoothAdapter.closeProfileProxy(mBluetoothHeadset);
供應商特定的 AT 命令

從 Android 3.0 開始傅瞻。應用可以注冊接受耳機所發(fā)送的預定義的供應商特定 AT 命令的系統(tǒng)廣播(例如 Plantronics +XEVENT命令)(也就是說我們的應用可以接受耳機藍牙商預定義的命令)踢代。如:應用可以接受指示所連接設備的電池電量的廣播,并根據(jù)需要通知用戶或采取其他操作嗅骄。使用 ACTION_VENDOR_SPECIFIC_HEADSET_EVENT intent 創(chuàng)建廣播接收器胳挎,用來處理耳機供應商特定的 AT 命令。

健康設備配置文件

Android 4.0 引入了對藍牙健康設備配置文件(HDP)的支持掸读。這可以使用我們的應用使用藍牙與支持藍牙功能的健康設備進行通信(心率檢測儀串远、血糖儀、溫度計儿惫、臺秤)

創(chuàng)建 HDP 應用:

  • 獲取 BluetoothHealth 代理對象

    與常規(guī)耳機和 A2DP 類似澡罚。使用 ServiceListener 和 HEALTH 配置文件類型參數(shù)來調(diào)用 getProfileProxy(),來和配置文件代理對象建立連接肾请。

  • 創(chuàng)建 BluetoothHealthCallback 并注冊充當健康匯集設備的應用配置(BluetoothHealthAPPConfiguration)

  • 建立到健康設備的連接

  • 成功連接到健康設備后留搔,使用文件描述符對健康設備執(zhí)行讀寫操作

  • 完成后,關閉健康通道并取消注冊該應用铛铁,該通道長時間閑置也會關閉隔显。

總結:

關于普通藍牙設備和普通藍牙設備之間的連接通信

  • 通過 BluetoothAdapter 的 getDefaultAdapter 方法獲取系統(tǒng)唯一的藍牙適配器(如果返回為 null 則說明此設備不支持藍牙)
  • 通過 BluetoothAdapter 的 isEnable 方法判斷是否已經(jīng)打開藍牙
  • 可以通過 BluetoothAdapter.ACTION_REQUEST_ENABLE intent 來開啟藍牙却妨,也可以直接 .enable 開啟藍牙
  • 通過 調(diào)用 startDiscovery 開啟發(fā)現(xiàn)周邊設備(持續(xù) 12 秒),這個時候需要注冊廣播接收器來接受發(fā)現(xiàn)的藍牙設備(及時關閉這個操作)
  • 通過 BluetoothDevice 就可以進行建立連接括眠,(分為客戶端和服務端類似于 Socket 連接)
  • 然后建立連接后就可以通過 BluetoothSocket獲取里面的流來進行讀寫通信

關于藍牙設備和藍牙儀器(藍牙耳機彪标、電子秤等等類似產(chǎn)品)

這種之間的通信是通過配置文件代理來實現(xiàn)的。

都有一個對應的配置文件代理類掷豺。具體的操作是通過這個對象來完成捞烟。

文字good.jpg
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市当船,隨后出現(xiàn)的幾起案子题画,更是在濱河造成了極大的恐慌,老刑警劉巖德频,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苍息,死亡現(xiàn)場離奇詭異,居然都是意外死亡壹置,警方通過查閱死者的電腦和手機竞思,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒸绩,“玉大人衙四,你說我怎么就攤上這事铃肯』家冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵押逼,是天一觀的道長步藕。 經(jīng)常有香客問我,道長挑格,這世上最難降的妖魔是什么咙冗? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮漂彤,結果婚禮上雾消,老公的妹妹穿的比我還像新娘。我一直安慰自己挫望,他們只是感情好立润,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著媳板,像睡著了一般桑腮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛉幸,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天破讨,我揣著相機與錄音丛晦,去河邊找鬼。 笑死提陶,一個胖子當著我的面吹牛烫沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隙笆,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斧吐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仲器?” 一聲冷哼從身側響起煤率,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乏冀,沒想到半個月后蝶糯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡辆沦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年昼捍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肢扯。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妒茬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔚晨,到底是詐尸還是另有隱情乍钻,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布铭腕,位于F島的核電站银择,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏累舷。R本人自食惡果不足惜浩考,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望被盈。 院中可真熱鬧析孽,春花似錦、人聲如沸只怎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尝盼。三九已至吞滞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裁赠。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工殿漠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佩捞。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓绞幌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親一忱。 傳聞我的和親對象是個殘疾皇子莲蜘,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 最近項目使用藍牙,之前并沒有接觸帘营,還是發(fā)現(xiàn)了很多坑票渠,查閱了很多資料,說的迷迷糊糊芬迄,今天特查看官方文檔问顷。 說下遇到的...
    King9527閱讀 1,794評論 0 1
  • Android 平臺包含藍牙網(wǎng)絡堆棧支持,憑借此項支持禀梳,設備能以無線方式與其他藍牙設備交換數(shù)據(jù)杜窄。應用框架提供了通過...
    虎三呀閱讀 767評論 0 1
  • Guide to BluetoothSecurity原文 本出版物可免費從以下網(wǎng)址獲得:https://doi.o...
    公子小水閱讀 7,977評論 0 6
  • 藍牙 注:本文翻譯自https://developer.android.com/guide/topics/conn...
    RxCode閱讀 8,671評論 11 99
  • 前言 最近在做Android藍牙這部分內(nèi)容,所以查閱了很多相關資料算途,在此總結一下塞耕。 基本概念 Bluetooth是...
    貓疏閱讀 14,566評論 7 113