2014-09-13 238 views
1

我試圖連接藍牙設備,並希望發送數據到該設備,並且還想從該設備接收數據。無法連接藍牙設備

爲了實現這一點,我遵循android developer bluetooth document,但似乎我無法連接另一個設備,因爲當它連接拋出以下異常。

09-13 13:27:56.913: I/BluetoothConnect(2980): Connect exception:-java.io.IOException: [JSR82] connect: Connection is not created (failed or aborted).  

我遵循的步驟。

  1. 啓用藍牙

    Intent turnOnIntent = new Intent(
           BluetoothAdapter.ACTION_REQUEST_ENABLE); 
         startActivityForResult(turnOnIntent, REQUEST_ENABLE_BT); 
    
  2. 獲取藍牙配對設備

    Set<BluetoothDevice> bondSet = myBluetoothAdapter.getBondedDevices(); 
    ArrayList<HashMap<String, String>> bondedhDevicesList = new ArrayList<HashMap<String, String>>(); 
    for (Iterator<BluetoothDevice> it = bondSet.iterator(); it.hasNext();) { 
        BluetoothDevice bluetoothDevice = (BluetoothDevice) it.next(); 
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("name", bluetoothDevice.getName()); 
        map.put("address", bluetoothDevice.getAddress()); 
        bondedhDevicesList.add(map); 
    
    } 
    
  3. 獲取設備的UUID

    bluetoothDevice = 
           myBluetoothAdapter.getRemoteDevice(address); 
         // min api 15 !!! 
         Method m; 
         try { 
          m = bluetoothDevice.getClass(). 
            getMethod("fetchUuidsWithSdp", (Class[]) null); 
          m.invoke(bluetoothDevice, (Object[]) null); 
         } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
    
  4. 連接到設備

private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"); 

    public ConnectThread(BluetoothDevice device, String uuid, BluetoothAdapter mBluetoothAdapter) { 
    // Use a temporary object that is later assigned to mmSocket, 
    // because mmSocket is final 
    BluetoothSocket tmp = null; 
    this.mBluetoothAdapter = mBluetoothAdapter; 
    mmDevice = device; 

    Method m; 
    try { 
     mBluetoothAdapter.cancelDiscovery(); 
     mmSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 
     m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
     mmSocket = (BluetoothSocket) m.invoke(device, 1); 
    } catch (IOException | IllegalArgumentException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     Log.i("BluetoothConnect", e.toString()); 
     e.printStackTrace(); 
    } 

    //mBluetoothAdapter.cancelDiscovery(); 
    //socket.connect(); 
    } 
    public void run() { 
    // Cancel discovery because it will slow down the connection 
    mBluetoothAdapter.cancelDiscovery(); 
    try { 
     // Connect the device through the socket. This will block 
     // until it succeeds or throws an exception 
     mmSocket.connect(); 
     Constants.globalSocket = mmSocket; 
    } catch (IOException connectException) { 
     // Unable to connect; close the socket and get out 
     Log.i("BluetoothConnect", "Connect exception:-"+connectException.toString()); 
     try { 
      mmSocket.close(); 
     } catch (IOException closeException) { 
      Log.i("BluetoothConnect", "close exception:-"+closeException.toString()); 
     } 
     return; 
    }   
} 

不過一會兒,然後連接我收到這個異常。
5.寫入設備。

public ConnectedThread(BluetoothSocket socket) { 
    mmSocket = socket; 
    InputStream tmpIn = null; 
    OutputStream tmpOut = null; 


    // Get the input and output streams, using temp objects because 
    // member streams are final 
    try { 
     tmpIn = socket.getInputStream(); 
     tmpOut = socket.getOutputStream(); 
    } catch (IOException e) { } 

    mmInStream = tmpIn; 
    mmOutStream = tmpOut; 
    } 
    public void run() { 
    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 UI activity 
      CreatePacket.mHandler.obtainMessage(MESSAGE_READ , bytes, -1, buffer) 
        .sendToTarget(); 
     } catch (IOException e) { 
      Log.i("ConnectedThread", "while receiving data:-"+e.toString()); 
      break; 
     } 
     } 
    }  


    public void write(byte[] bytes) { 
    Log.i("ConnectedThread", "data while writing:-"+bytes.toString()); 
    try { 
     mmOutStream.write(bytes); 
    } catch (IOException e) { 
     Log.i("ConnectedThread", "while writing data to bluetooth:-"+e.toString()); 
    } 
    }  

如果我仍然嘗試寫數據然後我得到以下異常。

請給我任何提示或參考。

09-13 13:48:55.079: I/ConnectedThread(2980): while writing data to bluetooth:-java.io.IOException: socket closed 

我被困在這最後三天,但仍然沒有得到任何解決方案。

回答

1

這裏是我使用連接到我的藍牙模塊的樣本代碼..

public class OpenBluetoothPort extends AsyncTask<String, Void, BluetoothSocket> { 

    private final UUID SPP_UUID = UUID 
      .fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    private BluetoothAdapter mBluetoothAdapter; 
    private OnBluetoothPortOpened mCallback; 
    private BluetoothSocket mBSocket; 

    public interface OnBluetoothPortOpened { 
     public void OnBluetoothConnectionSuccess(BluetoothSocket socket); 
     public void OnBluetoothConnectionFailed(); 
    } 

    public OpenBluetoothPort(Context context, OnBluetoothPortOpened callback) { 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     mCallback = callback; 
    } 

    @Override 
    protected BluetoothSocket doInBackground(String... params) { 
     if(mBluetoothAdapter.isEnabled()) { 
      try { 
       for(BluetoothDevice bt: mBluetoothAdapter.getBondedDevices()) { 
        if(bt.getName().equalsIgnoreCase(params[0])) { 
         BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(bt.getAddress()); 
         mBluetoothAdapter.cancelDiscovery(); 

         mBSocket = device.createRfcommSocketToServiceRecord(SPP_UUID); 
         mBSocket.connect(); 
         return mBSocket; 
        } 
       } 
      } catch(IOException e) { 
       if(mBSocket != null) { 
        try { 
         mBSocket.close(); 
        } catch (IOException e1) { 
         Log.i("Bluetooth Close Exception","Error in closing bluetooth in OpenBluetoothPort.class"); 
         e1.printStackTrace(); 
        } 
        mBSocket = null; 
       } 
       Log.i("Bluetooth Connect Exception","Error in connecting in OpenBluetoothPort.class"); 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(BluetoothSocket result) { 
     super.onPostExecute(result); 
     if(result != null && result.isConnected()) { 
      mCallback.OnBluetoothConnectionSuccess(result); 
     } else { 
      mCallback.OnBluetoothConnectionFailed(); 
     } 
    } 



}