7

我無法通過藍牙連接兩個Android設備,只有在配對之前纔會發生此問題。我運行一個作爲服務器,另一個作爲客戶端。Android藍牙接受()/連接()與已配對的設備

這裏的東西在服務器端的順序:

  1. 檢查各種藍牙狀態(可用適配器,啓用等)。
  2. 用我選擇的預定義的UUID調用listenUsingRfcommWithServiceRecord()。
  3. 請求使設備可發現
  4. 由於可發現異步發生,我調用accept()並等待傳入​​連接。

在客戶端:

  1. 檢查各種藍牙狀態(適配器可用,啓用等)。
  2. getBondedDevices()中的每個設備,我將getName()與服務器名稱進行比較。如果匹配,請跳到步驟6.
  3. 開始BT發現
  4. 對於每個發現的設備(請注意2a的配對設備不會在此顯示),請將設備名稱與服務器名稱進行比較。如果存在匹配,則轉到步驟6。
  5. 取消發現
  6. 在那個從步驟2中找到的裝置,呼叫createRfcommSocketToServiceRecord()與已在服務器側使用的相同的預先定義的UUID。
  7. 調用connect()並等待它返回連接的套接字。

當客戶端和服務器之前從未配對時,上述過程對我來說工作得非常好。但是,在Android註冊到設備列表中後,它們將不可避免地在connect()/ accept()階段超時。

我一直在尋找了兩天的解決方案,並已嘗試了不少事情,包括這一個: Connecting to a already paired Bluetooth device

反射方法不爲我工作的。看起來connect()會立即返回,但是當我嘗試getOutputStream()時,我得到一個異常。在accept()方面,它甚至不記錄有人試圖連接。我認真需要一些幫助或指示讓設備建立連接,一旦他們以前配對。

下面是有關設備的一些信息:

  • 我測試服務器和客戶端上的兩個LG G2X手機。
  • 他們都在Android 2.3.3上運行,這對應於API級別10.
  • 同樣,上述工作在我在設置中手動解除設備配對後運行。

謝謝你提前。我大約在2周內使用Android和藍牙,因此如果您看到任何缺少的步驟或最佳做法,請將它們指出。

回答

6

在客戶端,當我嘗試連接綁定設備時,我只是在我在BluetoothAdapter.getBondedDevices()中找到的BluetoothDevice上調用它。這是行不通的。

爲了正確地建立了藍牙連接,我不得不做類似下面的一些僞代碼:Bluetooth Chat Service

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); 
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); 

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); 
socket.connect(); 

我按照完全相同的藍牙聊天例子來到這個答案。爲什麼它不能在getBondedDevices()的設備上工作是超出我的。也許有更熟悉Android的人可以回答這個問題。

+0

getRemoteDevice不是一個靜態方法,你怎麼總是調用它 – raja 2013-02-07 14:06:19

+1

你(幾乎?)要使用BluetoothAdapter.getDefaultAdapter()作爲BluetoothAdapter。以上只是僞代碼,所以你不能簡單地複製和粘貼。 – 2013-02-08 17:21:52

+0

偉大的文章,這實際上是有道理的,因爲該設備是一個參考,並將陳舊。適配器將始終處於最新狀態。 – Cookster 2013-07-19 22:55:18

0
private static BluetoothSocket mSocket; 
BluetoothDevice selectDevice = null; 

void connectDevice(){ 
    if(mSocket == null) { 
     //Log.d(TAG, "Socket is null"); 
     UUID SPP_UUID = UUID 
       .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 
     Set<BluetoothDevice> bondedDevices = BluetoothAdapter 
       .getDefaultAdapter().getBondedDevices(); 
     //Log.d(TAG, "Size: " + bondedDevices.size()); 
     /** 
     * Select your divice form paired devices 
     */ 
     for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      selectDevice = bluetoothDevice; 
      //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()); 
     } 

     if(selectDevice.getBondState() == selectDevice.BOND_BONDED) { 
      //Log.d(TAG, selectDevice.getName()); 
      try { 
       mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       //Log.d(TAG, "socket not created"); 
       e1.printStackTrace(); 
      } 
      try { 
       mSocket.connect(); 
      } catch (IOException e) { 
       try { 
        mSocket.close(); 
        //Log.d(TAG, "Cannot connect"); 
       } catch (IOException e1) { 
        //Log.d(TAG, "Socket not closed"); 
        e1.printStackTrace(); 
       } 
      } 
    }