2017-04-30 4 views
0

Ich möchte den gleichen Befehl auf mehrere Geräte schreiben und Benachrichtigungen von jedem von ihnen erhalten. Mit meinem derzeitigen Code bin ich dazu in der Lage, aber ich kann die MAC-Adresse, die jeder Benachrichtigung entspricht, nicht sagen, da sie alle die gleiche Charakteristik-UUID teilen.Wie kann ich jedes BLE-Gerät anhand mehrerer Benachrichtigungen identifizieren?

Hier ist mein Code:

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); 
        } 
       }); 
    } 

Abrufen der MAC-Adresse bleDevice.getMacAddress() Verwendung ist nicht korrekt, da die Antwort Meldung an die Schleife viel langsamer im Vergleich ist. Ich bekomme immer die letzte bleDevice in der Schleife.

Ich hoffe, es gibt eine Möglichkeit, die MAC-Adresse zu übergeben.

Vielen Dank.

Antwort

1

Das erste, was Sie tun können, ist die Linie zu ändern:

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

zu

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

und dann könnte man auf Erfolg nennen:

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

Sie bedeuten die Schaffung eines lokale Variable statt global? –

+0

Ja - genau das –

Verwandte Themen