Я хочу знать, почему между DiscoverServices() и onGetService() требуется время.

Я разработал приложение, которое использует ble. Я использовал Eclipse в качестве инструмента разработки.

Мое «приложение, использующее ble» установлено на моем смартфоне. И я подключил свой смартфон и компьютер к usb. Затем на своем смартфоне я запустил разработанное мной «приложение, использующее ble».

И я нашел следующие журналы в Logcat Eclipse.

08-22 20:59:11.278: V/BluetoothLeService(23378): report STATE_CONNECTED
08-22 20:59:11.283: E/BluetoothLeService(23378): ccccc BluetoothGattCallback public void onConnectionStateChange end
08-22 20:59:11.283: I/MainActivity2(23378): BroadcastReceiver CONNECTED
08-22 20:59:11.288: I/MainActivity2(23378): BroadcastReceiver GATT_SUCCESS
08-22 20:59:11.288: I/BluetoothLeService(23378): getBtGatt()
08-22 20:59:11.288: V/MainActivity2(23378): onView mServicesRdy = false
08-22 20:59:11.288: V/MainActivity2(23378): onView mBtGatt = android.bluetooth.BluetoothGatt@4335ebb8
08-22 20:59:11.288: I/BluetoothLeService(23378): getNumServices()
08-22 20:59:11.288: D/BluetoothGatt(23378): discoverServices() - device: 98:7B:F3:52:48:11
08-22 20:59:11.288: E/MainActivity2(23378): mBtGatt.discoverServices() = true
08-22 20:59:11.288: D/BluetoothGatt(23378): discoverServices() - device: 98:7B:F3:52:48:11
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=00001800-0000-1000-8000-00805f9b34fb
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=00001801-0000-1000-8000-00805f9b34fb
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=0000180a-0000-1000-8000-00805f9b34fb
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=f000aa00-0451-4000-b000-000000000000
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=f000aa60-0451-4000-b000-000000000000
08-22 20:59:15.193: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=f000ccc0-0451-4000-b000-000000000000

В приведенном выше журнале

08-22 20:59:11.288: D/BluetoothGatt(23378): discoverServices() - device: 98:7B:F3:52:48:11
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=00001800-0000-1000-8000-00805f9b34fb

Это занимает около 3-4 секунд.

Я хочу знать, почему в этой части требуется около 3-4 секунд.


person 전철우    schedule 22.08.2018    source источник
comment
это полностью зависит от используемого вами устройства Android, устройства Bluetooth, к которому вы подключаетесь, условий подключения и т. д. Другими словами, ответ будет просто потому, что это так   -  person Vladyslav Matviienko    schedule 22.08.2018
comment
Спасибо за ответ.   -  person 전철우    schedule 22.08.2018


Ответы (2)


Это то, что зависит от структуры Bluetooth. Все действия Bluetooth LE являются асинхронными и возвращаются немедленно, но их функция выполняется на основе собственного внутреннего планирования ОС. Обычно запуск сканирования может начаться очень быстро, но в определенные моменты времени оно может быть отложено до того, как будет запущен обратный вызов отсканированного устройства. Обычно я замечал задержку при использовании функций Bluetooth на устройстве, которое недавно было выключено или находилось в режиме ожидания в течение значительного времени. Обычно после первого сканирования все последующие сканирования были быстрыми и отзывчивыми.

Я думаю, что ОС выполняет некоторую операцию по экономии заряда батареи и внутренне отключает радиомодули Bluetooth (это только предположение, и я не проводил никаких тестов, чтобы доказать это).

person cincy_anddeveloper    schedule 22.08.2018
comment
Спасибо за ответ. если да, то может ли прошивка оказать большее влияние, чем программа-приложение? - person 전철우; 22.08.2018
comment
@전철우 Я имею в виду, что приложение не может делать больше, чем предоставляет API. Многие внутренние компоненты Bluetooth абстрагированы, поэтому приложения не могут делать ничего опасного. Bluetooth API, по сути, предлагает только часть всех возможностей оборудования. По крайней мере, насколько мне известно, приложение не может обойти API-интерфейсы Bluetooth и получить прямой контроль над оборудованием. - person cincy_anddeveloper; 22.08.2018

Обнаружение сервисов требует времени, потому что протокол Bluetooth GATT отстой и очень плохо оптимизирован. Это болтливый протокол, требующий множества запросов и ответов. Гораздо лучше было бы просто запросить «дайте мне структуру GATT», а затем сервер GATT ответит пакетом со всей информацией.

Время, необходимое для этого, зависит от того, сколько сервисов, характеристик и дескрипторов имеет сервер GATT периферийного устройства. Это также зависит от того, являются ли UUID 16-битными или 128-битными UUID. Это не имеет ничего общего с тем, что ОС Android медленная или аналогичная.

Более новые версии Android (6 и выше, если я правильно помню) временно изменяют интервал подключения на 7,5 мс во время обнаружения GATT, чтобы сделать его быстрее.

Вы можете либо проверить журнал HCI на своем устройстве Android, либо использовать анализатор воздуха, чтобы посмотреть на этот процесс обнаружения.

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

person Emil    schedule 23.08.2018