Bluetooth сканирует устройства, но не может записать на устройство после частого сканирования - PullRequest
1 голос
/ 19 февраля 2020

Вариант использования: Я написал приложение безопасности, которое работает вместе с Bluetooth Me sh. Me sh содержит пользовательские индикаторы и сигналы тревоги. Чтобы проверить состояние системы me sh, мое приложение сканирует одно из ближайших устройств (по силе RSSI), чтобы увидеть, какие данные содержит индикатор / сигнал Bluetooth в своем пакете ответа сканирования. Поскольку это приложение безопасности, мое приложение сканирует каждые 15 секунд , чтобы убедиться, что оно всегда содержит самую свежую информацию. Об угрозах безопасности сообщается в полицию, поэтому важно быть в курсе последних событий. Секунды имеют значение. Примерно через пару недель после запуска приложение может сканировать данные, но больше не может подключаться к устройству. Единственный способ «очистить» будильник - использовать приложение, поэтому необходимо иметь возможность записи на устройство при необходимости.

Мой вопрос: Почему это происходит? Как это возможно, что я могу сканировать устройства, но больше не записывать на устройство?

Затронутый Device Logcat: Я смог найти устройство, которое было в этом состоянии проблемы и собрал logcat при попытке записи на устройство. Как видите, я могу подключиться, посмотреть сервисы и даже обновить MTU. Но не могу записать на устройство. Мое приложение автоматически пытается 5 попыток, и это последняя попытка. Обратите внимание, что я пытался включить и выключить Bluetooth. Перезапуск планшета, похоже, решил проблему. К сожалению, я не пытался сначала закрыть и перезапустить приложение ....

E/Bluetooth LE: Best RSSI Position set
E/Bluetooth LE: Bluetooth Device saved                      
D/BluetoothGatt: connect() - device: 00:A0:50:E1:88:51, auto: false
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=3b720df8-2e40-47bf-aa2c-99c0c1fba362
E/Bluetooth LE: Attempting To Connect to GATT
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=00:A0:50:E1:88:51
D/BluetoothGatt: discoverServices() - device: 00:A0:50:E1:88:51
D/BluetoothGatt: onConnectionUpdated() - Device=00:A0:50:E1:88:51 interval=6 latency=0 timeout=500 status=0
D/BluetoothGatt: onSearchComplete() = Device=00:A0:50:E1:88:51 Status=0
E/Bluetooth: GATT Services count: 3
E/Bluetooth: Service Found - UUID: 00001800-0000-1000-8000-00805f9b34fb
E/Bluetooth: Service Found - UUID: 00001801-0000-1000-8000-00805f9b34fb
E/Bluetooth: Service Found - UUID: 0000cbbb-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: configureMTU() - device: 00:A0:50:E1:88:51 mtu: 50
D/BluetoothGatt: onConnectionUpdated() - Device=00:A0:50:E1:88:51 interval=39 latency=0 timeout=500 status=0
D/BluetoothGatt: onConfigureMTU() - Device=00:A0:50:E1:88:51 mtu=50 status=0
D/Surface: Surface::disconnect(this=0x74241f7000,api=1)
D/View: [Warning] assignParent to null: this = android.widget.LinearLayout{f04b3f V.E...... ......ID 0,0-333,75}
D/BluetoothManager: getConnectedDevices
D/BluetoothManager: getConnectedDevices
E/Bluetooth Gatt: Closing Gatt
D/BluetoothGatt: cancelOpen() - device: 00:A0:50:E1:88:51
D/BluetoothGatt: close()
D/BluetoothGatt: unregisterApp() - mClientIf=6
D/BluetoothManager: getConnectedDevices
W/package.name: type=1400 audit(0.0:38806): avc: denied { search } for name="custom" dev="dm-0" ino=3890 scontext=u:r:untrusted_app:s0:c100,c256,c512,c768 tcontext=u:object_r:custom_file:s0 tclass=dir permissive=0
D/ViewRootImpl[Toast]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
D/Surface: Surface::connect(this=0x74241f7000,api=1)
D/Surface: Surface::allocateBuffers(this=0x74241f7000)
D/BluetoothAdapter: isLeEnabled(): ON
D/BluetoothLeScanner: onScannerRegistered() - status=6 scannerId=-1 mScannerId=0
D/BluetoothAdapter: isLeEnabled(): ON
D/BluetoothLeScanner: could not find callback wrapper

Дальнейшее тестирование: Для проведения тестирования я создал небольшое приложение, которое может переключать свет включить и выключить. Я настроил приложение на сканирование каждые 3 секунды в течение часа. Результаты были похожи в том, что я мог сканировать устройства, но не подключался и не включал свет, записывая данные на него. После того, как проблема возникла в новом приложении-переключателе, я переключился на свое основное приложение безопасности, которое работало все время, и оно работало нормально. Очевидно, проблема касается только приложения, которое сканирует слишком часто. Разница в logcat меня немного беспокоит - после возникновения проблемы logcat показывает состояние onClientRegistered как 133, что имеет некоторый смысл. Главное приложение не показывало это все же. Интересно, это две разные проблемы?

D/BluetoothAdapter: STATE_ON
D/BluetoothAdapter: STATE_ON
D/BluetoothLeScanner: Start Scan with callback
D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=9 mScannerId=0
D/InputTransport: Input channel constructed: fd=88
D/ViewRootImpl@dc2b515[Toast]: setView = android.widget.LinearLayout{251b02a V.E...... ......I. 0,0-0,0} TM=true MM=false
V/Toast: Text: Uogg in android.widget.Toast$TN@af0fe1b
D/ViewRootImpl@dc2b515[Toast]: dispatchAttachedToWindow
D/ViewRootImpl@dc2b515[Toast]: Relayout returned: old=[0,63][1080,2094] new=[247,1810][832,1926] result=0x7 surface={valid=true 509882912768} changed=true
D/OpenGLRenderer: eglCreateWindowSurface = 0x76b4a19080, 0x76b763d010
D/BluetoothAdapter: STATE_ON
D/BluetoothGatt: connect() - device: 00:A0:50:DF:22:58, auto: false
D/BluetoothAdapter: isSecureModeEnabled
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=0241923a-48e6-426a-81c0-acbea6690766
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0
E/Bluetooth LE: Disconnected from GATT
E/Bluetooth Gatt: Closing Gatt
D/BluetoothGatt: cancelOpen() - device: 00:A0:50:DF:22:58
D/BluetoothGatt: close()
D/BluetoothGatt: unregisterApp() - mClientIf=0

Режим полета: По какой-то причине включение и выключение Bluetooth ничего не сделало, но включение режима полета решило onClientRegistered () - статус 133 выпуск. Я понятия не имею, почему это будет. Режим «В самолете» очищает весь кэш Bluetooth или аналогичный? В настоящее время я пытался выключать / включать Bluetooth каждые 6 часов, но, похоже, это не сработало. Хотя я не очищаю кеш.

Кроме того, что клиенты выключают свои устройства ночью, что я не могу гарантировать, что ничего не решает проблему. Любые мысли приветствуются здесь.

Редактировать: Я отключил Bluetooth моего устройства и заметил, что мой logcat показывает D/BluetoothAdapter: isLeEnabled(): ON при попытке включить один из индикаторов Bluetooth. Я также видел, что это появляется в logcat моего устройства после попытки сканирования и подключения к устройству. Мне интересно, нужно ли мне отключить Bluetooth и Bluetooth LE, чтобы обновить sh все. Включение и выключение Bluetooth на этом этапе не помогает. Я использую сканер BluetoothLE, так что в этом есть смысл. Немного странное переключение Bluetooth не влияет на LE. Поиск в Google показывает ниже ( Полный код / ​​Кредит здесь ):

@SystemApi
public boolean isLeEnabled() {
    final int state = getLeState();
    if (DBG) {
        Log.d(TAG, "isLeEnabled(): " + BluetoothAdapter.nameForState(state));
    }
    return (state == BluetoothAdapter.STATE_ON
            || state == BluetoothAdapter.STATE_BLE_ON
            || state == BluetoothAdapter.STATE_TURNING_ON
            || state == BluetoothAdapter.STATE_TURNING_OFF);
}
...