首页 > 解决方案 > 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()
        }
    }
}

标签: androidkotlinibeacon

解决方案


推荐阅读