Служба BLE не найдена по UUID (UUID в коде правильный)Android

Форум для тех, кто программирует под Android
Anonymous
Служба BLE не найдена по UUID (UUID в коде правильный)

Сообщение Anonymous »

Я начал этот проект BLE на Python, столкнулся с проблемами с разрешениями Android, поэтому я попытался (честно говоря... атмосферно) написать нативное приложение для Android на Kotlin. Основная его часть — запустить поток, который будет неоднократно опрашивать определенную характеристику по идентификатору и отправлять данные по UDP.
Пока он находит устройство и подключается к нему:

Код: Выделить всё

            val device = bluetoothAdapter.getRemoteDevice(targetDeviceAddress)
bluetoothGatt = device.connectGatt(context, false, gattCallback)
Это вызывает onConnectionStateChange(). Я знаю, что это происходит, потому что устройство Bluetooth отвечает в этот момент.
Это вызывает 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")
}
}
Я знаю, что он входит в эту функцию, потому что в окне состояния приложения мигает сообщение «Служба не найдена». Это единственное место, где эта строка найдена, поэтому она определенно пытается получить службу (на основе targetServiceUuid, которую я проверил, перечислив службы устройства), но она не найдена.
То есть - насколько я знаю, я запрашиваю правильный 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
почти совпадает, но соответствует службе событий micro:bit, а не акселерометру.
Загадочный результат. Что ж, возможно, для этого подойдет служба событий.

Вернуться в «Android»