Откройте для себя конкретную службу Bluetooth с низким энергопотреблением по UUID в Android

Кто-нибудь знает, как обнаружить службу BLE по UUID в Android? В Android есть метод discoverServices (), но, похоже, нет способа обнаружить одну отдельную Службу вместо всех. В Bluetooth обнаружение всех служб занимает «много времени», тогда как обнаружение отдельных служб на основе UUID занимает меньше времени. Для Android это занимает еще больше времени, потому что Android также обнаруживает все характеристики и дескрипторы.


person Alex Sneed Miller    schedule 21.03.2017    source источник


Ответы (1)


TL; DR: вы не можете - если вы не хотите делать действительно уродливые и потенциально опасные взломы.

Нет простого способа сделать это. Если вы посмотрите, что discoverServices() делает в Nougat, вы увидите, что он вызывает GattService: L1454.

void discoverServices(int clientIf, String address) {
    enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
    Integer connId = mClientMap.connIdByAddress(clientIf, address);
    if (DBG) Log.d(TAG, "discoverServices() - address=" + address + ", connId=" + connId);
    if (connId != null)
        gattClientSearchServiceNative(connId, true, 0, 0);
    else
        Log.e(TAG, "discoverServices() - No connection for " + address + "...");
}

Ключ здесь - gattClientSearchServiceNative:

gattClientSearchServiceNative(int conn_id, 
                              boolean search_all, 
                              long service_uuid_lsb, 
                              long service_uuid_msb)

Если search_all имеет значение true, он будет сканировать все. В противном случае он будет искать только службу с предоставленным UUID, ее характеристиками и дескрипторами.

На самом деле вы можете попробовать использовать отражение, чтобы вызвать это напрямую, передав параметр false search_all и действительный UUID, но это действительно плохая практика, и в конечном итоге произойдет сбой, когда выйдет новая версия и внутренняя реализация этот класс меняется.

person Jorge Martín    schedule 21.03.2017
comment
является ли service_uuid_lsb и service_uuid_msb lsb и msb для всего 128-битного UUID? Есть идеи, почему Google не предоставляет API для этого? Или даже просто API для обнаружения Сервисов, а не всех характеристик и дескрипторов? - person Alex Sneed Miller; 21.03.2017
comment
Да, это старший и младший бит 128-битного UUID. Что касается того, почему он не предоставит его: я предполагаю, что «медленная» часть обнаружения служб BLE устройства - это не получение данных службы, а подключение к устройству и запрос данных. Так что на самом деле было бы быстрее запросить все, чем запрашивать услугу A, конечное сканирование, затем услугу B, конечное сканирование ... Вы, вероятно, могли бы спросить об этом в группе Google AOSP. - person Jorge Martín; 21.03.2017
comment
Спасибо за информацию. В моем случае есть только одна служба (из многих), которую я хочу обнаружить, а затем одна характеристика (из многих) для подавляющего большинства моих вариантов использования. Общая передовая практика BLE - подключаться и обнаруживать только то, что вам нужно, а затем снова отключаться. Я обязательно спрошу и по AOSP, спасибо! - person Alex Sneed Miller; 23.03.2017
comment
BluetoothLeScanner должен сделать это сейчас: developer.android.com/reference/android/ bluetooth / le / - person drewpts; 18.12.2019