android - iBeacon UUID 未正确显示 Kotlin
问题描述
我试图在应用程序扫描时显示 iBeacon UUID。我能够显示 Minor、Major、rssi 等,但无法显示 uuid 值。打印 uuid 的值会导致空白/无值,即使出现次要、主要的值也是如此。我尝试了多种方法,但似乎没有任何效果。任何帮助将不胜感激:
信标解析器.kt
import android.bluetooth.BluetoothDevice
import android.util.Log
import com.smartahc.android.example.ibeacon.ibeacon.bean.Beacon
import java.util.*
import kotlin.experimental.and
class BeaconParser {
companion object {
val TAG: String = "beacon"
fun parse(device: BluetoothDevice?, rssi: Int, data: ByteArray): Beacon {
val beacon = Beacon()
beacon.rssi = rssi
device.let {
it?.name?.let {
beacon.name = it
}
it?.address?.let {
beacon.mac = it
}
}
// parse data
if (data.isNotEmpty()) {
return parseData(beacon, data)
} else {
Log.e(TAG, "data >> is null")
}
return beacon
}
private fun parseData(beacon: Beacon, scanData: ByteArray): Beacon {
Log.e("beacon", "name >> ${beacon.name}")
var startByte = 2
while (startByte <= 5) {
if (scanData[startByte + 2].toInt() and 0xff == 0x02 && scanData[startByte + 3].toInt() and 0xff == 0x15) {
val major = (scanData[startByte + 20] and 0xff.toByte()) * 0x100 + (scanData[startByte + 21] and 0xff.toByte())
beacon.major = major
val minor = (scanData[startByte + 22] and 0xff.toByte()) * 0x100 + (scanData[startByte + 23] and 0xff.toByte())
beacon.minor = minor
beacon.txPower = scanData[startByte + 24].toInt()
break
}
startByte++
}
val uuidBytes = ByteArray(16)
System.arraycopy(scanData, startByte + 4, uuidBytes, 0, 16)
beacon.uuid = parseUUID(uuidBytes)
Log.v("beaconuuidzzz", "result > ${beacon.uuid}")
return beacon
}
private fun parseUUID(uuidBytes: ByteArray): String {
val hexString = bytesToHexString(uuidBytes)
Log.v(TAG, hexString)
val sb = StringBuilder()
if (hexString.isNullOrEmpty()) {
hexString?.let {
sb.append(it.substring(0, 8))
sb.append("-")
sb.append(it.substring(8, 12))
sb.append("-")
sb.append(it.substring(12, 16))
sb.append("-")
sb.append(it.substring(16, 20))
sb.append("-")
sb.append(it.substring(20, 32))
}
Log.v(TAG, sb.toString())
}
return sb.toString()
}
private fun bytesToHexString(src: ByteArray?): String? {
val stringBuilder = StringBuilder("")
if (src == null || src.isEmpty()) {
return stringBuilder.toString()
}
Log.v("byte >> ", Arrays.toString(src))
for (aSrc in src) {
val v: Int = (aSrc and 0xFF.toByte()).toInt()
val hv = Integer.toHexString(v)
if (hv.length < 2) {
stringBuilder.append(0)
}
stringBuilder.append(hv)
}
return stringBuilder.toString()
}
}
}
解决方案
推荐阅读
- gradle - 如何构建 Gradle 构建以允许构建相互依赖的库
- java - 如何将结果从 Java 中的本机查询转换为字符串?
- spring-boot - thymeleaf 模板中未加载静态资源
- angular - Promise 在 Angular 中返回
- javascript - Inputmask jquery 不允许 mm/dd/yy 格式
- java - 在 Java 中将 jpg 压缩并转换为 tiff
- java - 如何使用 HTreeMap 填充列表
- android - 在 WebView 中显示 NEST 相机视频
- php - 如何在soap请求后隔离xml标签的内容
- java - 如何在java中使用pdfbox api从pdf中获取特定文本