2017-07-22 60 views
1

問題

如何可以暫時無法建立與遠程Android裝置因爲藍牙連接之間進行區分:區分「超出範圍」或「範圍內,但沒有偵聽服務器套接字」? (藍牙)

  • 場景1:遠程設備超出範圍,或它的藍牙已禁用。
  • 方案2:遠程設備處於範圍內,但遠程設備上沒有用於接受我的連接的服務器套接字。

我已經試過

  1. 我不能連接時拋出的異常區別,因爲它在這兩種情況下扔相同的例外:

    java.io.IOException: read failed, socket might closed or timeout, read ret -1 
    
  2. 我做不到使用fetchUuidsWithSdp()來檢查我的UUID是否支持遠程設備,因爲它的行爲VES以同樣的方式在這兩種情況下... according to the documentation

    這個API是異步的,並且{@link #ACTION_UUID}意圖被髮送,由遠端支持的UUID。如果在獲得SDP記錄,或者如果這個過程需要很長的時間,{@link #ACTION_UUID}意圖與當前存在於緩存中的UUID發送的錯誤...

    它的行爲也根據this SO thread,似乎有點不可預測。

  3. 最後,我不想使用sdpSearch兩個區分,因爲這是在API 23中添加的,我希望能夠向下支持API 19

回答

1

您可以通過嘗試連接到Android設備上通常可用的標準UUID來確定設備是否在範圍內。如果連接呼叫:

  • 失敗,則遠程設備超出範圍或其藍牙被禁用。
  • 成功,那麼遠程設備在範圍內,你應該關閉連接,然後嘗試連接到你的應用程序的UUID ...如果失敗,那麼沒有偵聽套接字...如果成功,那麼所有好。

示例代碼:

public BluetoothSocket connect(BluetoothDevice remoteDevice) throws IOException 
{ 
    OPP_UUID = UUID.fromString("00001105-0000-1000-8000-00805f9b34fb"); 

    // check if remote device is in range...throw exception if out of range 
    try 
    { 
     BluetoothSocket socket = remoteDevice 
      .createRfcommSocketToServiceRecord(OPP_UUID); 
     socket.connect(); 
     socket.close(); 
    } 
    catch(IOException ex) 
    { 
     throw new IOException("out of range",ex); 
    } 

    // try to connect to service on remote device...throw exception if UUID 
    // is not available 
    try 
    { 
     BluetoothSocket socket = remoteDevice 
      .createRfcommSocketToServiceRecord(MY_UUID); 
     socket.connect(); 
     return socket; 
    } 
    catch(IOException ex) 
    { 
     throw new IOException("no listening server socket",ex); 
    } 
} 

我以前BluetoothDevice.getUuids()讓我的Android設備上的一個可用的UUID。它給了我這個名單:

0000110a-0000-1000-8000-00805f9b34fb - Advanced Audio Distribution Profile (0x110a) 
00001105-0000-1000-8000-00805f9b34fb - Object Push Profile (0x1105) // least invasive one...it seems 
00001115-0000-1000-8000-00805f9b34fb - Personal Area Networking Profile (0x1115) 
0000112f-0000-1000-8000-00805f9b34fb - Phonebook Access (0x112f) // this works! 
00001112-0000-1000-8000-00805f9b34fb - Headset - Audio Gateway (0x1112) 
0000111f-0000-1000-8000-00805f9b34fb - Handsfree Audio Gateway (0x111f) 
00001132-0000-1000-8000-00805f9b34fb - Message Access Profile (0x1132) // this works too! 
00000000-0000-1000-8000-00805f9b34fb - Base UUID (0x0000) // couldn't get this to work :(

Standard UUIDs from Bluetooth spec.