2017-04-30 14 views
0

いくつかのデバイスに同じコマンドを書き、それぞれから通知を受けたいと思います。私の現在のコードでは、私はこれを行うことができますが、彼らはすべての特性UUIDを共有しているので、私は各通知に対応するMACアドレスを伝えることができません。ここで複数の通知から各BLEデバイスを識別するにはどうすればよいですか?

は私のコードです:

for (Map.Entry<String, RxBleDevice> entry : rxBleDeviceHashMap.entrySet()) { 
     bleDevice = MyApplication.getRxBleClient(context).getBleDevice(entry.getKey()); // key is MAC 
     connectionObservable = prepareConnectionObservable(); 
     connectionObservable 
       .flatMap(new Func1<RxBleConnection, Observable<Observable<byte[]>>>() { 
          @Override 
          public Observable<Observable<byte[]>> call(RxBleConnection connection) { 
           return connection.setupNotification(UUID.fromString(Constants.CHARACTERISTIC_UUID)); 
          } 
         }, new Func2<RxBleConnection, Observable<byte[]>, Observable<byte[]>>() { 
          @Override 
          public Observable<byte[]> call(RxBleConnection connection, Observable<byte[]> apScanDataNotificationObservable) { 
           return Observable.combineLatest(
             connection.writeCharacteristic(UUID.fromString(Constants.CHARACTERISTIC_UUID), command), 
             apScanDataNotificationObservable.first(), 
             new Func2<byte[], byte[], byte[]>() { 
              @Override 
              public byte[] call(byte[] writtenBytes, byte[] responseBytes) { 
               runOnUiThread(new Runnable() { 
                @Override 
                public void run() { 
                 onWriteSuccess(writtenBytes); 
                } 
               }); 
               Log.d(TAG, "responseBytes: " + ByteUtil.bytesToHex(responseBytes)); 
               return responseBytes; 
              } 
             } 
           ); 
          } 
         } 
       ).flatMap(new Func1<Observable<byte[]>, Observable<byte[]>>() { 
      @Override 
      public Observable<byte[]> call(Observable<byte[]> observable) { 
       return observable; 
      } 
     }) 
       .first() 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Action1<byte[]>() { 
        @Override 
        public void call(byte[] bytes) { 
         onNotificationReceived(bytes); 
        } 
       }, new Action1<Throwable>() { 
        @Override 
        public void call(Throwable throwable) { 
         onNotificationSetupFailure(throwable); 
        } 
       }); 
    } 

bleDevice.getMacAddress()を使用してMACアドレスを取得する応答通知がループに比べてはるかに遅いので、正確ではありません。私はいつも最後のbleDeviceをループに入れます。

MACアドレスを渡す方法がいくつかあります。

ありがとうございます。

答えて

1

あなたができる最初の事は、行を変更することです:

bleDevice = MyApplication.getRxBleClient(context).getBleDevice(entry.getKey()); // key is MAC 

RxBleDevice bleDevice = MyApplication.getRxBleClient(context).getBleDevice(entry.getKey()); // key is MAC 

にして、あなたは成功した場合に呼び出すことができます。

onNotificationReceived(bytes, bleDevice.getMacAddress()); 
+0

あなたがAを作成する意味グローバル変数ではなくローカル変数? –

+0

はい - そうです –

関連する問題