在Android中通过UUID发现特定的蓝牙低功耗服务

时间:2017-03-21 12:14:05

标签: android bluetooth bluetooth-lowenergy android-bluetooth

有没有人知道如何在Android中通过UUID发现BLE服务? Android中有discoverServices() method,但似乎没有办法发现一个单独的服务而不是所有服务。在蓝牙中,发现所有服务需要花费很长的时间。时间,而基于UUID发现个人服务的时间并不长。 Android需要更长的时间,因为Android也会发现所有的特征和描述符。

1 个答案:

答案 0 :(得分:1)

TL; DR:你不能 - 如果你不想做一些非常丑陋且有潜在危险的黑客攻击。

没有简单的方法可以做到这一点。如果您查看Nougat上discoverServices()的内容,您会看到它调用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 为真,它将扫描所有内容。如果没有,它将仅搜索具有提供的UUID及其特征和描述符的服务。

你实际上可以尝试使用反射直接调用它来传递一个 false search_all参数和一个有效的UUID,但这是一个非常糟糕的做法,当新版本出现时最终会崩溃out和这个类的内部实现发生了变化。