【问题标题】:Discover specific Bluetooth Low Energy Service by UUID in Android在 Android 中通过 UUID 发现特定的低功耗蓝牙服务
【发布时间】:2017-03-21 12:14:05
【问题描述】:

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

【问题讨论】:

    标签: android bluetooth bluetooth-lowenergy android-bluetooth


    【解决方案1】:

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

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

    您实际上可以尝试使用反射来调用它,直接传递 false search_all 参数和有效的 UUID,但这是一种非常糟糕的做法,并且会在新版本发布时崩溃,并且此类的内部实现发生变化。

    【讨论】:

    • service_uuid_lsb 和 service_uuid_msb 是整个 128 位 UUID 的 lsb 和 msb 吗?知道为什么 Google 不提供 API 来执行此操作吗?或者甚至只是一个用于发现服务而不是所有特征和描述符的 API?
    • 是的,它们是 128 位 UUID 的 MSB 和 LSB。至于它为什么不提供它:我的猜测是发现设备的 BLE 服务的“慢”部分不是获取服务数据,而是连接到设备并请求数据。所以实际上询问所有内容会更快,而不是询问服务 A,结束扫描,然后询问服务 B,结束扫描......您可能会在 AOSP 的 google 小组中询问这个问题。
    • 感谢您的信息。就我而言,我只想发现一项服务(众多),然后是我的绝大多数用例的一个特性(众多)。一般 BLE 最佳实践是连接并仅发现您需要的内容,然后再次断开连接。我肯定也会问 AOSP,谢谢!
    • BluetoothLeScanner 现在应该这样做:developer.android.com/reference/android/bluetooth/le/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多