Соединение Bluetooth (Android/Bluesmirf) работает корректно, только если оно еще не подключено

Я пытаюсь установить связь через Bluetooth между планшетом Android и Arduino с помощью Bluetooth-ключа BlueSmirf. В своем коде Android я сначала проверяю список уже сопряженных устройств для того, которое ищу. Если его там нет, я начинаю открывать. Обе возможности работают до такой степени, что индикатор состояния на BlueSmirf становится зеленым, указывая на успешное соединение. Но только если устройство не было сопряжено до того, как я запустил приложение, я также могу отправлять / получать данные через Bluetooth. Если устройство было сопряжено ранее, соединение устанавливается более надежно, а также быстрее, но данные не могут быть отправлены или получены. У вас есть идеи, почему это может быть? Спасибо заранее!

Вот соответствующий код:

public void connect() {
// I know I should be using an intent here...
while (!bluetoothAdapter.isEnabled()) {
  bluetoothAdapter.enable();
}

pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
  for (BluetoothDevice device : pairedDevices) {
    if (device.getName().equals("FireFly-8AAD")) {
      mDevice = device;
    }
  }
}

if (mDevice == null) {
  // BroadcastReceiver registered with IntentFilter(BluetoothDevice.ACTION_FOUND)
  registerReceiver(mReceiver, find);
  if (!bluetoothAdapter.isDiscovering ()) {
    bluetoothAdapter.startDiscovery();
  }
}

while (mDevice == null) {
  // Wait for BroadcastReceiver to find the device and
  // connect
}

if (mDevice != null) {
  // Create socket connection in a new thread
  Connect connection = new Connect();
  new Thread(connection).start();
}

while (mSocket == null) {
  // Wait for successfull socket connection
}

if (mSocket != null) {
  // Get input/ouputstream
  Communication communicate = new Communication();
  new Thread(communicate).start();
}

}

ОБНОВИТЬ:

Я теперь также попытался заменить эту часть:

if (pairedDevices.size() > 0) {
  for (BluetoothDevice device : pairedDevices) {
    if (device.getName().equals("FireFly-8AAD")) {
      mDevice = device;
    }
  }
}

с этим:

if (pairedDevices.size() > 0) {
  for (BluetoothDevice device : pairedDevices) {
    if (device.getName().equals("FireFly-8AAD")) {
      mDevice = bluetoothAdapter.getRemoteDevice(device.getAddress());
    }
  }
}

как предлагается здесь: Android Bluetooth принять () / подключиться () с уже сопряженными устройствами

Но это все еще не работает...

ОБНОВЛЕНИЕ 2:

Я заменил

device.getName().equals("FireFly-8AAD")

с

device.getAddress().equals("MAC-Address here")

Все та же проблема.

Я также попытался запустить весь процесс подключения в новом потоке, в отличие от запуска только socket.connect() и socket.getInput/OuputStream, но это тоже не помогает.

ОБНОВЛЕНИЕ 3:

Я подумал, что может помочь, если я также предоставлю код, который устанавливает соединение, с помощью которого я могу отправлять / получать данные:

private class mBroadcastReceiver extends BroadcastReceiver {
  private String discoveredDeviceName;
  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
      discoveredDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
    }

    if (discoveredDeviceName.equals("FireFly-8AAD")) { 
      bt_device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    }
  }
};

1 ответ

При раннем сопряжении bluesmirf я выполняю "cancelDiscovery()" перед connect(), например:

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(macAddr);
if (adapter.isDiscovering()) 
     adapter.cancelDiscovery();
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });  
btSocket = (BluetoothSocket) m.invoke(device, 1);

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

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