1. 程式人生 > >Android學習——藍芽(Bluetooth)

Android學習——藍芽(Bluetooth)

藍芽(Bluetooth)

藍芽(Bluetooth)是一種短距離的無線通訊技術標準。

藍芽協議

藍芽協議分為4層,即核心替代層、電纜替代協議層、電話控制協議層和採納的其他的協議層。這4種最重要的是核心協議層。藍芽協議包括基帶、鏈路管理、邏輯鏈路控制和適應協議四部分。其中鏈路管理(LMP)負責藍芽元件間連線的建立。邏輯鏈路控制與適應協議(L2CAP)位於基帶協議層上,屬於資料鏈路層,是一個為高層傳輸和應用層協議遮蔽基帶協議的適配協議。

藍芽執行的操作

  1. 開關;
  2. 掃描;
  3. 獲取已配對的裝置;
  4. 連線通訊(不同的協議傳送不同的包)。

BluetoothAdapter

BluetoothAdapter代表了移動裝置的本地的藍芽介面卡, 通過該藍芽介面卡可以對藍芽進行基本操作。

BluetoothAdapter.getDefaultAdapter()//該靜態方法可以獲取該介面卡

藍芽許可權

在AndroidManifest檔案中新增需要的許可權,高版本也需要動態授權:

android.permission.BLUETOOTH : 
允許程式連線到已配對的藍芽裝置,請求連線/接收連線/傳輸資料需要改許可權, 主要用於對配對後進行操作;

android.permission.BLUETOOTH_ADMIN : 
允許程式發現和配對藍芽裝置, 該許可權用來管理藍芽裝置, 有了這個許可權, 應用才能使用本機的藍芽裝置, 主要用於對配對前的操作;

優先順序 : BLUETOOTH許可權是BLUETOOTH_ADMIN許可權的前提, 如果沒有BLUETOOTH許可權,就不能使用BLUETOOTH_ADMIN許可權;

藍芽常量

開關狀態值

藍芽關閉    int STATE_OFF  //值為10,藍芽模組處於關閉狀態;

藍芽開啟中  int STATE_TURNING_ON //值為11,藍芽模組正在開啟;

藍芽開啟    int STATE_ON   //值為12,藍芽模組處於開啟狀態

藍芽開啟中  int STATE_TURNING_OFF  //值為13,藍芽模組正在關閉

藍芽開關狀態順序STATE_OFF –> STATE_TURNING_ON –> STATE_ON –>STATE_TURNING_OFF –> STATE_OFF;

掃描狀態值

無功能狀態:int SCAN_MODE_NONE 
//值為20,查詢掃描和頁面掃描都失敗,該狀態下藍芽模組既不能掃描其他裝置,也不可見

掃描狀態:  int SCAN_MODE_CONNECTABLE
 //值為21,查詢掃描失效,頁面掃描有效,該狀態下藍芽模組可以掃描其他裝置,
 //從可見性來說只對已配對的藍芽裝置可見,只有配對裝置才能主動連線本裝置;

可見狀態:  int SCAN_MODE_CONNECTABLE_DISCOVERABLE  
 //值為23,查詢掃描和頁面掃描都有效;

查詢掃描功能:其它裝置可以掃描到本裝置,指的是可見性可見;
頁面掃描功能:可以主動掃描其它裝置;

藍芽操作 請求的廣播

開啟藍芽:

ACTION_REQUEST_ENABLE 開啟藍芽,值為android.bluetooth.adapter.action.REQUEST_ENABLE

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, requestCode);
//可以在Activity中的onActivityResult()方法處理結果,如果藍芽模組開啟成功,則返回結果RESULT_OK;
// 如果藍芽模組開啟失敗,則返回結果RESULT_CANCELED;
// 開啟和關閉藍芽模組,都可以通過ACTION_STATE_CHANCED廣播來監聽

藍芽可見:

ACTION_REQUEST_DISCOVERABLE,使藍芽可見,值為android.bluetooth.adapter.action.REQUEST_DISCOVERABLE,預設時間為120秒。

可以在廣播中新增附加域,設定任意的可見時間,附加域為EXTRA_DISCOVERABLE_DURATION,需要藍芽許可權;

可以在Activity中的onActivityResult()方法中處理結果, 如果藍芽模組設定可見成功, 則返回結果碼RESULT_OK; 如果藍芽模組設定可見失敗, 則返回結果碼RESULT_CANCELED;

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

State狀態有關的方法

State狀態有關的方法

public static sychronized BluetoothAdapter getDefaultAdapter();
返回值:本地藍芽介面卡 BluetoothAdapter物件;

獲取state狀態方法

public int getState();
作用:獲取是否可用

返回值:返回當前的State,STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;

許可權 : BLUETOOTH_ADMIN許可權;

藍芽是否可用

public boolean isEnable();
作用:獲取當前裝置藍芽模組是否可用;
返回值:返回當前藍芽模組是否可用,true可用,false不可用
許可權 : BLUETOOTH_ADMIN許可權;

開啟藍芽

public boolean enable();
作用:開啟本地藍芽介面卡;
返回值:如果開啟成功則返回true,如果開啟失敗則返回false;
許可權 : BLUETOOTH_ADMIN許可權;

關閉藍芽

public boolean disable();
作用:關閉本地裝置藍芽;
返回值:如果關閉藍芽成功,返回true;如果藍芽關閉失敗,返回false;
許可權 : BLUETOOTH_ADMIN許可權;

掃描相關的方法

開始掃描

public boolean startDiscovery();
作用:開始查詢遠端藍芽裝置,先進行12秒的查詢掃描(被動可見),之後進行頁面掃描(主動搜尋);
搜尋過成功不能嘗試對遠端藍芽裝置的連線,同時已連線的裝置的頻寬也會被壓縮,等待時間變長;使用canceDiscovery()可以終止搜尋;

返回值:如果成功返回true,失敗返回false;

許可權 : BLUETOOTH_ADMIN許可權;

是否在掃描中

public boolean isDiscovering();
作用:是否正在搜尋
返回值:如果裝置正在搜尋,返回true;如果裝置沒有進行藍芽搜尋,則返回false;
許可權 : BLUETOOTH_ADMIN許可權;

取消查詢

public boolean cancelDiscovery();
作用:取消藍芽搜尋;在進行connect()方法的時候,必須呼叫這個方法,藍芽搜尋是一個服務進行,在搜尋中的時候,不能進行連線;
返回值:如果取消成功,則返回true;如果取消失敗,返回false;

獲取掃描模式

public int getScanMode();
作用:獲取當前藍芽掃描模式;
返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;

與藍芽裝置相關的方法

檢查藍芽地址

public boolean checkBluetoothAddress(String address);
作用 : 檢查藍芽地址是否合法, 藍芽地址字母必須大寫, 例如 : "00:43:A8:23:10:F0";
引數 : 17位的字串, 例如 : "00:43:A8:23:10:F0";
返回值 : 如果藍芽地址合法返回true, 反之返回false;

獲取本地藍芽地址

public String getAddress();
作用 : 返回本地藍芽的MAC地址;
返回值 : 本地的硬體地址;

獲取本地藍芽名稱

public String getName();
返回值 : 本地藍芽裝置的名稱;

獲取繫結的藍芽集合

public Set<BluetoothDevice> getBoundedDevices();
作用 : 獲取已經配對的藍芽裝置的集合, 如果藍芽未被開啟, 則返回null;

獲取遠端藍芽裝置

public BluetoothDevice getRemoteDevice(String address);
作用 : 根據藍芽的實體地址獲取遠端的藍芽裝置, 如果地址不合法, 就會產生異常;
返回值 : 獲取到的BluetoothDevice物件;

建立監聽

publicBluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);

作用 : 建立一個監聽Rfcommon埠的藍芽監聽, 使用accept()方法監聽, 並獲取BluetoothSocket物件; 
該系統會根據一個服務名稱(name)和唯一的識別碼(uuid)來建立一個SDP服務, 遠端藍芽裝置可以根據唯一的UUID來連線這個SDP伺服器;

引數 : name : SDP伺服器名稱, UUID, SDP記錄下的UUID;

返回值 : 正在監聽藍芽埠;

許可權 : BLUETOOTH許可權;