我正在研究 BLE 信标与 Android 手机的距离估计。我开发了自己的基于 RSSI 的距离估计算法。(我将很快以库的形式推出距离计算算法)。为了计算,电话需要来自周围信标的大量广告包。
到目前为止,我已经使用 BLE 扫描的常规做法测试了代码。到目前为止,我已经编写了目标 API 级别 19 的代码。以下是我正在处理的代码的一部分,我开始扫描信标并在 10 秒后停止它。
private void scanLeDevice(final boolean enable) {
if (enable) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.stopLeScan(LEScanCallback);
}
}, 10000L);
bluetoothAdapter.startLeScan(LEScanCallback);
}
}
private BluetoothAdapter.LeScanCallback LEScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice bluetoothDevice, int rssi, byte[] scanRecord){
display(rssi);
//append to an arrayList for further processing
}
};
目前我在 UI 线程上做大部分事情。我必须通过创建更多线程以以下方式实现功能。
- UI 线程应该不受所有计算或 LeScans 的影响。
- PacketReaderThread - 一个单独的线程,用于扫描数据包并继续将它们附加到 arrayList (我将在 arrayList 在算法中使用时清除不必要的数据)。与其在特定时间后停止扫描,我想无限期地保持扫描开启,以保持实时工作,只要应用程序正在运行。所以我可能会为此使用 IntentService。
- DistanceCalculatorThread(或 AsyncTask)- ArrayList 对象(包含扫描的数据包)将在此对象和 PacketReaderThread 之间同步,以获取/清除数据包并将距离计算通知给 UI。
我在Grepcode上看到了 BluetoothAdapter.LeScanCallback 的实现, 我有以下问题。
- BluetoothAdapter.LeScanCallback 是隐式绑定/绑定到主/UI 线程还是可移植到任何其他线程?
- 如果我将上面代码的两个实现都移动到其他线程,回调会在该线程上工作还是将绑定到 main/ui 线程?(因为我需要在单独的线程上进行数据包扫描,所以我需要了解 bluetoothAdapter.startLeScan(LEScanCallback) 和 BluetoothAdapter.LeScanCallback)
(注意 - 我已经关注过这个问题,在那个问题中,答案寻求者本人声明回调已开启主线程,所以我没有得到实际答案。另外我看到了 altBeacon 规范并研究了他们的参考应用程序,它还使用 CycledScan 机制和 scan-stop-scanAgain 方式)