Устройство BLE отключается после получения уведомлений (статус BLEGattException = 0x8)

Мой сервер BLE постоянно измеряет значение датчика и отправляет уведомление с 20-байтовыми пользовательскими данными после каждого измерения. Цель состоит в том, чтобы создать как можно большую пропускную способность.

На стороне клиента значение, отправленное сервером, принимается и обрабатывается.

rxBleConnection.setupNotification(setDescriptorEnableNotification(characteristic))
                .flatMap(notificationObservable -> notificationObservable)
                .observeOn(Schedulers.newThread())
                .buffer(1)
                .subscribe(bytes -> {
                            onNotificationReceived(bytes, buffer);
                        } , throwable -> {
                            // Handle an error here.
                            onNotificationSetupFailure(throwable);
                        }

                ); 

Если я установлю Connection intervall на 11,25 мс, я получу все значения. Однако, если я устанавливаю интервал соединения на 30 мс, я получаю несколько значений, а затем соединение закрывается.

В журнале Android я вижу следующее сообщение:

Статус BleGattException = 8 (0x8), bleGattOperationType = BleGattOperation {description = 'CONNECTION_STATE'

Почему соединение прерывается и что послужило причиной?

С помощью BLE Sniffer это не узнать. Установленные параметры соединения принимаются и начинается передача. Внезапно передача обрывается и появляется сообщение об ошибке.

Обновление: добавлен скриншот BLE Sniffer: введите здесь описание изображения


person Chris 123    schedule 11.05.2017    source источник


Ответы (5)


30 мс, это интервал подключения, который вы устанавливаете на сервере или в Android?

Кстати, на андроиде можно установить скоростной режим

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    mBluetoothGatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
}
person cxphong    schedule 11.05.2017
comment
Интервал 30 мс, который я установил на стороне сервера. Я использую Arduino 101 с CurieBLE. - person Chris 123; 11.05.2017

Ошибка 8 означает, что время ожидания соединения истекло. На стороне Android все в порядке. Проблема связана со связью между двумя контроллерами Bluetooth. Если у вас есть сниффер, вы сможете увидеть, кто не может отправить пакеты.

person Emil    schedule 11.05.2017
comment
Снифером ничего не видно. Однако флаг More Data установлен в true. Следующее сообщение имеет флаг Sequence Number = False - person Chris 123; 11.05.2017
comment
Вы должны опубликовать журнал сниффера на форуме поддержки производителя чипа периферийного устройства, чтобы получить хорошее объяснение. - person Emil; 12.05.2017

Вот изображение из BLE Sniffer.

BLE Sniffer

person Chris 123    schedule 11.05.2017

У меня аналогичная проблема. В Android 7.0 было два способа сохранить соединение:

1) Если устройства связаны и есть обратный вызов чтения характеристик с постоянным потоком пакетов. Если пакетов какое-то время нет, то соединение не устанавливается.

2) Если девиды не приклеены, но делаю TXCharacheristic.read каждые несколько секунд. Если этого не сделать какое-то время, соединение не будет установлено.

Но сейчас в Android 7.1.2 этот способ не работает. Возможно, вам подойдет первый способ. На вашем устройстве Android вы должны сделать соединение, на вашем комплекте вы должны справиться с этим соединением. На Nexus 6P и Samsung S7 больше не работает, но на других устройствах не пробовал.

person Alan Maxwell    schedule 16.05.2017

Я полагаю, у вас есть минимальный интервал соединения 7,5 на вашем комплекте BLE, но теперь он устарел на Android. Попробуйте установить минимальный интервал соединения на 11,25 на вашем комплекте BLE и установите приоритет соединения.

gatt.requestConnectionPriority (CONNECTION_PRIORITY_HIGH);

где CONNECTION_PRIORITY_HIGH = 1

в onConnectionStateChange. Это сработало для меня, когда я изменил минимальный интервал соединения в своем скандинавском с 7,5 до 11,25.

person Alan Maxwell    schedule 23.05.2017