Невозможно подключить устройство Bluetooth

Я пытаюсь подключить устройство Bluetooth и хочу отправить данные на это устройство, а также хочу получать данные с этого устройства.

Чтобы добиться этого, я следую документу Bluetooth для Android-разработчика, но, похоже, я не могу подключить другое устройство, потому что при подключении оно выдает следующее исключение.

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

Шаги, которым я следую.

  1. Включение Bluetooth

    Intent turnOnIntent = new Intent(
                    BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(turnOnIntent, REQUEST_ENABLE_BT);
    
  2. Получение Bluetooth-сопряженного устройства

    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

Я застрял на этом в последние три дня, но до сих пор не получаю никакого решения.

2 ответа

Вот пример кода, который я использую для подключения к своему модулю Bluetooth.

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();
        }
    }



}

Лучший способ - обратиться к образцу приложения чата, предоставляемого Android. Это охватывает все необходимые задачи, такие как вывод списка доступных устройств, установление соединения, отправка данных и получение и т. Д. Вы можете получить это и сослаться. https://android.googlesource.com/platform/development/+/eclair-passion-release/samples/BluetoothChat

Другие вопросы по тегам