2011-05-07 71 views
0

如果有人能幫助我,我將不勝感激。我試圖連接到客戶提供給我的一些自定義藍牙硬件。我虔誠地遵循了API文檔,並且正在使用以下代碼(主要是從官方文檔複製並縫製在一起)與藍牙硬件建立套接字連接,用戶從我的Android應用程序的列表視圖中選擇該套接字作爲設備。Android:藍牙 - 無法建立連接,IOException「通過對等方重置連接」

private class CommunicationThread extends Thread { 
    private final BluetoothSocket mmSocket; 

    public CommunicationThread(BluetoothDevice device) { 
     super(); 
     // use a temporary object that is later assigned to mmSocket, 
     // because mmSocket is final 
     BluetoothSocket tmp = null; 
     BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     // get a BluetoothSocket to connect with the given BluetoothDevice 
     try { 
      // create rf communication socket using a unique identifier for this app 
      tmp = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
     } catch (Exception e) { 
      Log.d("An exception occurred during bluetooth rf communication server socket creation","NDB",e); 
     } 
     mmSocket = tmp; 

     // cancel discovery because it will slow down the connection 
     mBluetoothAdapter.cancelDiscovery(); 
    } 

    public void run() { 
     try { 
      // connect the device through the socket. This will block 
      // until it succeeds or throws an exception 
      mmSocket.connect(); 
     } catch (IOException e) { 
      Log.d("An exception occurred during bluetooth socket connection","NDB",e); 
      // unable to connect; close the socket and get out 
      try { 
       mmSocket.close(); 
      } catch (IOException closeExc) { 
       Log.d("An exception occurred while attempting to close bluetooth socket","NDB",closeExc); 
      } 
      return; 
     } 

     // do work to manage the connection 
     manageConnectedSocket(); 
    } 

    private void manageConnectedSocket() { 
     InputStream tmpIn = null; 

     // get the input steram, use temp object because 
     // member stream is final 
     try { 
      tmpIn = mmSocket.getInputStream(); 
     } catch (IOException e) { 
      Log.d("An exception occurred during bluetooth io stream creation","NDB",e); 
     } 

     final InputStream mmInStream = tmpIn; 

     byte[] buffer = new byte[1024]; // buffer store for the stream 
     int bytes; // bytes returned from read() 

     // keep listening to the InputStream until an exception occurs 
     while (true) { 
      try { 
       // read from the InputStream 
       bytes = mmInStream.read(buffer); 
       // send the obtained bytes to the message handler 
       bluetoothHandler.obtainMessage(/*MESSAGE_READ*/1, bytes, -1, buffer).sendToTarget(); 
      } catch (IOException e) { 
       break; 
      } 
     } 
    } 

    /** Cancels an in-progress connection, and closes the socket */ 
    public void cancel() { 
     try { 
      mmSocket.close(); 
     } catch (IOException e) { } 
    } 
} 

的問題是,在試圖使用內mmSocket.connect()幾秒鐘調用塊run()連接到硬件然後引發與描述java.io.IOException: Connection reset by peer異常。我在下面粘貼了相關的LogCat輸出,並附上了相關的線路供您參考。

05-07 13:29:08.675: INFO/ActivityThread(1370): Receiving broadcast android.bleutooth.device.action.UUID seq=-1 to [email protected]38 
05-07 13:29:08.675: ERROR/ActivityThread(1370): start dispatch OnReceive message,mRegistered=true mCurOrdered=false intent=Intent { act=android.bleutooth.device.action.UUID (has extras) } receiver = [email protected]98 
05-07 13:29:08.675: VERBOSE/BluetoothEventRedirector(1370): Received android.bleutooth.device.action.UUID 
05-07 13:29:08.675: ERROR/xubo(1370): mBroadcastReceiver receive msg = android.bleutooth.device.action.UUID 
05-07 13:29:08.685: ERROR/ActivityThread(1370): exit dispatch OnReceive message,mRegistered=true mCurOrdered=false 
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827): NDB 
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827): java.io.IOException: Connection reset by peer 
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827):  at android.bluetooth.BluetoothSocket.connectNative(Native Method) 
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827):  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:204) 
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827):  at com.ndb.proj.Communicator$CommunicationThread.run(Communicator.java:157) 
05-07 13:29:18.595: DEBUG/bluez/src/device.c(8031): /org/bluez/8031/hci0/dev_00_06_66_05_70_E7: canceling authentication request 
05-07 13:29:18.595: ERROR/BluetoothEventLoop.cpp(1204): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/8031/hci0/dev_00_06_66_05_70_E7 
05-07 13:29:18.595: DEBUG/BluetoothEventLoop(1204): Device property changed:00:06:66:05:70:E7property:Connected 
05-07 13:29:18.605: INFO/ActivityThread(1204): Receiving broadcast android.bluetooth.device.action.ACL_DISCONNECTED seq=-1 to [email protected]18 
05-07 13:29:18.605: ERROR/ActivityThread(1204): start dispatch OnReceive message,mRegistered=true mCurOrdered=false intent=Intent { act=android.bluetooth.device.action.ACL_DISCONNECTED (has extras) } receiver = [email protected] 
05-07 13:29:18.615: ERROR/ActivityThread(1204): exit dispatch OnReceive message,mRegistered=true mCurOrdered=false 
05-07 13:29:18.615: INFO/ActivityThread(1370): Receiving broadcast android.bluetooth.device.action.PAIRING_CANCEL seq=-1 to [email protected]38 
05-07 13:29:18.625: ERROR/ActivityThread(1370): start dispatch OnReceive message,mRegistered=true mCurOrdered=false intent=Intent { act=android.bluetooth.device.action.PAIRING_CANCEL } receiver = [email protected]98 
05-07 13:29:18.625: VERBOSE/BluetoothEventRedirector(1370): Received android.bluetooth.device.action.PAIRING_CANCEL 
05-07 13:29:18.625: ERROR/xubo(1370): mBroadcastReceiver receive msg = android.bluetooth.device.action.PAIRING_CANCEL 
05-07 13:29:18.625: ERROR/ActivityThread(1370): exit dispatch OnReceive message,mRegistered=true mCurOrdered=false 

客戶已通知'配對代碼'是1234.但是,我的android手機與設備配對沒有指定此。我已經通過進入藍牙設置進行了驗證,並且設備實際上報告爲已配對。

任何人都可以建議發生了什麼問題嗎?

回答

2

所以原來問題是沒有輸入配對代碼(杜!)。我用編程方式與設備配對,該設備沒有請求任何配對代碼輸入,因此配對不合適。

定盤進入Settings -> Wireless & networks -> Bluetooth settings,長按「配對」設備並選擇Unpair,然後該產生的Bluetooth pairing request窗口與文本框,在其中我鍵入的PIN(配對代碼)在設備上的單壓。

完成此操作後,配對成功,上述代碼完美工作。

2

該死,我正要發佈一個答案,我看你有固定的吧:)

的關鍵是在這條線:

05-07 13:29:18.595: DEBUG/bluez/src/device.c(8031): /org/bluez/8031/hci0/dev_00_06_66_05_70_E7: canceling authentication request 

這表明藍牙配對需要發生,但沒有發生。

+0

感謝您的信息;-) – KomodoDave 2011-05-20 21:12:20