Android學習——藍芽(Bluetooth)
藍芽(Bluetooth)
藍芽(Bluetooth)是一種短距離的無線通訊技術標準。
藍芽協議
藍芽協議分為4層,即核心替代層、電纜替代協議層、電話控制協議層和採納的其他的協議層。這4種最重要的是核心協議層。藍芽協議包括基帶、鏈路管理、邏輯鏈路控制和適應協議四部分。其中鏈路管理(LMP)負責藍芽元件間連線的建立。邏輯鏈路控制與適應協議(L2CAP)位於基帶協議層上,屬於資料鏈路層,是一個為高層傳輸和應用層協議遮蔽基帶協議的適配協議。
藍芽執行的操作
- 開關;
- 掃描;
- 獲取已配對的裝置;
- 連線通訊(不同的協議傳送不同的包)。
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許可權;