如何处理 Android 上的 BLE 通知?
How to handle BLE notifications on Android?
我正在开发 nRF52840 和 Android 智能手机之间的帧交换序列。
nRF52840 端已实现,我现在正在使用 Kotlin 实现 Android 应用程序。
应用程序使用“写入”来发送帧,nRF52840 使用“通知”来回复。
我首先测试了与 nRF Connect 应用程序的交换,以将帧发送到 nRF52。如下所示,nRF52 对通知响应良好,并以十六进制格式发送帧:
点击here查看图片。
在 Android 应用程序方面,我知道如何检测通知,但我希望像在 nRF Connect 应用程序中一样,能够显示这些帧(十六进制格式),然后能够浏览它们。
我该怎么做?
我的 Kotlin 函数的开始:
private fun handleNotification(characteristic: BluetoothGattCharacteristic) {
println("Notification !")
val newValue = characteristic.value
}
我的问题有了第一个答案。一个解决方案可能是使用这样的 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 会更好。
我的问题有另一个答案。以下代码以十六进制格式显示通过通知发送的 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]
我正在开发 nRF52840 和 Android 智能手机之间的帧交换序列。 nRF52840 端已实现,我现在正在使用 Kotlin 实现 Android 应用程序。
应用程序使用“写入”来发送帧,nRF52840 使用“通知”来回复。
我首先测试了与 nRF Connect 应用程序的交换,以将帧发送到 nRF52。如下所示,nRF52 对通知响应良好,并以十六进制格式发送帧:
点击here查看图片。
在 Android 应用程序方面,我知道如何检测通知,但我希望像在 nRF Connect 应用程序中一样,能够显示这些帧(十六进制格式),然后能够浏览它们。
我该怎么做?
我的 Kotlin 函数的开始:
private fun handleNotification(characteristic: BluetoothGattCharacteristic) {
println("Notification !")
val newValue = characteristic.value
}
我的问题有了第一个答案。一个解决方案可能是使用这样的 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 会更好。
我的问题有另一个答案。以下代码以十六进制格式显示通过通知发送的 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]