Я обнаружил проблему, которая возникает в movesense-mobile-lib, когда кто-то пытается быстро подключить несколько датчиков MoveSense к хосту. При выполнении двух вызовов mds.connect(mac, Listener) сразу друг за другом может случиться так, что датчик (mac) связан с неправильным прослушивателем в классе Mds, что приведет к тому, что обратные вызовы прослушивателя будут вызвал неправильные датчики.
Подробное описание/пример проблемы:
Существует два датчика MoveSense:
< ul>
[*]"датчик 1" с mac1 и ConnectionListener1
[*]"Датчик 2" с mac2 и ConnectionListener2
Выдаются следующие вызовы подключения :
mds.connect(mac1, connectionListener1)
mds.connect(mac2, connectionListener2)
В классе Mds вызываемый метод Connect() регистрирует IBleConnectionMonitor для каждого вызова подключения:
public void connect(@NonNull String deviceAddress, @Nullable final MdsConnectionListener callback) {
Log.i(LOG_TAG, "Connecting to BLE device: " + deviceAddress);
Log.i(LOG_TAG, callback == null ? "MdsConnectionListener null" : "MdsConnectionListener exists");
this.ensureMdsConnectionSubscription();
BleManager.IBleConnectionMonitor bleConnMonitor = new BleManager.IBleConnectionMonitor() {
public void onDisconnect(String bleAddress) {
if (Mds.this.macToDisconnectCalled.containsKey(bleAddress)) {
Mds.this.macToConnListenerMap.remove(bleAddress);
Mds.this.macToDisconnectCalled.remove(bleAddress);
}
if (callback != null) {
callback.onDisconnect(bleAddress);
}
}
public void onConnectError(String bleAddress, Throwable t) {
Mds.this.macToConnListenerMap.remove(bleAddress);
if (callback != null) {
callback.onError(new MdsException(t));
}
}
public void onConnect(RxBleDevice bleDevice) {
Mds.this.macToConnListenerMap.put(bleDevice.getMacAddress(), callback);
if (callback != null) {
callback.onConnect(bleDevice.getMacAddress());
}
}
};
...
Предположим, что датчик 1, выполнивший первый вызов mds.connect(), фактически виден BleManager, а датчик 2 остается недостижим. Это приводит к тому, что BleManager запускает обратный вызов onConnect(sensor1) для всех зарегистрированных экземпляров IBleConnectionMonitor. Это означает, что для обоих экземпляров вызовов mds.connect() вызывается onConnect(sensor1).
Итак, теперь onConnect(sensor1) ) обратный вызов экземпляра mds.connect(sensor1, ConnectionListener1) правильно помещает mac1 -> ConnectionListener1 в macToConnListenerMap, но затем Обратный вызов onConnect(sensor1) также выполняется для экземпляра mds.connect(sensor2, ConnectionListener2), который переопределяет запись в macToConnListenerMap с неправильной записью Sensor1 -> ConnectionListener2.
Из этого следует, что обратный вызов onNotification() MdsNotificationListener, экземпляр которого создается в метод обеспеченияMdsConnectionSubscription() вызывается для датчика1, он неправильно извлекает соединениеListener2 из macToConnListenerMap и вызывает обратный вызов onConnectionComplete() для датчика2:
private void ensureMdsConnectionSubscription() {
if (this.mdsConnectionListener == null) {
this.mdsConnectionListener = new MdsNotificationListener() {
public void onNotification(String s) {
...
MdsConnectionListener mdsConnectionListener = (MdsConnectionListener)Mds.this.macToConnListenerMap.get(bleDevice.getMacAddress());
if (mdsConnectionListener != null) {
mdsConnectionListener.onConnectionComplete(bleMacAddess, serial);
}
...
Возможным решением этой проблемы может быть просто фильтрация обратных вызовов IBleConnectionMonitor, чтобы они выполняли действия только в том случае, если переданный mac RxBleDevice bleDevice соответствует переданному mac метод mds.connect(), например:
public void connect(@NonNull String deviceAddress, @Nullable final MdsConnectionListener callback) {
...
this.ensureMdsConnectionSubscription();
BleManager.IBleConnectionMonitor bleConnMonitor = new BleManager.IBleConnectionMonitor() {
...
public void onConnect(RxBleDevice bleDevice) {
if (bleDevice.getMacAddress().equals(deviceAddress)) {
Mds.this.macToConnListenerMap.put(bleDevice.getMacAddress(), callback);
if (callback != null) {
callback.onConnect(bleDevice.getMacAddress());
}
}
}
};
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... sors-to-ho
Потенциальная ошибка в movingsense-mobile-lib при одновременном подключении нескольких датчиков MoveSensor к хосту. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
ОШИБКА SSL HANDSHAKE: ошибка проверки имени хоста при подключении к хосту
Anonymous » » в форуме JAVA - 0 Ответы
- 28 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Подключение к локальному хосту через iPhone при подключении к точке доступа
Anonymous » » в форуме IOS - 0 Ответы
- 78 Просмотры
-
Последнее сообщение Anonymous
-