有没有人知道如何在Android中通过UUID发现BLE服务? Android中有discoverServices() method,但似乎没有办法发现一个单独的服务而不是所有服务。在蓝牙中,发现所有服务需要花费很长的时间。时间,而基于UUID发现个人服务的时间并不长。 Android需要更长的时间,因为Android也会发现所有的特征和描述符。
答案 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和这个类的内部实现发生了变化。