gpt4 book ai didi

java - 比 WifiManager startScan() 更快的 WiFi 扫描替代方案?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:23:51 29 4
gpt4 key购买 nike

  • TL;DR 版本

我需要每秒多次扫描并获取附近接入点的 BSSID/M.A.C 地址和信号强度。 WifiManager.startScan() 扫描大约 3.5 秒,有点慢。 (对其他人来说比 6 秒要好,但对我来说还是太慢了)。我正在寻找一种每 200 毫秒或更短时间获得结果的方法。

  • 更详细的版本。

我正在尝试构建一个使用 WiFi 信号而不是 GPS 信号的位置查找应用程序。到目前为止一切顺利,除了我需要获取大量数据才能获得准确一致的结果。

我需要从我能找到的每个接入点获取 BSSID 和信号级别,然后存储这些数据以备后用。我尝试使用 WifiManager 和 BroadcastReceiver 进行扫描并获取扫描结果。他们的问题是他们真的很慢。单次扫描至少需要 3 秒。在 3 秒内信号电平值将发生变化,导致结果不准确。我还需要进行数千次扫描,这将花费大量时间。到目前为止,我还没有找到替代方案。我的手机目前运行的是 Android 8.0.0

也许如果我优化我的代码,扫描将执行得更快?

onCreate 方法:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor);

btnMainActivity = (Button) findViewById(R.id.button_ToMainActivity);
btnGetWifiInfo = (Button) findViewById(R.id.button_GetWifiInfo);
textWifiInfo = findViewById(R.id.textView_wifiInfo);
textWifiNr = findViewById(R.id.textView_wifiNr);

mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
mWifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
getScanResultInfo();
timeDifference = SystemClock.elapsedRealtime() - startTime;
textWifiInfo.setText("Seconds elapsed: "+Double.toString(timeDifference /1000.0));
nrOfScans++;
if (nrOfScans < 10){
mWifiManager.startScan();
}
}
};

getWifiInfo();
toMainActivity();

}

public void getScanResultInfo(){
int level;
List<ScanResult> wifiScanList = mWifiManager.getScanResults();
textWifiNr.setText("Nr of detected APs: "+ wifiScanList.size());
for (ScanResult scanResult : wifiScanList) {
level = WifiManager.calculateSignalLevel(scanResult.level, 5);
Log.d("WIFI","Level is " + level + " out of 5 " + scanResult.level + " on " + scanResult.BSSID + " ");
}
}

当我按下按钮时,扫描开始。

public void getWifiInfo(){
btnGetWifiInfo.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
finePermission = false;
startTime = SystemClock.elapsedRealtime();
nrOfScans = 0;
checkPermissions();
if ( finePermission == true){
((WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE)).startScan();
mWifiManager.startScan();
}
else {
Log.d("WIFI"," Missing Permissions: "+finePermission);
}
}
}
);
}

提前感谢您的宝贵时间!

最佳答案

您可以使用隐藏的 API startscanActive 跳过被动 channel 扫描。startScanActive 不是 android 引用中公开的 API;所以使用它需要您自担风险。如果您必须使用它,请引用此 - https://github.com/mozilla/MozStumbler/issues/40

另请注意,如果 API 确实如名称所示仅扫描 Activity 信道,则您将无法在扫描结果中的被动信道上显示 AP

关于java - 比 WifiManager startScan() 更快的 WiFi 扫描替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581652/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com