Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android藍牙技術Bluetooth使用流程(詳解)

Android藍牙技術Bluetooth使用流程(詳解)

編輯:關於android開發

Android藍牙技術Bluetooth使用流程(詳解)


一:藍牙設備之間的通信主要包括了四個步驟

設置藍牙設備
尋找局域網內可能或者匹配的設備
連接設備
設備之間的數據傳輸

二:具體編程實現

1. 啟動藍牙功能

首先通過調用靜態方法getDefaultAdapter()獲取藍牙適配器BluetoothAdapter,如果返回為空,則無法繼續執行了。例如:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
   // Device does not support Bluetooth
}

其次,調用isEnabled()來查詢當前藍牙設備的狀態,如果返回為false,則表示藍牙設備沒有開啟,接下來你需要封裝一個ACTION_REQUEST_ENABLE請求到intent裡面,調用startActivityForResult()方法使能藍牙設備,例如:

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

2. 查找設備

使用BluetoothAdapter類裡的方法,你可以查找遠端設備(大概十米以內)或者查詢在你手機上已經匹配(或者說綁定)的其他設備了。當然需要確定對方藍牙設備已經開啟或者已經開啟了“被發現使能”功能(對方設備是可以被發現的是你能夠發起連接的前提條件)。如果該設備是可以被發現的,會反饋回來一些對方的設備信息,比如名字、MAC地址等,利用這些信息,你的設備就可以選擇去向對方初始化一個連接。
如果你是第一次與該設備連接,那麼一個配對的請求就會自動的顯示給用戶。當設備配對好之後,他的一些基本信息(主要是名字和MAC)被保存下來並可以使用藍牙的API來讀取。使用已知的MAC地址就可以對遠端的藍牙設備發起連接請求。
匹配好的設備和連接上的設備的不同點:匹配好只是說明對方設備發現了你的存在,並擁有一個共同的識別碼,並且可以連接。連接上:表示當前設備共享一個RFCOMM信道並且兩者之間可以交換數據。也就是是說藍牙設備在建立RFCOMM信道之前,必須是已經配對好了的。

3. 查詢匹配好的設備

在建立連接之前你必須先查詢配對好了的藍牙設備集以便選取一個設備進行通信,例如你可以你可以查詢所有配對的藍牙設備,並使用一個數組適配器將其打印顯示出來:

Set pairedDevices =mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
    //Loop through paired devices
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
    }
}

建立一個藍牙連接只需要MAC地址就已經足夠。

4. 掃描設備

掃描設備,只需要調用startDiscovery()方法,這個掃描的過程大概持續是12秒,應用程序為了ACTION_FOUND動作需要注冊一個BroadcastReceiver來接受設備掃描到的信息。對於每一個設備,系統都會廣播ACTION_FOUND動作。

// 用ACTION_FOUND為action注冊廣播接收器
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // 發現設備
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        // 從Intent中獲取藍牙設備
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        // 添加名字和地址到設備適配器中
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};

//注冊廣播接收器
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); //在onDestroy時記得注銷廣播接收器

5. 使能被發現

如果你想使你的設備能夠被其他設備發現,將ACTION_REQUEST_DISCOVERABLE動作封裝在intent中並調用startActivityForResult(Intent, int)方法就可以了。它將在不使你應用程序退出的情況下使你的設備能夠被發現。缺省情況下的使能時間是120秒,當然你可以可以通過添加EXTRA_DISCOVERABLE_DURATION字段來改變使能時間(最大不超過300秒)例如:

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

運行該段代碼之後,系統會彈出一個對話框來提示你啟動設備使能被發現(此過程中如果你的藍牙功能沒有開啟,系統會幫你開啟),並且如果你准備對該遠端設備發現一個連接,你不需要開啟設備被發現功能,因為該功能只是在你的應用程序作為服務器端的時候才需要。

6. 連接設備

在應用程序中,想建立兩個藍牙設備之間的連接,必須實現客戶端和服務器端的代碼(因為任何一個設備都必須可以作為服務端或者客戶端)。一個開啟服務來監聽,一個發起連接請求(使用服務器端設備的MAC地址)。當他們都擁有一個藍牙套接字在同一RFECOMM信道上的時候,可以認為他們之間已經連接上了。服務端和客戶端通過不同的方式或其他們的藍牙套接字。當一個連接監聽到的時候,服務端獲取到藍牙套接字。當客戶可打開一個FRCOMM信道給服務器端的時候,客戶端獲取到藍牙套接字。
注意:在此過程中,如果兩個藍牙設備還沒有配對好的,android系統會通過一個通知或者對話框的形式來通知用戶。RFCOMM連接請求會在用戶選擇之前阻塞。

7. 服務端的連接

當你想要連接兩台設備時,一個必須作為服務端(通過持有一個打開的BluetoothServerSocket),目的是監聽外來連接請求,當監聽到以後提供一個連接上的BluetoothSocket給客戶端,當客戶端從BluetoothServerSocket得到BluetoothSocket以後就可以銷毀BluetoothServerSocket,除非你還想監聽更多的連接請求。
建立服務套接字和監聽連接的基本步驟:
首先通過調用listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket對象,參數String代表了該服務的名稱,UUID代表了和客戶端連接的一個標識(128位格式的字符串ID,相當於PIN碼),UUID必須雙方匹配才可以建立連接。
其次調用accept()方法來監聽可能到來的連接請求,當監聽到以後,返回一個連接上的藍牙套接字BluetoothSocket。
最後,在監聽到一個連接以後,需要調用close()方法來關閉監聽程序。(一般藍牙設備之間是點對點的傳輸)
注意:accept()方法不應該放在主Acitvity裡面,因為它是一種阻塞調用(在沒有監聽到連接請求之前程序就一直停在那裡)。解決方法是新建一個線程來管理。例如:

8. 客戶端的連接

為了初始化一個與遠端設備的連接,需要先獲取代表該設備的一個BluetoothDevice對象。通過BluetoothDevice對象來獲取BluetoothSocket並初始化連接,具體步驟:
使用BluetoothDevice對象裡的方法createRfcommSocketToServiceRecord(UUID)來獲取BluetoothSocket。UUID就是匹配碼。然後,調用connect()方法來。如果遠端設備接收了該連接,他們將在通信過程中共享RFFCOMM信道,並且connect返回。
注意:conncet()方法也是阻塞調用,一般建立一個獨立的線程中來調用該方法。在設備discover過程中不應該發起連接connect(),這樣會明顯減慢速度以至於連接失敗。且數據傳輸完成只有調用close()方法來關閉連接,這樣可以節省系統內部資源。

9. 管理連接

當設備連接上以後,每個設備都擁有各自的BluetoothSocket。就可以實現設備之間數據的共享了。
首先通過調用getInputStream()和getOutputStream()方法來獲取輸入輸出流。
然後通過調用read(byte[]) 和write(byte[]).方法來讀取或者寫數據。
實現細節:以為讀取和寫操作都是阻塞調用,需要建立一個專用線程來管理。

10. 權限設置


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved