我有一个简单的iOS应用程序,显示它使用“立即”,“附近”等表达式检测到的蓝牙LE信标的接近度,我需要在
Android上编写类似的东西.
我在Android developer遵循了这个教程,我可以列出检测到的设备,现在想估计距离/邻近程度 – 这是一个问题.根据this SO thread,这只是一些数学计算.但是,它们要求我提供一个txPower值.
根据this tutorial by Dave Smith(并与此Bluetooth SIG statement交叉参考),它应该被信标设备广播为类型为0x0A的“AD结构”.所以我做的是解析AD结构,并寻找与类型匹配的有效载荷.
问题:我有4个信标 – 2个估计和2个设计.估计不会播放txPower,appflares将其广播为0.
有没有什么我在这里错过? iOS应用程序似乎正在处理所有这些都没有任何问题,但使用iOS SDK它在幕后,所以我不知道如何产生完全相同或相似的行为.有什么办法可以解决我的问题吗?
如果你想看看我用来解析AD结构的代码,它取自上述Dave Smith的github,可以在here找到.我对该类的唯一改变是添加了以下方法:
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 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