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.
Sie bedeuten die Schaffung eines lokale Variable statt global? –
Ja - genau das –