gpt4 book ai didi

bluetooth-lowenergy - Android : iBeacon - read its advertisement (e. g txPower)

转载 作者:行者123 更新时间:2023-12-04 08:16:45 27 4
gpt4 key购买 nike

我现在在这里遇到问题,因为我正在尝试从我的 Onyx iBeacon 读取 tx-Power。我已经阅读了多个建议并在互联网上尝试了很多代码,但我仍然无法弄清楚。

我正在使用 android lollipop 并尝试了来自 https://github.com/devunwired/accessory-samples/tree/master/BluetoothGatt 的 iBeacon 教程用于提取 BLUETOOTH_THERM_SERVICE 的蓝牙应用程序。

我从广告中发现了 tx-Power 的两个值: Bluetooth LE TX Power reading

0x1804 及其特征 0x2A07,因此我调整了 Parcel UUID 以使用 0x1804 过滤我的 ScanResults:

    public static final ParcelUuid THERM_SERVICE = ParcelUuid.fromString("00001809-0000-1000-8000-00805f9b34fb");
public static final ParcelUuid TX_POWER_SERVICE = ParcelUuid.fromString("00001804-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid ONYX_STANDARD_SERVICE = ParcelUuid.fromString("0000180a-0000-1000-8000-00805f9b34fb");

如教程中所述:

 byte[] data = record.getServiceData(TX_POWER_SERVICE);

应该存储一个字节数组但它总是返回null!唯一存储字节数组,但我认为它存储整个记录的是:

byte[] data = record.getServiceData(ONYX_STANDARD_SERVICE);

尝试继续并使用我可以通过 ONYX_STANDARD_SERVICE 获得的数据我可以看到一个扫描结果:

 onScanResult() - ScanResult{mDevice=78:A5:04:07:AE:96, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData={76=[2, 21, 32, -54, -24, -96, -87, -49, 17, -29, -91, -30, 8, 0, 32, 12, -102, 102, 0, 7, -82, -106, -78]}, mServiceData={0000180a-0000-1000-8000-00805f9b34fb=[120, -91, 4, 7, -82, -106, -78, 32, -54, -24, -96, 0, 7, -82, -106]}, mTxPowerLevel=-2147483648, mDeviceName=OnyxBeacon], mRssi=-63, mTimestampNanos=174691272168825}

我认为我记录的重要部分是:

 mServiceData={0000180a-0000-1000-8000-00805f9b34fb=[120, -91, 4, 7, -82, -106, -78, 32, -54, -24, -96, 0, 7, -82, -106]}

如何从这个 ServiceData 中提取我的 txPower 值?我检查了几个应用程序,我的 tx-power 为 -78。

通过使用 ONYX_STANDARD_SERVICE 检查结果,我可以使用 scanResult[6] = -78 获得此值。

这是正确的做法吗?如果是,为什么?

我还发现了一些关于这个问题的有趣示例,其中提到了要从记录中读取的另一个值:

https://github.com/google/uribeacon/blob/master/android-uribeacon/uribeacon-library/src/main/java/org/uribeacon/scan/compat/ScanRecord.java

如果您在此处查找代码:

private static final int DATA_TYPE_TX_POWER_LEVEL = 0x0A;

其中哪一个(0x18040x2A070x0A)是正确的?

如果有人可以向我解释获取 THERM_SERVICE 的示例代码是如何工作的,那也很好,但没有必要:

private float parseTemp(byte[] serviceData) {
/*
* Temperature data is two bytes, and precision is 0.5degC.
* LSB contains temperature whole number
* MSB contains a bit flag noting if fractional part exists
*/
float temp = (serviceData[0] & 0xFF);
if ((serviceData[1] & 0x80) != 0) {
temp += 0.5f;
}

return temp;
}

请帮助我阅读广告数据和提取 tx-Power。

最佳答案

OnyxBeacon 以及任何其他兼容 iBeacon 的 BLE 设备的发射 (TX) 功率可以从广告数据包中获得。这不需要连接到设备。此外,TX 功率值将根据功率级别而有所不同,因为 TX 功率值是针对设备的每个功率级别进行校准的。 TX 功率是广告负载的最后一个字节。关于 iBeacon 数据包结构的更多信息可以在这里找到:http://www.havlena.net/en/location-technologies/ibeacons-how-do-they-technically-work/

以下是如何解析 iBeacon 数据包并获取 TX 功率的示例:

BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice bluetoothDevice, final int rssi, final byte[] scanData) {
if (scanData[7] == 0x02 && scanData[8] == 0x15) { // iBeacon indicator
System.out.println("iBeacon Packet: %s", bytesToHexString(scanData));
UUID uuid = getGuidFromByteArray(Arrays.copyOfRange(scanData, 9, 25));
int major = (scanData[25] & 0xff) * 0x100 + (scanData[26] & 0xff);
int minor = (scanData[27] & 0xff) * 0x100 + (scanData[28] & 0xff);
byte txpw = scanData[29];
System.out.println("iBeacon Major = " + major + " | Minor = " + minor + " TxPw " + (int)txpw + " | UUID = " + uuid.toString());
}
}
};

public static String bytesToHexString(byte[] bytes) {
StringBuilder buffer = new StringBuilder();
for(int i=0; i<bytes.length; i++) {
buffer.append(String.format("%02x", bytes[i]);
}
return buffer.toString();
}
public static UUID getGuidFromByteArray(byte[] bytes)
{
ByteBuffer bb = ByteBuffer.wrap(bytes);
UUID uuid = new UUID(bb.getLong(), bb.getLong());
return uuid;
}

关于bluetooth-lowenergy - Android : iBeacon - read its advertisement (e. g txPower),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30445331/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com