3

まず、RxAndroidBLEライブラリを使用してBLE接続を管理しています。同時に2つのBLEデバイスから効率的に温度を読み取るにはどうすればよいですか?

私は2つのSensorTag devicesを持っていて、同時に両方から温度を読みたいと思います。たとえば、両方のデバイスの温度を正確に500msごとに読み取って、2つのTextViewでユーザーに表示したいとします。

私のアプリは現在、正常にこのようなBLEデバイスの両方に接続します。

@OnClick(R.id.connectButton1) 
public void connectFirstSensorTag(Button b) { 
    if (!isDeviceConnected(sensorTag1)) { 
     connectionObservable1 = sensorTag1.establishConnection(getApplicationContext(), false).compose(new ConnectionSharingAdapter()); 
    } 

    connectionObservable1.subscribe(new Subscriber<RxBleConnection>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 
      updateStatus(statusTextView1, "SensorTag not found"); 
     } 

     @Override 
     public void onNext(RxBleConnection rxBleConnection) { 
      updateStatus(statusTextView1, "Connected"); 
      enableSensorTagTemperatureSensor(connectionObservable1); 
     } 
    }); 
} 

@OnClick(R.id.connectButton2) 
public void connectSecondSensorTag(Button b) { 
    if (!isDeviceConnected(sensorTag2)) { 
     connectionObservable2 = sensorTag2.establishConnection(getApplicationContext(), false).compose(new ConnectionSharingAdapter()); 
    } 

    connectionObservable2.subscribe(new Subscriber<RxBleConnection>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 
      updateStatus(statusTextView2, "SensorTag not found"); 
     } 

     @Override 
     public void onNext(RxBleConnection rxBleConnection) { 
      updateStatus(statusTextView2, "Connected"); 
      enableSensorTagTemperatureSensor(connectionObservable2); 
     } 
    }); 
} 

は今、私は同時に500msごとの両方からの温度を読むための最良の方法を探しています。

今、私はこのような何かやってる:

connectionObservable1 
       .flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuidFromShortCode("AA01"))) 
       .subscribe(bytes -> { 

        // first temperature was successfully read here 

        connectionObservable2 
          .flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuidFromShortCode("AA01"))) 
          .subscribe(bytes -> { 

           // second temperature was successfully read here 

          }, error -> { 
           updateStatus(error.toString()); 
          }); 
       }, error -> { 
        updateStatus(error.toString()); 
       }); 

をそしてこのコードブロックは、500msごとに呼び出される実行可能な内側にあります。

私はこれを行うには非常に非効率的な方法だと感じます。これを行うより良い方法があれば誰かに教えてもらえますか?

+0

おそらく、読んだらいいえ?また、2つの匿名の "新しい加入者("(これを内部クラスとして抽出し、コンストラクタによって 'statusTextView1/2'を渡します) –

答えて

2

まず、ラジオが1つしかなく、操作が順次である必要があるため、BLEでの真のパラレルリードやその他の操作を行うことはできません。あなたができる最善の方法は、可能な限り次々にそれらを発射することです。 RxAndroidBleを使用すると、シリアル化が管理されます。

あなたは、私はこの方法を見たいものをやってへの道:

RxBleDevice sensorTag0 = // your first SensorTag 
    RxBleDevice sensorTag1 = // your second SensorTag 
    UUID characteristicUuid = uuidFromShortCode("AA01"); 

    Subscription flowSubscription = Observable.combineLatest(
      sensorTag0.establishConnection(this, false), // establishing connections 
      sensorTag1.establishConnection(this, false), 
      Pair::new // merging them together 
    ) 
      .flatMap(connections -> Observable 
        .interval(500, TimeUnit.MILLISECONDS) // every 500 ms 
        .flatMap(aLong -> Observable.combineLatest(
          connections.first.readCharacteristic(characteristicUuid), // performing reads 
          connections.second.readCharacteristic(characteristicUuid), 
          Pair::new // and merging the results 
        ))) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(
        readings -> { 
         updateUISensorTag0(readings.first); // updating the UI 
         updateUISensorTag1(readings.second); 
        }, 
        throwable -> updateStatus(throwable.toString()) // or showing the error 
      ); 

が、これはあなたのお役に立てば幸いです。

よろしくお願いいたします。

+0

ありがとう! RxAndroidBleがこれを行うことができることをどのように知っていましたか?このライブラリで利用可能なすべてのドキュメントを読みました。それの多く)、このようなことを示す例はありませんでした。あなたはソースコードを調べて見つけましたか?あるいは、この図書館について学んだときに忘れたことがありますか?ドキュメンテーションを掘り起こしても解決できない問題が頻繁に出てくるので、私は真に興味を持っています。 – Guy

+0

私はRxAndroidBleライブラリの著者の一人です。図書館はObservable契約に準拠しようとしており、残りはrxJavaの知識と結びついています。上記の例では、 'establishConnection(Context、boolean)'と 'readCharacteristic(UUID)'という2つのライブラリメソッドしか使用しません。残りは純粋なrxJavaです。実際には、同様のフローが存在するExample#5 https://github.com/Polidea/RxAndroidBle/blob/master/sample/src/main/java/com/polidea/rxandroidble/sample/example5_rssi_periodic/RssiPeriodicExampleActivity.javaがあります'readCharacteristic(UUID)'の代わりに 'readRssi()'と一緒に使用されます –

+0

私が尋ねるかもしれない - あなたはどんな情報を期待していますか?そして、どこ?私は利用可能なドキュメントを更新しようとします。 –

0

2つのスレッドを開始することをお勧めします。スレッド1は最初のデバイスをチェックし、スレッド2は2番目のデバイスをチェックします。これにより、両方が同時に読み取られるようになります。両方のコードが完了した後にのみコードを処理するには、ブロック結合ループを実行します。

+0

あなたの答えに感謝します。あなたが言いましたか?私は両方のスレッドがいつ終了したかを知るのに役立つだろうと私は十分に理解しているとは思いません。 – Guy

+0

'thread.join'はスレッドが完了するのを待つことを可能にします。それらがすべて完了していることを確認してください。それはあなたが欲しいものです。 – meedz

+0

それは意味があります、ありがとう!私の例では実行可能なので別の答えを受けましたが、あなたの情報も役に立ちました。 – Guy

関連する問題