Как получить объект BluetoothGatt из RxAndroidBle - PullRequest
0 голосов
/ 10 мая 2018

Как сообщается здесь , у меня есть устаревшее приложение, которое отказывается подключаться к одной из периферийных устройств, которые я пытаюсь поддерживать (работает нормально с другими).RxAndroidBle также успешно подключается, и я думаю использовать его только для того, чтобы установить соединение и передать его остальной части приложения.Мне нужно получить объект BluetoothGatt из RxBleConnection;как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

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

public class GetGattOperation implements RxBleCustomOperation<BluetoothGatt> {

    private BluetoothGatt gatt;

    // How this may work:

    // You call rxBleConnection.queue( <instance of this class> )
    // It returns an Observable<T>--call it Observable A

    // The queue manager calls the .asObservable() method below,
    // which returns another Observable<T>--Observable B
    // It is placed in the queue for execution

    // When it's time to run this operation, ConnectionOperationQueue will
    // subscribe to Observable B (here, Observable.just( bluetoothGatt ))

    // Emissions from this Observable B (here, the bluetoothGatt) are forwarded to the Observable A returned by .queue()

    // Instances can be queued and received via a subscription to Observable A: 
    // rxBleConnection.queue( new GetGattOperation() ).subscribe( gatt -> {} );

    @Override
    public @NonNull Observable<BluetoothGatt> asObservable( BluetoothGatt bluetoothGatt,
                                                            RxBleGattCallback rxBleGattCallback,
                                                            Scheduler scheduler) throws Throwable {

        gatt = bluetoothGatt;
        return Observable.just( bluetoothGatt );  // return Observable B
    }


    public BluetoothGatt getGatt( ) {
        return gatt;
    }

}

Основная программа использует это так (в цепочке операторов .establishConnection()):

.doOnNext( connection -> {
    rxBleConnection = connection;
    connection.queue( new GetGattOperation() )  // queue() returns Observable A
        .subscribe( gatt -> {  // receives events forwarded from Observable B
            Log.i( "Main", "BluetoothGatt received: " + gatt.toString() );
        } );
    } 
)
0 голосов
/ 11 мая 2018

В настоящее время единственный способ получить экземпляр BluetoothGatt - реализовать интерфейс RxBleCustomOperation и использовать его на RxBleConnection.queue(RxBleCustomOperation)

public interface RxBleCustomOperation<T> {

  /**
   * (...)
   */
  @NonNull
  Observable<T> asObservable(BluetoothGatt bluetoothGatt,
                             RxBleGattCallback rxBleGattCallback,
                             Scheduler scheduler) throws Throwable;
}

Помните о Javadoc как на интерфейсе RxBleCustomOperation, так и на функции RxBleConnection.queue(RxBleCustomOperation).

...