找出Android蓝牙LE GATT配置文件

时间:2013-09-09 13:23:03

标签: android 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;
}

现在,我想要做的是更改它,以便该程序找到任何具有蓝牙文件的设备,但我不知道Google如何获得客户端特征配置的心率测量信息。

4 个答案:

答案 0 :(得分:62)

蓝牙 SIG 维护一个“已分配号码”列表,其中包含示例应用中的 UUID https://www.bluetooth.org/en-us/specification/assigned-numbers

虽然UUID的长度为128位,但蓝牙LE的分配号码列为16位十六进制值,因为较低的96位在一类属性中是一致的。

例如,所有BLE特征 UUID 的形式如下:

0000XXXX-0000-1000-8000-00805f9b34fb

心率测量特征UUID的指定编号列为0x2A37,这是示例代码的开发人员可以到达的位置:

00002a37-0000-1000-8000-00805f9b34fb

答案 1 :(得分:5)

除了@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;
            }
        }

答案 2 :(得分:0)

我只想添加一些内容:

  1. 0000-1000-8000-00805f9b34fb并不是蓝牙UUID的唯一根源。
  2. *-0002a5d5c51b也很常见(请参见https://uuid.pirate-server.com/search?q=0002a5d5c51b
  3. anything可以使用,并且已经使用过:

  4. 可以随意使用任何您想使用的内容,但是请小心使用UUIDv1 UUID(如果您非常在意安全性),因为它们嵌入了一个时间戳和一个mac地址,可用于在某种程度上跟踪您(甚至)(如果您使用在线生成器),请参见https://uuid.pirate-server.com/search?q=0800200c9a66,了解使用https://www.famkruithof.net/uuid/uuidgen?typeReq=-1作为生成器的所有UUID示例

答案 3 :(得分:-3)

以下是gatt回调的页面:https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html

您需要使用BluetoothGatt.discoverServices();

然后在回调onServicesDiscovered(...)中我认为你需要使用BluetoothGatt.getServices();