Я обнаружил проблему, которая возникает в 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
Программисты JAVA общаются здесь
1737479788
Anonymous
Я обнаружил проблему, которая возникает в 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) для [b]всех[/b] зарегистрированных экземпляров 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());
}
}
}
};
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79375344/potential-bug-in-movesense-mobile-lib-when-connecting-multiple-movesensors-to-ho[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия