Поиск профилей Bluetooth Bluetooth GATT

Я реализовал пример Bluetooth для Android LE, который находит монитор сердечного ритма и подключается к нему. Однако в этом примере есть класс, который определяет профиль GATT следующим образом:

 private static HashMap<String, String> attributes = new HashMap();
public static String HEART_RATE_MEASUREMENT = "00002a37-0000-1000-8000-00805f9b34fb";
public static String CLIENT_CHARACTERISTIC_CONFIG = "00002902-0000-1000-8000-00805f9b34fb";

static {
    // Sample Services.
    attributes.put("0000180d-0000-1000-8000-00805f9b34fb", "Heart Rate Service");
    attributes.put("0000180a-0000-1000-8000-00805f9b34fb", "Device Information Service");
    // Sample Characteristics.
    attributes.put(HEART_RATE_MEASUREMENT, "Heart Rate Measurement");
    attributes.put("00002a29-0000-1000-8000-00805f9b34fb", "Manufacturer Name String");
}

public static String lookup(String uuid, String defaultName) {
    String name = attributes.get(uuid);
    return name == null ? defaultName : name;
}

Теперь, что я хочу сделать, это изменить его так, чтобы эта программа находила любое устройство с Bluetooth файлом, но я понятия не имею, как Google получил информацию для измерения частоты сердечных сокращений в конфигурации параметров клиента.

Ответы

Ответ 1

Bluetooth SIG поддерживает список Assigned Numbers ", который включает те UUIDs, найденные в примере приложения: https://www.bluetooth.org/en-us/specification/assigned-numbers

Хотя UUID имеют длину 128 бит, назначенные номера для Bluetooth LE перечислены как 16-битные шестнадцатеричные значения, потому что младшие 96 бит согласованы по классу атрибутов.

Например, все атрибуты BLE UUID имеют следующий вид:

0000XXXX-0000-1000-8000-00805f9b34fb

Назначенное число для характеристики UUID измерения частоты сердечных сокращений указано как 0x2A37, как может проявиться разработчик кода примера:

00002a37-0000-1000-8000-00805f9b34fb

Ответ 2

В дополнение к @Godfrey Duke ответьте, здесь метод, который я использую для извлечения значительных бит UUID:

private static int getAssignedNumber(UUID uuid) {
    // Keep only the significant bits of the UUID
    return (int) ((uuid.getMostSignificantBits() & 0x0000FFFF00000000L) >> 32);
}

Пример использования:

    // See https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml
    private static final int GATT_SERVICE_HEART_RATE = 0x180D;

    (...)

        for (BluetoothGattService service : services) {
            if (getAssignedNumber(service.getUuid()) == GATT_SERVICE_HEART_RATE) {
                // Found heart rate service
                onHeartRateServiceFound(service);
                found = true;
                break;
            }
        }

Ответ 3

Я просто хотел добавить несколько вещей:

  1. 0000-1000-8000-00805f9b34fb - это не единственный корень для UUID с поддержкой Bluetooth.
  2. *-0002a5d5c51b часто встречается (см. Https://uuid.pirate-server.com/search?q=0002a5d5c51b)
  3. можно использовать все, anything:

  4. не стесняйтесь использовать все, что вы хотите использовать, но остерегайтесь использования UUID UUIDv1, если вы серьезно заботитесь о безопасности, потому что они включают в себя временную метку и MAC-адрес, которые можно использовать для отслеживания вас, в некоторой степени, даже если вы используете онлайн генератор, см. https://uuid.pirate-server.com/search?q=0800200c9a66 для всех примеров UUID с использованием https://www.famkruithof.net/uuid/uuidgen?typeReq=-1 в качестве генератора

Ответ 4

Здесь страница на обратном вызове gatt: https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html

Вам нужно использовать BluetoothGatt.discoverServices();

а затем в обратном вызове onServicesDiscovered (...), я думаю, вам нужно использоватьBluetoothGatt.getServices();