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

建立一個藍牙連接僅僅須要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);

執行該段代碼之后,系統會彈出一個對話框來提示你啟動設備使能被發現(此過程中假設你的藍牙功能沒有開啟。系統會幫你開啟),而且假設你准備對該遠端設備發現一個連接,你不須要開啟設備被發現功能。由於該功能僅僅是在你的應用程序作為server端的時候才須要。

6. 連接設備

在應用程序中,想建立兩個藍牙設備之間的連接,必須實現client和server端的代碼(由於不論什么一個設備都必須能夠作為服務端或者client)。

一個開啟服務來監聽。一個發起連接請求(使用server端設備的MAC地址)。

當他們都擁有一個藍牙套接字在同一RFECOMM信道上的時候。能夠覺得他們之間已經連接上了。服務端和client通過不同的方式或其它們的藍牙套接字。當一個連接監聽到的時候,服務端獲取到藍牙套接字。

當客戶可打開一個FRCOMM信道給server端的時候,client獲取到藍牙套接字。
注意:在此過程中,假設兩個藍牙設備還沒有配對好的。android系統會通過一個通知或者對話框的形式來通知用戶。

RFCOMM連接請求會在用戶選擇之前堵塞。

7. 服務端的連接

當你想要連接兩台設備時,一個必須作為服務端(通過持有一個打開的BluetoothServerSocket),目的是監聽外來連接請求,當監聽到以后提供一個連接上的BluetoothSocket給client。當client從BluetoothServerSocket得到BluetoothSocket以后就能夠銷毀BluetoothServerSocket,除非你還想監聽很多其它的連接請求。


建立服務套接字和監聽連接的基本步驟:
首先通過調用listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket對象,參數String代表了該服務的名稱,UUID代表了和client連接的一個標識(128位格式的字符串ID,相當於PIN碼),UUID必須兩方匹配才干夠建立連接。
其次調用accept()方法來監聽可能到來的連接請求,當監聽到以后,返回一個連接上的藍牙套接字BluetoothSocket。


最后,在監聽到一個連接以后。須要調用close()方法來關閉監聽程序。(一般藍牙設備之間是點對點的傳輸)
注意:accept()方法不應該放在主Acitvity里面,由於它是一種堵塞調用(在沒有監聽到連接請求之前程序就一直停在那里)。

解決方法是新建一個線程來管理。

比如:

8. client的連接

為了初始化一個與遠端設備的連接,須要先獲代替表該設備的一個BluetoothDevice對象。通過BluetoothDevice對象來獲取BluetoothSocket並初始化連接。詳細步驟:
使用BluetoothDevice對象里的方法createRfcommSocketToServiceRecord(UUID)來獲取BluetoothSocket。UUID就是匹配碼。然后,調用connect()方法來。假設遠端設備接收了該連接,他們將在通信過程中共享RFFCOMM信道,而且connect返回。
注意:conncet()方法也是堵塞調用,一般建立一個獨立的線程中來調用該方法。

在設備discover過程中不應該發起連接connect()。這樣會明顯減慢速度以至於連接失敗。且傳輸數據完畢僅僅有調用close()方法來關閉連接,這樣能夠節省系統內部資源。

9. 管理連接

當設備連接上以后,每個設備都擁有各自的BluetoothSocket。

就能夠實現設備之間數據的共享了。
首先通過調用getInputStream()和getOutputStream()方法來獲取輸入輸出流。
然后通過調用read(byte[]) 和write(byte[]).方法來讀取或者寫數據。
實現細節:以為讀取和寫操作都是堵塞調用,須要建立一個專用線程來管理。

10. 權限設置

<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM