我试图为BLE Eddystone UID包编写一个解析器,但不知道具体如何实现。我正在使用信标模拟器应用程序来广播一个Eddystone UID包,当我用不同的移动设备测试相同的应用程序作为扫描仪时,我可以看到Eddystone UID包被第一设备所广播。
我想写一个示例应用程序来扫描Eddystone UID数据包。我知道我必须使用BluetoothLeScanner,在onScanResult of ScanCallback中,我可以让所有的蓝牙设备与BLE (蓝牙低能)兼容。
但问题是,我能够从ScanResult中提取设备mac,设备名,并且可以验证我是否能够听到我的蓝牙耳机和扬声器,但我不确定我将如何准确地获得Eddystone UID的namespace和instance,并且我无法在ScanResult中看到任何这样的变量对我有帮助。
有人能告诉我任何关于如何做的代码片段或代码吗?我不想使用任何第三方库进行扫描,在Kotlin或java中简单明了。Kotlin是首选,但java也很好,我知道这两种语言。
发布于 2021-05-10 11:49:30
Eddystone UID:具有10字节名称空间组件和6字节实例组件的唯一静态ID。在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:用于标识关贸总协定服务的广告中的服务UUID列表。
eddystoneServiceId:Eddystone UID的服务UUID为“0000FEAA-0000-1000-8000-00805F9B34FB”
serviceData:与serviceUuid关联的服务数据字节数组,在本例中是eddystoneServiceId
eddystoneUID数据包信息在索引2到18之间的serviceData中,我们需要使用实用程序方法将这个字节数组转换为十六进制字符串。
命名空间为10个字节,启动了20个eddystoneUID字符。
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和iBeacon解析的博客,您也可以参考它,这里
此外,您还可以参考完整的工作示例应用程序来扫描Eddystone UID、iBeacon和普通蓝牙外围设备这里。
https://stackoverflow.com/questions/67469709
复制相似问题