मैं एक एंड्रॉइड एप्लिकेशन बना रहा हूं जिसमें ब्लूटूथ लो एनर्जी के संबंध में विशिष्ट आवश्यकताएं हैं।RxAndroidBle एक सतत कनेक्शन रखना + लिखें/अधिसूचना हैंडलिंग
मुझे केवल एक लिखने वाली विशेषता को लिखने और एक अलग अधिसूचना विशेषता पर प्रतिक्रिया प्राप्त करने की आवश्यकता है, और मुझे इसे कई गतिविधियों में करने की आवश्यकता है। क्या पहली विशेषता पर अनुरोध भेजने के लिए कोई आरएक्स तरीका है, दूसरे के उत्तर की प्रतीक्षा करें, फिर दूसरे अनुरोध पर जाएं?
इसके अलावा, RxAndroidBle के मेरे उदाहरण को साझा करने के लिए मैंने कुछ प्रकार के ब्लेमैनगर सिंगलटन के बारे में सोचा, जहां मैं पर्यवेक्षकों का पर्दाफाश करता हूं, इसलिए मैं आसानी से उनके प्रेजेंटर में उनकी सदस्यता ले सकता हूं। मैं बस प्रत्येक गतिविधि के लिए कनेक्शन तर्क की प्रतिलिपि बनाने से बचना चाहता हूं और (आदर्श) एक सतत कनेक्शन है। इस तरह से मैं केवल कनेक्शन का खुलासा कर सकता हूं और इसके लिए सदस्यता ले सकता हूं, इसलिए मैं आसानी से लिखने के अनुरोध भेज सकता हूं और अधिसूचनाएं प्राप्त कर सकता हूं, लेकिन मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है।
यह वही है मैं अब के लिए है:
@Singleton
public class BleManager {
private PublishSubject<Void> disconnectTriggerSubject = PublishSubject.create();
private Observable<RxBleConnection> connectionObservable;
private boolean isConnected;
private final UUID CTRL_FROM_BRIDGE_UUID = UUID.fromString("someUUID");
private final UUID BLE_WRITE_CHARACTERISTIC_UUID = UUID.fromString("someOtherUUID");
private final RxBleClient bleClient;
private String mMacAddress;
private final Context context;
private RxBleDevice bleDevice;
@Inject
public BleManager(Context context, RxBleClient client) {
Timber.d("Constructing BleManager and injecting members");
this.context = context;
this.bleClient = client;
}
public void setMacAddress(String mMacAddress) {
this.mMacAddress = mMacAddress;
// Set the associated device on MacAddress change
bleDevice = bleClient.getBleDevice(this.mMacAddress);
}
public String getMacAddress() {
return mMacAddress;
}
public RxBleDevice getBleDevice() {
Preconditions.checkNotNull(mMacAddress);
return bleClient.getBleDevice(mMacAddress);
}
public Observable<RxBleScanResult> getScanSubscription() {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(bleClient);
return bleClient.scanBleDevices().distinct();
}
public Observable<RxBleConnection> getConnectionSubscription() {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(bleDevice);
if (connectionObservable == null) {
connectionObservable = bleDevice.establishConnection(context, false)
.takeUntil(disconnectTriggerSubject)
.observeOn(AndroidSchedulers.mainThread())
.doOnUnsubscribe(this::clearSubscription)
.compose(new ConnectionSharingAdapter());
}
return connectionObservable;
}
public Observable<byte[]> setupListeners() {
return connectionObservable.flatMap(rxBleConnection -> rxBleConnection.setupNotification(CTRL_FROM_BRIDGE_UUID))
.doOnNext(notificationObservable -> Timber.d("Notification Setup"))
.flatMap(notificationObservable -> notificationObservable)
.observeOn(AndroidSchedulers.mainThread());
}
private void triggerDisconnect() {
disconnectTriggerSubject.onNext(null);
}
public Observable<byte[]> writeBytes(byte[] bytes) {
return connectionObservable.flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(
BLE_WRITE_CHARACTERISTIC_UUID,
bytes)).observeOn(AndroidSchedulers.mainThread());
}
private boolean isConnected() {
return bleDevice.getConnectionState() == RxBleConnection.RxBleConnectionState.CONNECTED;
}
/**
* Will update the UI with the current state of the Ble Connection
*/
private void registerConnectionStateChange() {
bleDevice.observeConnectionStateChanges().observeOn(AndroidSchedulers.mainThread()).subscribe(connectionState -> {
isConnected = connectionState.equals(RxBleConnection.RxBleConnectionState.CONNECTED);
});
}
private void clearSubscription() {
connectionObservable = null;
}
}
बहुत बढ़िया, मैं आपके समाधान का प्रयास करूंगा और आपको बताऊंगा कि यह कैसा चल रहा है। यह वास्तव में सराहना की है क्योंकि मैं आरएक्स दुनिया में नया हूं और अभी भी सीख रहा हूं! –
क्या आपने प्रस्तावित समाधान की कोशिश की है? क्या यह इरादा के रूप में काम किया? –