2015-04-18 2 views
5

Возможно ли автоматически подключаться к устройствам с низкой энергией Bluetooth (BLE)?Сопряжение устройства Bluetooth с низким энергопотреблением в Android

Android documentation указывает на то, что [BluetoothDevice.connectGatt()] (https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context, логическое значение, android.bluetooth.BluetoothGattCallback)) имеет параметр Autoconnect:

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

Однако, для этого необходимо сначала ввести BluetoothDevice. AFAIK - единственный способ получить это путем сканирования доступных устройств. Настройка сканирования каждый раз для подключения к устройству не кажется желательным. Кроме того, я попытался использовать nRF Control Master Panel для подключения к моему периферийному устройству с помощью autoConnect = true, но это не подключается к устройству. Однако подключение без autoConnect делает его подключенным, и мне удалось с успехом прочитать и записать данные с моего периферийного устройства.

Общий способ Bluetooth для подключения двух устройств. Однако поиск моего устройства BLE и использование BluetoothDevice.createBond() не работает. В моем ACTION_BOND_STATE_CHANGED -callback, EXTRA_BOND_STATE и EXTRA_PREVIOUS_BOND_STATE просто перейдите от BOND_BONDING к BOND_NONE и обратно. Я не зачитываю ошибку или что-то еще - поэтому, возможно, я что-то пропустил. Вот обратный вызов:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 
     if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { 

      final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); 
      final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR); 

      Log.e(TAG, "prevState " + prevState + ", state " + state); 
     } 
    } 
}; 

Так что этот тип соединения не работает.

Мой вопрос: я делаю что-то неправильно для спаривания или autoConnect? Или как я сейчас работаю только с правильным правилом? Кажется, что настоящая боль (и утечка батареи) приходится каждый раз проверять устройства, видеть, есть ли устройство, если это так читать данные и проверять завтра, в противном случае проверить через час или около того. Пункт Bluetooth заключается в том, что он должен соприкасаться напрямую, когда он близок, не так ли?

ответ

5

Он работает без повторного сканирования. Вам не нужно спариваться вообще. Просто позвоните BluetoothGatt.connect() снова для объекта gatt, который вы приобрели с первого подключения. Вы получите сообщение onConnectionStateChange в своем BluetoothGattCallback, как только устройство будет доступно снова. Если вы используете опцию автосоединения, вам даже не нужно вызывать метод BluetoothGatt.connect(). Просто проверьте свой cllback и не забудьте закрыть BluetoothGatt с помощью close(), если вы не видите какое-либо соединение слишком долго.

И да, чтобы получить первое соединение, вы должны сканировать устройства с BluetoothAdapter.startLeScan, а не обычными устройствами Bluetooth.

+0

Итак, каждый раз, когда приложение запускается, первый раз, когда я должен его проверять? Не похоже на очень удобный метод, а не на устройства сопряжения. – jdepypere

+1

yes, Android ble stack не является простым в использовании)))) Все async, rescan при каждом запуске и т. Д. Вы можете попытаться сохранить все в липкой службе, но если он будет закрыт - потребуется повторное сканирование. – Raiv

+0

Хорошо спасибо, думал, что у меня что-то не хватает, потому что я думал, что BLE будет широко поддерживаться ... – jdepypere

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