2016-03-14 4 views
3

Я подключаюсь к устройству BLE с помощью метода connectGatt() в Android. Это отлично работает.Полностью отключить устройство с низким энергопотреблением Bluetooth

Когда я отключаю я использую следующее:

private void disconnectDevice() { 
    gatt.disconnect(); 
} 

Когда я получаю обратный вызов я близко.

private BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     switch (newState) { 
      case BluetoothProfile.STATE_CONNECTED: 
       Log.d("BLED-GATT", "STATE_CONNECTED"); 
       setUIConnectionStatus("Discover services on device...", Color.YELLOW); 
       checkEnableAddButton(simpleTrackEditText.getText().toString()); 
       gatt.discoverServices(); 
       break; 
      case BluetoothProfile.STATE_DISCONNECTED: 
       Log.d("BLED-GATT", "STATE_DISCONNECTED"); 
       setUIConnectionStatus("Not Connected!", Color.RED); 
       gatt.close(); 
       break; 
      default: 
       Log.d("BLED-GATT", "STATE_OTHER"); 
     } 
    } 
} 

Это выполняется, и я больше не может управлять устройством после вызова disconnectDevice(). Сам аппарат, похоже, считает, что он все еще подключен, так как я не могу его включить в режиме видимости видимости (что происходит, если оно уже имеет соединение). Однако, если я убью приложение и откройте его снова, я могу настроить устройство в режиме широковещания. Это говорит мне, что приложение не было должным образом отключено.

Любая идея, что я пропустил здесь?

+1

Вы перестали сканировать устройства после подключения к устройству? У меня была аналогичная проблема, с которой телефон оставался подключенным к микросхеме даже после вызова разъединения. Проблема заключалась в том, что я никогда не вызывал mScanner.stopScan (mScanCallback) после успешного соединения. – SoroushA

+0

Спасибо, но да, я вызываю stopScan при успешном соединении. – nilsi

ответ

3

Проблема заключалась в том, что я во время сканирования соединялся с несколько раз то же устройство вызывает мое приложение, чтобы иметь много открытых соединений одновременно. Добавление !isConnected() решило проблему:

/** 
* Connects to the device. Does nothing if already connected. 
* @param macAddress the address of the device. 
*/ 
private void connectDevice(String macAddress) { 
    if (!isConnected()) { 
     device = bluetoothAdapter.getRemoteDevice(macAddress); 

     if (device == null) { 
      this.sendToast("Device Not Available"); 
     } else { 
      Log.d("BLED", "Connecting..."); 
      gatt = device.connectGatt(this, true, gattCallback); 
     } 
    } 
} 
+0

Does 'isConnected()' возвращает какую-то частную переменную, которую вы отслеживаете? Можете ли вы подробнее рассказать ...? Спасибо! – Tanasis

+0

Не помню, но я думаю, что это был просто метод полезности, который я сделал. Проверка, была ли 'gatt' пустой, если так, то я был уверен, что уже нет связи. Я также должен был установить 'gatt' значение null в' onConnectionStateChange', я думаю – nilsi

1

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

public void disconnect() { 
     if (mBluetoothAdapter == null || mBluetoothGatt == null) { 
      Log.w(TAG, "BluetoothAdapter not initialized"); 
      return; 
     } 
     mBluetoothGatt.disconnect(); 
    } 

попытка вызвать этот метод перед закрытием вашего GATT

+4

Я отсоединяюсь перед закрытием, callback вызывается при отключении. Что означает, что я уже отключил его при вызове 'close()'? Ваш ответ добавляет только нулевой код в мой код? – nilsi

+0

no no на самом деле вы должны вызвать метод разъединения, иначе он просто закроет Gatt без отключения! просто попробуйте его – Fakher

Смежные вопросы