簡體   English   中英

如何解析 Eddystone UID BLE 信標信息

[英]How to parse Eddystone UID BLE beacon info

我正在嘗試為 BLE Eddystone UID 數據包編寫解析器,但不知道該怎么做。 我正在使用信標模擬器應用程序廣播 Eddystone UID 數據包,當我使用與掃描儀相同的應用程序使用不同的移動設備進行測試時,我可以看到第一個設備廣播的 Eddystone UID 數據包。

我想編寫一個示例應用程序來掃描 Eddystone UID 數據包。 我知道我必須使用BluetoothLeScanner ,並且在onScanResultScanCallback中,我可以獲得與 BLE(藍牙低功耗)兼容的所有藍牙設備。

但問題是我能夠從ScanResult提取設備 mac、設備名稱,並且可以驗證我能夠聽到我的藍牙耳機和揚聲器,但我不確定我將如何獲得 Eddystone UID 的namespaceinstance ,我是在ScanResult不到任何可以幫助我的變量。

任何人都可以請我指出任何關於如何做到這一點的片段或任何代碼。 我不想使用任何第三方庫進行掃描,在 Kotlin 或 java 中簡單明了。 Kotlin 是首選,但 java 也很好,我知道這兩種語言。

Eddystone UID :一個唯一的 static ID,具有 10 字節的命名空間組件和 6 字節的實例組件。 onScanResult您可以提取 Eddystone uid 數據包,如下所示

override fun onScanResult(callbackType: Int, result: ScanResult) {
            val scanRecord = result.scanRecord
            if (scanRecord != null) {
                val serviceUuids = scanRecord.serviceUuids
                if (serviceUuids != null && serviceUuids.size > 0 && serviceUuids.contains(
                        eddystoneServiceId
                    )
                ) {
                    val serviceData = scanRecord.getServiceData(eddystoneServiceId)
                    if (serviceData != null && serviceData.size > 18) {
                        val eddystoneUUID =
                            Utils.toHexString(Arrays.copyOfRange(serviceData, 2, 18))
                        val namespace = String(eddystoneUUID.toCharArray().sliceArray(0..19))
                        val instance = String(
                            eddystoneUUID.toCharArray()
                                .sliceArray(20 until eddystoneUUID.toCharArray().size)
                        )

                        Log.e("DINKAR", "Namespace:$namespace Instance:$instance")
                    }
                }
               
            }
        }

scanRecord :廣告和掃描響應的組合

serviceUuids :廣告中用於識別藍牙 GATT 服務的服務 UUID 列表。

eddystoneServiceId :Eddystone UID 的服務 UUID,即“0000FEAA-0000–1000–8000–00805F9B34FB”

serviceData :與 serviceUuid 關聯的服務數據字節數組,在我們的例子中是 eddystoneServiceId

eddystoneUID 數據包信息在 serviceData 中從索引 2 到 18,我們需要使用實用程序方法將此字節數組轉換為十六進制字符串。

命名空間為 10 個字節,以 eddystoneUID 的 20 個字符開頭

instanceId為 6 個字節,即 eddystoneUID 的剩余 12 個字符

示例向您展示如何將字節數組轉換為十六進制字符串

   private val HEX = "0123456789ABCDEF".toCharArray()
fun toHexString(bytes: ByteArray): String {
    if (bytes.isEmpty()) {
        return ""
    }
    val hexChars = CharArray(bytes.size * 2)
    for (j in bytes.indices) {
        val v = (bytes[j].toInt() and 0xFF)
        hexChars[j * 2] = HEX[v ushr 4]
        hexChars[j * 2 + 1] = HEX[v and 0x0F]
    }
    return String(hexChars)
}

我寫了一篇關於解析 Eddystone UID 和 iBeacon 的博客,你可以參考這里

此外,您可以在此處參考完整的工作示例應用程序來掃描 Eddystone UID、iBeacon 和普通藍牙外圍設備

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM