无法连接蓝牙设备

时间:2014-09-13 08:21:16

标签: android bluetooth bluetooth-socket

我正在尝试连接蓝牙设备,并希望将数据发送到该设备,并且还希望从该设备接收数据。

为实现这一点,我按照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. 连接到设备

  5.    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
    

    我在过去三天仍然坚持这一点,但仍然没有得到任何解决方案。

2 个答案:

答案 0 :(得分:1)

最好的方法是参考Android提供的示例聊天应用程序。这已经涵盖了所有必要的任务,例如列出可用设备,建立连接,发送数据和接收等等。你可以得到它并参考。 https://android.googlesource.com/platform/development/+/eclair-passion-release/samples/BluetoothChat

答案 1 :(得分: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();
        }
    }



}