web-dev-qa-db-fra.com

Connaître les profils Android Bluetooth LE GATT

J'ai implémenté l'exemple Bluetooth LE Android qui trouve un moniteur de fréquence cardiaque et s'y connecte. Cependant, cet exemple a une classe qui définit le profil GATT comme suit:

 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;
}

Maintenant, ce que je veux faire, c’est changer pour que ce programme trouve tous les appareils avec le bluetooth mais je ne sais pas comment Google a obtenu les informations pour la mesure de la fréquence cardiaque de la configuration du client. 

16
N0xus

Le Bluetooth SIG maintient une liste de "numéros assignés" comprenant les UUIDs présents dans l'exemple d'application: https://www.bluetooth.org/ en-us/spécification/numéros assignés

Bien que les UUID aient une longueur de 128 bits, les numéros attribués à Bluetooth LE sont répertoriés en tant que valeurs hexadécimales de 16 bits, car les 96 bits les plus bas sont cohérents sur une classe d'attributs.

Par exemple, toutes les caractéristiques BLE UUIDs sont de la forme:

0000XXXX-0000-1000-8000-00805f9b34fb

Le numéro attribué à la caractéristique de mesure de la fréquence cardiaque UUID est répertorié sous la forme 0x2A37, permettant ainsi au développeur de l'exemple de code d'arriver à:

00002a37-0000-1000-8000-00805f9b34fb
62
Godfrey Duke

En plus de la réponse de @Godfrey Duke, voici une méthode que j'utilise pour extraire les bits significatifs de l'UUID:

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

Exemple d'utilisation: 

    // 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;
            }
        }
5
BoD