Я пытаюсь отправить уведомление о двух характеристиках, VOLtsValue и ampsValue, с устройства с поддержкой BLE на мой телефон Android. Операции BLE отлично работают при сканировании, подключении и уведомлении значения voltsValue в текстовом поле экрана, но это когда я считываю одну характеристику. Когда я добавляю ampsValue в качестве второго UUID службы/UUID характеристики, мое приложение отображает два значения, но в обоих текстовых полях отображается одно и то же значение, т. е. voltsValue. Debug и logcat показывают, что для ampsValue установлено то же значение, что и для voltsValue, поэтому это не проблема с компонентами пользовательского интерфейса.
Logcat показывает, что onServicesDiscovered() обнаруживает соответствующие UUID. Однако я подозреваю, что существует проблема с последовательностью/синхронизацией последующих асинхронных операций BLE. Характеристика тока либо не считывается/обновляется неправильно, либо заменяется значением характеристики напряжения. Но у меня недостаточно опыта, чтобы понять, почему это происходит. Мои исследования показывают, что требуется постановка в очередь операций BLE после onServiceDiscovery(), но я не уверен, где и как это сделать в моем коде. Может ли кто-нибудь дать некоторые рекомендации? Примечание. Это моя первая попытка создать мобильное приложение и мой первый вопрос о переполнении стека, поэтому, пожалуйста, извините меня за ошибки новичка.
Я разделил две характеристики в onCharacteristicRead():
@Deprecated("Deprecated in Java")
override fun onCharacteristicRead(
gatt: BluetoothGatt?,
characteristic: BluetoothGattCharacteristic?,
status: Int
) {
super.onCharacteristicRead(gatt, characteristic, status)
if (status == BluetoothGatt.GATT_SUCCESS) {
characteristic?.value?.let { value ->
when (characteristic.uuid) {
VOLTS_CHARACTERISTIC_UUID -> {
val voltsFloatValue =
ByteBuffer.wrap(value).order(ByteOrder.LITTLE_ENDIAN).float
CoroutineScope(Dispatchers.IO).launch {
voltsValue = voltsFloatValue
Log.d("Frank-onRead", "voltsValue: $voltsFloatValue")
}
enableVoltsCharacteristicNotifications(gatt)
}
AMPS_CHARACTERISTIC_UUID -> {
val ampsFloatValue =
ByteBuffer.wrap(value).order(ByteOrder.LITTLE_ENDIAN).float
CoroutineScope(Dispatchers.IO).launch {
ampsValue = ampsFloatValue
Log.d("Frank-onRead", "ampsValue: $ampsFloatValue")
}
enableAmpsCharacteristicNotifications(gatt)
}
}
}
}
}
Уведомления также делятся на две характеристики:
@SuppressLint("MissingPermission")
private fun enableVoltsCharacteristicNotifications(gatt: BluetoothGatt?) {
val voltsCharacteristic =
gatt?.getService(VOLTS_SERVICE_UUID)?.getCharacteristic(VOLTS_CHARACTERISTIC_UUID)
if (voltsCharacteristic != null) {
gatt.setCharacteristicNotification(voltsCharacteristic, true)
val descriptor =
voltsCharacteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"))
descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
gatt.writeDescriptor(descriptor)
}
}
@SuppressLint("MissingPermission")
private fun enableAmpsCharacteristicNotifications(gatt: BluetoothGatt?) {
val ampsCharacteristic =
gatt?.getService(AMPS_SERVICE_UUID)?.getCharacteristic(AMPS_CHARACTERISTIC_UUID)
if (ampsCharacteristic != null) {
gatt.setCharacteristicNotification(ampsCharacteristic, true)
val descriptor =
ampsCharacteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"))
descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
gatt.writeDescriptor(descriptor)
}
}
И, наконец, onCharacteristicChanged():
@Deprecated("Deprecated in Java")
override fun onCharacteristicChanged(
gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?
) {
super.onCharacteristicChanged(gatt, characteristic)
characteristic?.value?.let { value ->
val voltsFloatValue = ByteBuffer.wrap(value).order(ByteOrder.LITTLE_ENDIAN).float
CoroutineScope(Dispatchers.IO).launch {
voltsValue = voltsFloatValue
Log.d("Frank - voltsFloatValue", "voltsValue: $voltsFloatValue")
}
}
super.onCharacteristicChanged(gatt, characteristic)
characteristic?.value?.let { value ->
val ampsFloatValue = ByteBuffer.wrap(value).order(ByteOrder.LITTLE_ENDIAN).float
CoroutineScope(Dispatchers.IO).launch {
ampsValue = ampsFloatValue
Log.d("Frank - ampsFloatValue", "ampsValue: $ampsFloatValue")
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... ompose-app
BLE неправильно уведомляет две характеристики в приложении Kotlin Compose ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Kotlin Android BLE с использованием nordicsemi не может получить устройства BLE
Anonymous » » в форуме Android - 0 Ответы
- 89 Просмотры
-
Последнее сообщение Anonymous
-