如何建立连接,然后在一个 activity 中读取特征?
How to establish connection and then read characteristics in one activity?
目前正在修改 sample code,我在尝试建立连接然后读取一个 activity 中的特征时遇到错误。
我在尝试从设备读取时收到 BleAlreadyConnectedException
。我首先在 onCreate 上连接。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device);
// How to listen for connection state changes
bleDevice.observeConnectionStateChanges()
.compose(bindUntilEvent(DESTROY))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onConnectionStateChange);
if (isConnected()) {
triggerDisconnect();
} else {
connectionSubscription = bleDevice.establishConnection(this, true)
.compose(bindUntilEvent(PAUSE))
.observeOn(AndroidSchedulers.mainThread())
.doOnUnsubscribe(this::clearSubscription)
.subscribe(this::onConnectionReceived, this::onConnectionFailure);
}
}
然后尝试读取 onConnectionReceived 中的特征...
private void onConnectionReceived(RxBleConnection connection) {
Log.d(TAG, "onConnectionReceived");
connectionObservable = bleDevice
.establishConnection(this, false)
.takeUntil(disconnectTriggerSubject)
.compose(bindUntilEvent(PAUSE))
.doOnUnsubscribe(this::clearSubscription)
.compose(new ConnectionSharingAdapter());
if (isConnected()) {
connectionObservable
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuid))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bytes -> {
Log.d(TAG, "onConnectionReceived:" + bytes);
}, this::onReadFailure);
}
}
您如何使用 ConnectionSharingAdapter 解决双重 .establishConnection(this, false)?
问题是您正在连接两次。你应该:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device);
// How to listen for connection state changes
bleDevice.observeConnectionStateChanges()
.compose(bindUntilEvent(DESTROY))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onConnectionStateChange);
connectionObservable = bleDevice.establishConnection(this, true)
.compose(bindUntilEvent(PAUSE))
.takeUntil(disconnectTriggerSubject)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnUnsubscribe(this::clearSubscription)
.compose(new ConnectionSharingAdapter());
if (isConnected()) {
triggerDisconnect();
} else {
connectionObservable.subscribe(this::onConnectionReceived, this::onConnectionFailure);
}
}
private void onConnectionReceived(RxBleConnection connection) {
Log.d(TAG, "onConnectionReceived");
connection
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuid))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bytes -> {
Log.d(TAG, "onValueReceived:" + bytes);
}, this::onReadFailure);
}
完整示例为 here.
目前正在修改 sample code,我在尝试建立连接然后读取一个 activity 中的特征时遇到错误。
我在尝试从设备读取时收到 BleAlreadyConnectedException
。我首先在 onCreate 上连接。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device);
// How to listen for connection state changes
bleDevice.observeConnectionStateChanges()
.compose(bindUntilEvent(DESTROY))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onConnectionStateChange);
if (isConnected()) {
triggerDisconnect();
} else {
connectionSubscription = bleDevice.establishConnection(this, true)
.compose(bindUntilEvent(PAUSE))
.observeOn(AndroidSchedulers.mainThread())
.doOnUnsubscribe(this::clearSubscription)
.subscribe(this::onConnectionReceived, this::onConnectionFailure);
}
}
然后尝试读取 onConnectionReceived 中的特征...
private void onConnectionReceived(RxBleConnection connection) {
Log.d(TAG, "onConnectionReceived");
connectionObservable = bleDevice
.establishConnection(this, false)
.takeUntil(disconnectTriggerSubject)
.compose(bindUntilEvent(PAUSE))
.doOnUnsubscribe(this::clearSubscription)
.compose(new ConnectionSharingAdapter());
if (isConnected()) {
connectionObservable
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuid))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bytes -> {
Log.d(TAG, "onConnectionReceived:" + bytes);
}, this::onReadFailure);
}
}
您如何使用 ConnectionSharingAdapter 解决双重 .establishConnection(this, false)?
问题是您正在连接两次。你应该:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device);
// How to listen for connection state changes
bleDevice.observeConnectionStateChanges()
.compose(bindUntilEvent(DESTROY))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onConnectionStateChange);
connectionObservable = bleDevice.establishConnection(this, true)
.compose(bindUntilEvent(PAUSE))
.takeUntil(disconnectTriggerSubject)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnUnsubscribe(this::clearSubscription)
.compose(new ConnectionSharingAdapter());
if (isConnected()) {
triggerDisconnect();
} else {
connectionObservable.subscribe(this::onConnectionReceived, this::onConnectionFailure);
}
}
private void onConnectionReceived(RxBleConnection connection) {
Log.d(TAG, "onConnectionReceived");
connection
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuid))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bytes -> {
Log.d(TAG, "onValueReceived:" + bytes);
}, this::onReadFailure);
}
完整示例为 here.