Время соединения Android BLE

Я разрабатываю приложение BLE на Nexus 4, используя Android BLE API. У меня есть несколько вопросов/сомнений:

1) Есть ли способ установить/переопределить интервал соединения или уведомления центрального устройства BLE. Я обнаружил, что для Android интервал соединения по умолчанию фиксируется до 7,5 мс. Есть ли способ изменить настройки интервала времени подключения/уведомления.

Источник: http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag?DCMP=lprf-stdroid&HQS=lprf-stdroid-pr-wiki1#Supported_Android_devices

2) При подключении к удаленному устройству я столкнулся с проблемой разъединения после случайного периода времени. Есть много людей, столкнувшихся с проблемой отказа подключения, заявляя, что Android нестабилен, когда использует Android 4.3 API для соединения BLE. Есть ли какое-либо решение для этого?

ИЗМЕНИТЬ

что еще я наблюдаю здесь, когда наступает время для повторного подключения, затем он приходит с журналом L2CAP... после журнала

Trying to create a new connection laststate_ BOND_NONE
D/BluetoothGatt( 9620): connect() - device: 1C:BA:81:11:CA:36, auto: true
D/BluetoothGatt( 9620): registerApp()
D/BluetoothGatt( 9620): registerApp() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510
D/BtGatt.GattService( 3208): registerClient() - UUID=1adsds0911-4sdsc-41dc-8ac0-0sdsdf550510
D/BtGatt.btif( 3208): btif_gattc_register_app
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1000
D/BtGatt.btif( 3208): btif_gattc_upstreams_evt: Event 0
D/BtGatt.GattService( 3208): onClientRegistered() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510, clientIf=5
D/BluetoothGatt( 9620): onClientRegistered() - status=0 clientIf=5
D/BtGatt.GattService( 3208): clientConnect() - address=1C:BA:8C:1E:CA:36, isDirect=true
D/BtGatt.btif( 3208): btif_gattc_open
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1004
D/BtGatt.btif( 3208): btif_get_device_type: Device [1c:ba:8c:1e:ca:36] type 2, addr. type 0
W/bt-l2cap( 3208): L2CAP - LE - cannot start new connection at conn st: 3

Любая идея, как очистить cahce mantain от L2CAP?

Ответ 1

Когда я изучил API Android BLE, я не смог найти API для изменения интервала подключения и тайм-аута контроля (может быть, и латентность ведомого устройства, не помню с моей головы). Мне нужно их изменить, вы должны сделать это с ведомого устройства.

Ответ от Ашвини, который вы можете просто игнорировать, то, что он говорит, просто неверен. Мастер-устройство, совместимое с Bluetooth 4.0, должно поддерживать интервалы подключения от 7,5 мс до 4,0 секунд. Ведомое устройство может запрашивать изменение параметров соединения и отправляет запрос обновления параметра соединения, и ведущий будет соответствующим образом обновлять параметр соединения.

С другой стороны, мастер (в вашем случае Android-устройство) может заинтересовать в изменении интервала подключения самостоятельно, чтобы сэкономить электроэнергию, и вы хотели бы изменить интервал подключения на более расслабленный интервал.

По моему мнению, API Android и даже аппаратная реализация на нескольких устройствах являются незрелыми и используют BLE, в том смысле, что BLE предназначался для использования на Android-устройстве. В будущем, я считаю, вы увидите гораздо лучшую поддержку на уровне API и разделение хоста и контроллера, чтобы контроллер мог поддерживать связь даже в том случае, когда основной процессор мобильного устройства спит. Это сэкономит много сил, и вы сможете поддерживать связь с устройствами BLE 24/7 без каких-либо серьезных ограничений на время автономной работы.

Ответ 2

@Ashwini: Как уже упоминалось в последнем комментарии с интервалом 7.5 соединения, он работает лучше в течение некоторого времени. Через некоторое время появляется проблема с L2CAP, и подключение не работает, если адаптер Bluetooth отсутствует reset. Кроме того, было замечено странное поведение, когда адаптер Bluetooth отключен и снова включен снова программно. Ниже приведена следующая ошибка GKI:

> /GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception(): Task State Table
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [0] task name [BTU] state [0]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest#####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: 
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): 
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: ***************
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####

Кроме того, помогает ли этот API-интерфейс createBond в улучшении соединения с устройством BLE (которое на самом деле не требует сопряжения для соединения)?

Ответ 3

Для вашего первого вопроса, как сказал OneWorld, желательно, чтобы смартфон обрабатывал настройки интервала задержки соединения. Эти настройки тесно зависят от оборудования Bluetooth и стека, используемых для конкретного смартфона.

О проблеме разъединения я также столкнулся с подобными проблемами. Я думаю, это связано с issue, зарегистрированным в данной ссылке. Когда ОС обрабатывает соединение и сопряжение, вы не можете отключить устройство, и после этого все попытки повторного подключения завершатся неудачей. Этого не происходит, если устройство сопрягается (и непарно) программно, используя частные API в 4.3, при условии, что вы правильно обработали соединения GATT. В android 4.4.2 для спаривания добавлен API-интерфейс createBond. Таким образом, с 4.4.2 связь работает очень хорошо.

Что касается стабильности низкой энергии Bluetooth на Android, я могу подтвердить, что он довольно неустойчив. Я протестировал приложение, установленное на Nexus 4 и Nexus 5 с датчиком низкой энергии. Несмотря на то, что у той же ОС версии 4.4.2 оба устройства дали разные результаты для соединения. Я заметил, что устройство было отключено через некоторое время на Nexus 4, в то время как для Nexus 5 все работало хорошо.

Надеюсь, это поможет вам продвигаться вперед по вашей проблеме.

Ответ 4

Я встретил проблему автоматического отключения, как и ваш второй вопрос. Два способа его решения:

1) Перед запуском приложения вручную подключите Android-устройство с удаленным устройством через Bluetooth.

2) Или вы можете программно связать их в своем коде. Здесь код пары, который я нашел онлайн, который работает для меня

private void pairDevice(BluetoothDevice device) {
        try {
            Log.d("pairDevice()", "Start Pairing...");
            Method m = device.getClass()
                    .getMethod("createBond", (Class[]) null);
            m.invoke(device, (Object[]) null);
            Log.d("pairDevice()", "Pairing finished.");
        } catch (Exception e) {
            Log.e("pairDevice()", e.getMessage());
        }
    }

Ответ 5

Что касается изменения интервала подключения:

С Android Lollipop API уровня 21 вы можете использовать: requestConnectionPriority() С 3 уровнями: CONNECTION_PRIORITY_BALANCED, CONNECTION_PRIORITY_HIGH или CONNECTION_PRIORITY_LOW_POWER.

Он по-прежнему не так универсален, как хотелось бы разработчикам, но, по крайней мере, что-то...