基於SnapDragonBoard410c的藍牙控制

在你的應用程序能夠使用藍牙進行通信之前,你需要進行確認藍牙設備是否被當前設備所支持。如果當前設備支持藍牙,則需要請求開啓藍牙設備。該部分可使用BluetoothAdapter通過兩步完成。

(1)BluetoothAdapter對於任何的藍牙行爲都是必備的。獲取BluetoothAdapter,可通過調用靜態方法getDefaultAdater()。該方法返回一個BluetoothAdapter對象,用來代表自己設備的藍牙適配器。如果getDefaultAdapter()返回null,那麼該設備並不支持藍牙.

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

(2)接下來,你需要確保藍牙處於開啓的狀態。調用isEnabled()方法來檢查藍牙目前是否可用。如果該方法返回false,那麼藍牙處於不可用的狀態。爲了請求藍牙設備的開啓,使用ACTION_REQUEST_ENABLE的Intent,並調用startActivityForResult()方法。這將會通過系統設置開啓你的藍牙,例如:

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

調用該方法後,一個請求開啓藍牙的對話框將會出現在屏幕上。如果用戶點擊確認,那麼系統將會開啓藍牙設備,該過程完成(或失敗)後,將會回到你的應用程序。

使用BluetoothAdapter,通過搜索設備或查詢配對設備列表可以找到遠程藍牙設備。

設備搜索(Device Discovery)是一個掃描的過程,用來搜索本地開啓藍牙的設備,在此之後請求每一個掃描到設備的信息。然而,一個藍牙設備只有處於可見狀態下才會返回設備信息,例如設備名稱,MAC地址等。使用該信息,設備能夠實例化和該設備的藍牙連接。

當第一次和遠程藍牙設備進行連接時,一個配對的請求將會自動呈現在用戶面前。當設備配對時,設備的基礎信息將會被保存並能夠使用藍牙的API進行讀取。使用遠程藍牙設備的MAC地址,介於藍牙設備間的連接將能夠在任意時刻實例化,而不需要進行搜索操作(假定設備在藍牙的通信範圍內)

(3)查詢配對設備

在搜索設備之前,有必要查詢已配對的設備集,來得知想要連接的設備是否已經配對。爲了執行上述操作,可以調用getBondedDevices()方法。該方法返回一個BluetoothDevice的集合來代表配對設備。例如,你可以查詢所有的配對設備並使用ArrarAdapter顯示它們:

Set<BluetoothDevice> 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());
    }
}

需要使用BluetoothDevice進行連接實例化的唯一值是MAC地址。在上述的例子中,該部分作爲ArrayAdapter的一部分呈現給用戶。關於如何使用MAC地址實例化連接,請參考後文。

(4)發現設備

執行發現設備的操作,僅僅需要執行startDiscovery()方法。該過程是異步的,該方法將會立刻返回一個布爾值表明搜索是否已經開始。通常情況下,該搜索的過程調用12秒鐘的查詢,隨後返回找到的設備。

你的應用程序必須使用ACTION_FOUNDd的Intent註冊一個BroadastReceiver。該Intent用來接受每一個查找到設備的信息。對於每一個設備,系統將會廣播ACTION_FOUND。該Intent包含兩個額外域,EXTRA_DEVICE 和 EXTRA_CLASS。分別包含一個BluetoothDevice類對象和BluetoothClass類對象。例如:

// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy

執行設備搜索的操作是一項很繁重的任務,會消耗大量的資源。一旦你找到了一個設備並要進行連接,請務必確認是否停止搜索設備的操作。如果已經進行了連接,那麼搜索操作將會顯著地降低連接的速率,因此你應當在連接時停止搜索。可通過cancelDiscovery()方法停止搜索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章