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