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

Я разрабатываю последовательность обмена кадрами между 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
    }

person Martin Denion    schedule 22.12.2020    source источник


Ответы (2)


У меня есть первый ответ на свой вопрос. Решением может быть использование такой функции 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, вызывая функцию один раз.

person Martin Denion    schedule 22.12.2020

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

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("0x%02X", 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]
person Martin Denion    schedule 22.12.2020