Поиск профилей Bluetooth Bluetooth GATT
Я реализовал пример 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;
}
Теперь, что я хочу сделать, это изменить его так, чтобы эта программа находила любое устройство с Bluetooth файлом, но я понятия не имею, как Google получил информацию для измерения частоты сердечных сокращений в конфигурации параметров клиента.
Ответы
Ответ 1
Bluetooth SIG поддерживает список Assigned Numbers ", который включает те UUIDs, найденные в примере приложения:
https://www.bluetooth.org/en-us/specification/assigned-numbers
Хотя UUID имеют длину 128 бит, назначенные номера для Bluetooth LE перечислены как 16-битные шестнадцатеричные значения, потому что младшие 96 бит согласованы по классу атрибутов.
Например, все атрибуты BLE UUID имеют следующий вид:
0000XXXX-0000-1000-8000-00805f9b34fb
Назначенное число для характеристики UUID измерения частоты сердечных сокращений указано как 0x2A37
, как может проявиться разработчик кода примера:
00002a37-0000-1000-8000-00805f9b34fb
Ответ 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 с поддержкой Bluetooth. -
*-0002a5d5c51b
часто встречается (см. Https://uuid.pirate-server.com/search?q=0002a5d5c51b) -
можно использовать все, anything
:
-
не стесняйтесь использовать все, что вы хотите использовать, но остерегайтесь использования UUID UUIDv1, если вы серьезно заботитесь о безопасности, потому что они включают в себя временную метку и MAC-адрес, которые можно использовать для отслеживания вас, в некоторой степени, даже если вы используете онлайн генератор, см. https://uuid.pirate-server.com/search?q=0800200c9a66 для всех примеров UUID с использованием https://www.famkruithof.net/uuid/uuidgen?typeReq=-1 в качестве генератора
Ответ 4
Здесь страница на обратном вызове gatt: https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html
Вам нужно использовать BluetoothGatt.discoverServices();
а затем в обратном вызове onServicesDiscovered (...), я думаю, вам нужно использоватьBluetoothGatt.getServices();