Создание Android BLE (Bluetooth LE) довольно стабильно

Я пишу программу, чтобы выполнить следующее сообщение BLE между двумя устройствами Android, которые поддерживают периферийную связь Android (в данном случае MOTOROLA MOTO E поколения 2) с серией: connection -> communication -> disconnection и посмотреть, смогут ли они это сделать С хорошей стабильностью. Также обсуждается проблема, обнаруженная в тесте.

Сначала программа позволяет выбрать, хотите ли вы, чтобы устройство было периферийным или центральным. На центральной стороне программа сначала сканирует периферию с фильтром на Service UUID:

ScanSettings.Builder ssb = new ScanSettings.Builder(); ssb.setReportDelay(0); ssb.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY); ScanSettings ss = ssb.build(); ScanFilter.Builder sfb = new ScanFilter.Builder(); sfb.setServiceUuid(BLEShared.SERVICE_UUID); LinkedList<ScanFilter> lsf = new LinkedList<ScanFilter>(); lsf.add(sfb.build()); BluetoothLeScanner leScanner = m_BluetoothAdapter.getBluetoothLeScanner(); if(leScanner != null) { leScanner.startScan(lsf, ss, blePeripheralScanner); isScanning = true; currentState = BLE_CENTRAL_STATE_SCANNING; } 

Затем, когда периферийное устройство сканируется, обработчик вызовет следующее из основного потока.

 stopScan(); mGatt = result.getDevice().connectGatt(BLECentral.this, false, m_BLECentralGattCallBack); 

Когда подключено периферийное устройство (действует другое MOTO E), в onConnectionStageChange () выполняется следующее:

  if(newState == BluetoothGatt.STATE_CONNECTED) { m_Handler.post(new Runnable(){ public void run() { gatt.discoverServices(); } }); } 

После обнаружения всех служб программа выполняет следующие действия:

Обновление дескрипторов для подписки на уведомления записывает некоторые данные и отправляет их на периферию при получении данных, отправленных из центра, периферийное устройство уведомляет об изменении значения. После получения уведомления об изменении данных от периферии будут отправлять данные на периферию. Процесс Write и notify будет выполнен 11 раз. Затем центральный вызов gatt.disconnect () отключит соединение.

Вышеупомянутый процесс зацикливается для проверки стабильности.

Во время нормального соединения вышеуказанный процесс может быть выполнен в течение 1.7-2.5 секунд. Между каждым процессом уведомления о записи требуется около 0,1 с

Во время теста обнаруживаются следующие проблемы:

  1. OnConnectionStageChange () требуется долгое время называть device.connectGatt () до 30 секунд. Если такое долгое ожидание произойдет, следующий onConnectionStageChange (), вероятно, будет отключен подключением ocassionally.
  2. OnConnectionStageChange () вызывается быстро после device.connectGatt (), но newState = STATE_DISCONNECTED время от времени
  3. Иногда между каждой командой записи требуется 0,5 секунды.
  4. Этот процесс либо стекает, либо замедляется на любом этапе.

Похоже, что есть некоторые ошибки, связанные с стеклом Android BLE. Поэтому я стараюсь внедрить сторожевую собаку, если какой-либо процесс не будет таким быстрым, как ожидалось, сторожевой таймер активирует и выключит Bluetooth центрального устройства и снова включит его, тем самым упреждающе прекратит ожидание ответа от bluetooth Стек, который, как ожидается, будет некоторым значением ошибки. Как только Bluetooth снова включится, центральное устройство начнет сканирование периферийного устройства и продолжит вышеуказанный тест.

Я попытался просто закрыть Gatt во время активации сторожевого таймера, однако после такой силы закрытия Gatt, последовательное соединение BLE имеет тенденцию терпеть неудачу. Так что кажется, что ошибка имеет тенденцию накапливаться после каждого отказа. Поэтому я прибегаю к отключению и подключению Bluetooth-устройства BluetoothAdapter … disable ()

Отключение Bluetooth и повторное включение его снова довольно навязчиво для некоторых пользователей, поскольку они могут использовать другое устройство Bluetooth. Мои вопросы:

  1. Как мы можем повысить стабильность вышеуказанного теста (есть ли что-то не так в моем коде, или как бы то ни было, как лучше использовать стек BLE)?

  2. В случае сбоя можно ли сбросить только стек BLE или закрыть только достаточное количество ресурсов, а не полностью использовать переключатель стека BLE?

Проект eclipse помещается под ним, если вам интересно дать ему тест или улучшить проект, загрузите его и попробуйте. https://drive.google.com/file/d/0B-w_C5ISF1UHRXUzd1FrUHpyV0k/view?usp=sharing