Android WiFiManager.startScan始终返回相同的结果
我已经写了一个室内定位算法,但为了让它工作,我需要一个应用程序来连续记录wifi和加速度数据,而用户在一栋大楼里走动。本质上,每隔几百毫秒,我需要记录一个“指纹”,它跟踪用户的移动,即从房间a开始,到房间B,到房间C结束。这有助于识别哪些房间有门口(基本上,哪些房间是连接的) 加速日志工作正常,但我在使用wifiManager.startScan()时遇到了一些问题。。这是在安卓9上运行的 具体来说,我有以下代码:Android WiFiManager.startScan始终返回相同的结果,android,wifi,wifimanager,indoor-positioning-system,Android,Wifi,Wifimanager,Indoor Positioning System,我已经写了一个室内定位算法,但为了让它工作,我需要一个应用程序来连续记录wifi和加速度数据,而用户在一栋大楼里走动。本质上,每隔几百毫秒,我需要记录一个“指纹”,它跟踪用户的移动,即从房间a开始,到房间B,到房间C结束。这有助于识别哪些房间有门口(基本上,哪些房间是连接的) 加速日志工作正常,但我在使用wifiManager.startScan()时遇到了一些问题。。这是在安卓9上运行的 具体来说,我有以下代码: public WiFiScanner(Context context, bool
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();
}
public WiFiScanner(上下文上下文、布尔重复、OnWiFiDataCallback-wiFiDataCallback){
超级();
this.context=上下文;
重复的,重复的;
this.wiFiDataCallback=wiFiDataCallback;
wifiManager=(wifiManager)context.getSystemService(context.WIFI_服务);
Log.d(“WIFI扫描”、“启动WIFI扫描”);
如果(!wifiManager.isWifiEnabled()){
Toast.makeText(上下文,“未启用WiFi”,Toast.LENGTH_SHORT).show();
返回;
}
registerReceiver(这是新的IntentFilter(WifiManager.SCAN\u RESULTS\u AVAILABLE\u ACTION));
新的倒计时(500500){
public void onTick(长毫秒直至完成){/*不执行任何操作*/}
公共无效onFinish(){
wifiManager.startScan();
Log.d(“WIFI-SCAN”,“启动wifiManager.startScan()”);
}
}.start();
}
@凌驾
接收时公共无效(上下文c,意图){
List results=wifiManager.getScanResults();
Log.d(“WIFI-SCAN”,“接收到的WIFI扫描结果”);
WiFiScan扫描=新WiFiScan(结果);
//将数据推送到接收器
wiFiDataCallback.onWiFiSample(扫描);
如果(重复){
新的倒计时(500500){
public void onTick(长毫秒直至完成){/*不执行任何操作*/}
公共无效onFinish(){
wifiManager.startScan();
Log.d(“WIFI-SCAN”,“启动wifiManager.startScan()”);
}
}.start();
}否则
停止扫描();
}
第一个结果还可以,但我收到的所有其他结果都只是第一个结果的副本,而不管我在大楼中的位置如何
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>
D/WIFI-SCAN:启动wifiManager.startScan()
D/WIFI-SCAN:收到WIFI扫描结果
D/STRING:数据是
D/WIFI-SCAN:启动wifiManager.startScan()
D/WIFI-SCAN:收到WIFI扫描结果
D/STRING:数据是
b
是bssid
,s
是信号强度
,c
是信道
我不明白为什么会这样。我添加了代码中可以看到的延迟,认为这可能是缓冲扫描结果,或者返回相同的结果,因为它永远无法完成另一次扫描。我可以通过在记录新结果之前检查新结果是否与上一个结果不同来解决这个问题,但这会给我带来有时相隔1或2分钟的结果,这不利于连续记录和跟踪用户在房间之间的移动
我可以看出发生这种情况的两个原因,但我不确定。要么我调用的wifiManager.startScan()
太快/太多,要么Android wifi扫描与wifiManager.startScan()
分离(即操作系统进行被动扫描,而不是主动扫描,正如调用扫描方法可能暗示的那样),实际扫描发生得非常缓慢,当调用时,它只返回它所缓冲的内容
还有其他人有这个问题吗?有没有办法在调用时真正“强制”它执行新的扫描?请您提供更多的代码或一些GitHub gist提供更多的代码,因为您的广播接收器或打印功能可能存在问题
顺便说一句,您还应该注意到,wifi扫描有很多限制,您的扫描可能会被限制,您将不会得到任何新的扫描结果。您能否提供更多的代码或一些GitHub gist提供更多的代码,因为您的广播接收器或打印功能可能存在问题 顺便说一句,您还应该注意,wifi扫描有很多限制,您的扫描可能会被限制,您将无法获得任何新的扫描结果