找出 Android 蓝牙 LE GATT 配置文件

Posted

技术标签:

【中文标题】找出 Android 蓝牙 LE GATT 配置文件【英文标题】:Finding out Android Bluetooth LE GATT Profiles 【发布时间】:2013-09-09 13:23:03 【问题描述】:

我已经实现了一个 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;

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

【问题讨论】:

【参考方案1】:

蓝牙SIG维护一个“Assigned Numbers”列表,其中包括示例应用中的那些UUID: https://www.bluetooth.com/specifications/assigned-numbers/

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

例如,所有 BLE 特征 UUID 的格式为:

0000XXXX-0000-1000-8000-00805f9b34fb

心率测量特征 UUID 的分配编号被列为 0x2A37,示例代码的开发者可以这样得出:

00002a37-0000-1000-8000-00805f9b34fb

【讨论】:

我只想说我已经用 ble 编程了几个星期,但我从未见过任何地方对此进行过解释。我非常感谢您写下这个答案,因为它让我的生活变得无比轻松。【参考方案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】:

我只是想补充几点:

    0000-1000-8000-00805f9b34fb 并不是蓝牙 UUID 的唯一根。 *-0002a5d5c51b 也很常见(见https://uuid.pirate-server.com/search?q=0002a5d5c51b)

    anything可以用,已经用过:

    见https://uuid.pirate-server.com/search?q=gatt 查看https://github.com/edrosten/bluez/blob/master/monitor/uuid.c#L543(包括 uint16 和 uint128 整数)

    随意使用您想使用的任何东西,但如果您非常关心安全性,请注意使用 UUIDv1 UUID,因为它们嵌入了时间戳和 MAC 地址,可用于在某种程度上,即使跟踪您,如果您使用在线生成器,请参阅 https://uuid.pirate-server.com/search?q=0800200c9a66 了解使用 https://www.famkruithof.net/uuid/uuidgen?typeReq=-1 作为生成器的所有 UUID 示例

【讨论】:

请在您的回答中披露您是 uuid.pirate-server.com 的所有者。链接到您所属的东西(例如库、工具、产品或网站)未透露它是您的在 Stack Overflow 上被视为垃圾邮件。请参阅:What signifies "Good" self promotion?、some tips and advice about self-promotion、What is the exact definition of "spam" for Stack Overflow? 和 What makes something spam。【参考方案4】:

这是有关 gatt 回调的页面:https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html

您需要使用 BluetoothGatt.discoverServices();

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

【讨论】:

以上是关于找出 Android 蓝牙 LE GATT 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Android蓝牙LE:连接后未发现服务

Android 4.0 中的蓝牙智能 (4.0) / GATT 支持?

低功耗蓝牙 GATT 配置文件测量解析值

Android蓝牙BLE我可以修改哪些连接的配置参数

某些设备上没有蓝牙 gatt 回调

Android:直接在应用程序中使用 HID over GATT(Gadget=HID → 控制应用程序)