Пока он находит устройство и подключается к нему:
Код: Выделить всё
val device = bluetoothAdapter.getRemoteDevice(targetDeviceAddress)
bluetoothGatt = device.connectGatt(context, false, gattCallback)
Это вызывает gatt.discoverServices(), который запускает onServicesDiscovered():
Код: Выделить всё
override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
if (status == BluetoothGatt.GATT_SUCCESS) {
val service = gatt.getService(UUID.fromString(targetServiceUuid))
if (service != null) {
targetCharacteristic = service.getCharacteristic(UUID.fromString(targetCharacteristicUuid))
_status.value = BleStatus.Connected
} else {
_status.value = BleStatus.Error("Service not found")
}
} else {
_status.value = BleStatus.Error("Service discovery failed")
}
}
То есть - насколько я знаю, я запрашиваю правильный UUID службы, но ничего не возвращается, и у меня нет идей.
Приложение также запрашивает Разрешения Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT и Manifest.permission.ACCESS_FINE_LOCATION до этого (и я проверил разрешения приложений в настройках — у них есть «местоположение» и «соседние устройства», поэтому я считаю, что сбой не связан с недостаточными разрешениями).
Это телефон OnePlus (Oppo) с Android 14. Устройство BBC Micro:bit.
Что мне не хватает? Спасибо.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Проведя дополнительную регистрацию, я обнаружил, что об услугах micro:bit на компьютере сообщается по-разному, чем на телефоне.
Опуская нерелевантные результаты, скрипт python+bleak, запущенный на компьютере, сообщает, что e95d0753-251d-470a-a062-fa1922dfa9a8 (Handle: 40): Служба акселерометра MicroBit существует.
Но этот UUID отсутствует в среде Android.
Запись кода Kotlin выглядит следующим образом:
Код: Выделить всё
val uuid = UUID.fromString(targetServiceUuid)
val lsb = uuid.getLeastSignificantBits()
val msb = uuid.getMostSignificantBits()
Log.i("mb2o", "targetServiceUuid string = %s".format(targetServiceUuid))
Log.i("mb2o", "lsb hex = %s".format(lsb.toHexString()))
Log.i("mb2o", "msb hex = %s".format(msb.toHexString()))
// this is poorly factored but will delete later
val srvIter = gatt.getServices().iterator()
while (srvIter.hasNext()) {
var srvc = srvIter.next()
Log.i("mb2o", "service = %s".format(srvc.uuid))
}
Код: Выделить всё
targetServiceUuid string = e95d0753-251d-470a-a062-fa1922dfa9a8
lsb hex = a062fa1922dfa9a8
msb hex = e95d0753251d470a
service = 00001800-0000-1000-8000-00805f9b34fb
service = 00001801-0000-1000-8000-00805f9b34fb
service = 0000fe59-0000-1000-8000-00805f9b34fb
service = e97dd91d-251d-470a-a062-fa1922dfa9a8
service = 0000180a-0000-1000-8000-00805f9b34fb
service = e95d93af-251d-470a-a062-fa1922dfa9a8
Код: Выделить всё
e95d93af-251d-470a-a062-fa1922dfa9a8Загадочный результат. Что ж, возможно, для этого подойдет служба событий.