Как обрабатывать уведомления BLE на Android?

#android #kotlin #bluetooth-lowenergy #nrf52

#Android #kotlin #bluetooth -низкое энергопотребление #nrf52

Вопрос:

Я разрабатываю последовательность обмена кадрами между nRF52840 и смартфоном Android. Реализована сторона nRF52840, и сейчас я внедряю приложение для Android с помощью Kotlin.

Приложение использует «записи» для отправки кадров, а nRF52840 использует «уведомления» для ответа.

Сначала я протестировал обмен с приложением nRF Connect для отправки кадров в nRF52. Как вы можете видеть ниже, nRF52 хорошо реагирует на уведомления и отправляет кадры в шестнадцатеричном формате:

Нажмите здесь, чтобы увидеть изображение.

На стороне приложения Android я знаю, как обнаруживать уведомления, но я хотел бы, как и в приложении nRF Connect, иметь возможность отображать эти фреймы (в шестнадцатеричном формате), а затем иметь возможность просматривать их.

Как я могу это сделать?

Начало моей функции Kotlin :

     private fun handleNotification(characteristic: BluetoothGattCharacteristic) {
      println("Notification !")
      val newValue = characteristic.value
    }
 

Ответ №1:

У меня есть первый ответ на мой вопрос. Решением может быть использование функции getIntValue, подобной этой:

 private fun handleNotification(characteristic: BluetoothGattCharacteristic) {
  println("Notification !")
  val newValue = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8,0)
  println("value : $newValue")
  val newValue2 = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8,1)
  println("value : $newValue2")
}
 

Но было бы лучше, если бы у меня был ByteArray, вызвав функцию один раз.

Ответ №2:

У меня есть другой ответ на мой вопрос. Следующий код отображает все содержимое байтового массива, отправленного через уведомление, в шестнадцатеричном формате:

 private fun handleNotification(characteristic: BluetoothGattCharacteristic) {
    println("Notification !")
    val data: ByteArray? = characteristic.value
    if (data?.isNotEmpty() == true) {
        val hexString: String = data.joinToString(separator = " ", prefix = "[",  postfix = "]") {
            String.format("0xX", it)
        }
        println(hexString)
    } else {
        println("Data is empty")
    }
}
 

Вывод :

 I/System.out: [0x00 0x05 0x00 0x01 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00]