我已经写了一个室内定位算法,但是为了让它发挥作用,我需要一个应用程序在用户在建筑物周围行走时连续记录wifi和加速数据。基本上,每隔几百毫秒,我就需要记录一个 "指纹",跟踪用户的移动,即从A房间开始,到B房间,再到C房间。这有助于识别哪些房间有门道(基本上,哪些房间是相连的)。
加速度记录工作得很好,但我在以下方面遇到了一些麻烦。wifiManager.startScan()
. 这是在Android 9上运行。
具体来说,我有以下代码。
public WiFiScanner(Context context, boolean repeated, OnWiFiDataCallback wiFiDataCallback) {
super();
this.context = context;
this.repeated = repeated;
this.wiFiDataCallback = wiFiDataCallback;
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Log.d("WIFI-SCAN", "Starting a WiFiScanner");
if (!wifiManager.isWifiEnabled()) {
Toast.makeText(context, "WiFi not enabled", Toast.LENGTH_SHORT).show();
return;
}
context.registerReceiver(this, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
new CountDownTimer(500, 500) {
public void onTick(long millisUntilFinished) { /* do nothing */ }
public void onFinish() {
wifiManager.startScan();
Log.d("WIFI-SCAN", "Started a wifiManager.startScan()");
}
}.start();
}
@Override
public void onReceive(Context c, Intent intent) {
List<ScanResult> results = wifiManager.getScanResults();
Log.d("WIFI-SCAN", "Received wifi scan results");
WiFiScan scan = new WiFiScan(results);
// push data to receiver
wiFiDataCallback.onWiFiSample(scan);
if (repeated) {
new CountDownTimer(500, 500) {
public void onTick(long millisUntilFinished) { /* do nothing */ }
public void onFinish() {
wifiManager.startScan();
Log.d("WIFI-SCAN", "Started a wifiManager.startScan()");
}
}.start();
} else
stopScanning();
}
第一个结果没问题 但其他所有的结果都是第一个结果的拷贝 不管我在大楼里的位置如何
D/WIFI-SCAN: Started a wifiManager.startScan()
D/WIFI-SCAN: Received wifi scan results
D/STRING: data is <wr t="1591525068106">
<r b="84:16:f9:25:de:24" s="-35" c="36" />
<r b="84:16:f9:25:de:25" s="-44" c="3" />
<r b="86:16:f9:24:de:25" s="-44" c="3" />
<r b="74:da:38:a2:33:67" s="-69" c="2" />
<r b="80:8c:97:74:06:09" s="-73" c="9" />
<r b="50:c7:bf:51:e8:27" s="-76" c="11" />
<r b="98:da:c4:b8:01:8f" s="-80" c="5" />
<r b="80:8c:97:74:06:0a" s="-81" c="40" />
<r b="80:8c:97:2f:81:2b" s="-84" c="11" />
<r b="90:5c:44:25:1d:a4" s="-84" c="1" />
<r b="d8:32:14:e7:ea:51" s="-84" c="2" />
<r b="cc:2d:21:33:a9:d0" s="-84" c="11" />
<r b="54:67:51:07:11:73" s="-86" c="1" />
<r b="92:5c:14:25:1d:a4" s="-87" c="1" />
</wr>
D/WIFI-SCAN: Started a wifiManager.startScan()
D/WIFI-SCAN: Received wifi scan results
D/STRING: data is <wr t="1591525068634">
<r b="84:16:f9:25:de:24" s="-35" c="36" />
<r b="84:16:f9:25:de:25" s="-44" c="3" />
<r b="86:16:f9:24:de:25" s="-44" c="3" />
<r b="74:da:38:a2:33:67" s="-69" c="2" />
<r b="80:8c:97:74:06:09" s="-73" c="9" />
<r b="50:c7:bf:51:e8:27" s="-76" c="11" />
<r b="98:da:c4:b8:01:8f" s="-80" c="5" />
<r b="80:8c:97:74:06:0a" s="-81" c="40" />
<r b="80:8c:97:2f:81:2b" s="-84" c="11" />
<r b="90:5c:44:25:1d:a4" s="-84" c="1" />
<r b="d8:32:14:e7:ea:51" s="-84" c="2" />
<r b="cc:2d:21:33:a9:d0" s="-84" c="11" />
<r b="54:67:51:07:11:73" s="-86" c="1" />
<r b="92:5c:14:25:1d:a4" s="-87" c="1" />
</wr>
b
是 bssid
, s
是 signal strength
和 c
是 channel
.
我不明白为什么会发生这种情况。我已经添加了你在代码中看到的延迟,认为它可能正在缓冲扫描结果,或者返回相同的结果,因为它从未完成另一次扫描。我可以通过在记录之前检查新的结果是否与上一次的结果不同来解决这个问题,但是这给我的结果有时会相隔1到2分钟,这就违背了连续记录和跟踪用户在房间之间移动的目的。
我认为出现这种情况有两个原因,但我不确定。要么是我在调用 wifiManager.startScan()
太快太多,或者安卓wifi扫描与之脱钩。wifiManager.startScan()
(即OS做的是被动扫描,而不是像调用扫描方法可能意味着的那样主动扫描),而且实际的扫描发生得很慢,当调用时,它只是返回它所缓冲的任何东西。
有人遇到过这个问题吗?有没有一种方法可以真正 "强迫 "它在调用时执行新的扫描?
你能不能提供更多的代码或者GitHub上的一些要点,因为可能是你的广播接收器或者打印功能的问题。
顺便说一下,你也应该注意,有很多wifi扫描的限制,你的扫描可能会被扼杀,你将不会得到任何新的扫描结果。