Bluetooth LE — множественное характерное поведениеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Bluetooth LE — множественное характерное поведение

Сообщение Anonymous »

Я написал приложение Kotlin Compose Coroutine SharedFlow, которое подключает мой телефон к сенсорному устройству с поддержкой BLE. Приложение демонстрирует странное поведение. Если я просто подключаюсь к устройству, значение напряжения от датчика правильно считывается и отображается на моем одном экране. Однако мое устройство уведомляет две характеристики, а именно ampsValue. Значение ampsValue не читается для каждого логарифма и не отображается на моем экране. Обнаружен UUID характеристики ампера, но не значение характеристики ампера.
Если я поменяю UUID характеристики вольт и ампер соответственно, ampsValue начнет уведомлять в logcat и отображаться на моем экране. Конечно, соответствующие показания датчиков отображаются в неправильных текстовых полях, но если я поменяю UUID обратно, то и вольты, и амперы будут отображаться правильно. Другая проблема возникает, когда я выключаю устройство и снова включаю его. Мое приложение повторно подключится, но снова будет отображать только значение voltsValue. Единственный способ заставить его читать/уведомлять оба значения — это поменять характерные UUID. Такое поведение кажется кому-нибудь знакомым? Обратите внимание, что nRF правильно считывает и отображает оба уведомляющих значения.
Это обратный вызов onServicesDiscovered(), в котором обнаруживаются UUID:
@SuppressLint("MissingPermission")
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
when (status) {
BluetoothGatt.GATT_SUCCESS -> {
// Service discovery successful
val service = gatt?.getService(SERVICE_UUID)
if (service != null) {
// Read volts characteristic
val voltsCharacteristic =
service.getCharacteristic(VOLTS_UUID)
voltsCharacteristic?.let {
gatt.readCharacteristic(it)
Log.d("Frank - read voltsCharacteristic", "Volts Characteristic = $it")
} ?: run {
Log.e("Frank", "Volts characteristic not found")
}

// Read amps characteristic
val ampsCharacteristic = service.getCharacteristic(AMPS_UUID)
ampsCharacteristic?.let {
gatt.readCharacteristic(it)
Log.d("Frank - read ampsCharacteristic", "Amps Characteristic = $it")
} ?: run {
Log.e("Frank", "Amps characteristic not found")
}
} else {
Log.e("Frank", "Service not found")
}
}

else -> {
// Service discovery failed
Log.e("Frank", "Service discovery failed with status: $status")
}
}


Подробнее здесь: https://stackoverflow.com/questions/783 ... c-behavior
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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