Я пытаюсь отправить уведомление о двух характеристиках, 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
Форум для тех, кто программирует под Android
1713828610
Anonymous
Я пытаюсь отправить уведомление о двух характеристиках, 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")
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78366124/ble-not-properly-notifying-two-characteristics-in-kotlin-compose-app[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия