我有一个简单的 iOS 应用程序,它显示它使用“立即”、“附近”等表达检测到的蓝牙 LE 信标的接近度,我需要在 Android 上编写类似的东西。
我遵循了Android 开发人员的教程,我能够列出检测到的设备,现在想要估计距离/接近度 - 这就是它成为问题的地方。根据这个 SO 线程,它只是一些数学计算。但是,他们要求我提供 txPower 值。
根据Dave Smith 的本教程(并与此蓝牙 SIG 声明交叉引用),信标设备应将其广播为类型的“AD 结构” 0x0A
。所以我要做的是解析 AD 结构并寻找与类型匹配的有效负载。
问题:我有 4 个信标 - 2 个估计和 2 个应用。estimotes 根本不广播 txPower,而 appflares 将它们的广播为 0。
我在这里有什么遗漏吗?iOS 应用程序似乎可以毫无问题地处理这一切,但使用 iOS SDK 它在幕后完成,所以我不确定如何产生完全相同或相似的行为。有没有其他方法可以解决我的问题?
如果你想看看我用来解析 AD 结构的代码,它取自前面提到的 Dave Smith 的 github,可以在这里找到。我对该类所做的唯一更改是添加以下方法:
public byte[] getData() {
return mData;
}
这就是我处理扫描回调的方式:
// Prepare the callback for BLE device scan
this.leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
if (!deviceList.contains(device)) {
MyService.this.deviceList.add(device);
Log.e("Test", "Device: " + device.getName());
List<AdRecord> adRecords = AdRecord.parseScanRecord(scanRecord);
for (AdRecord adRecord : adRecords) {
if (adRecord.getType() == AdRecord.TYPE_TRANSMITPOWER) {
Log.e("Test", "size of payload: " + adRecord.getData().length);
Log.e("Test", "payload: " + Byte.toString(adRecord.getData()[0]));
}
}
}
}
};
我在控制台中看到的是:
04-01 11:33:35.864: E/Test(15061): Device: estimote
04-01 11:33:36.304: E/Test(15061): Device: estimote
04-01 11:33:36.475: E/Test(15061): Device: n86
04-01 11:33:36.475: E/Test(15061): size of payload: 1
04-01 11:33:36.475: E/Test(15061): payload: 0
04-01 11:33:36.525: E/Test(15061): Device: f79
04-01 11:33:36.525: E/Test(15061): size of payload: 1
04-01 11:33:36.525: E/Test(15061): payload: 0