- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要每秒多次扫描并获取附近接入点的 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/
对于私有(private)用途,我尝试使用以下代码加载 WiFi 管理器 (iOS 6.1): airportHandle = 0; libHandle = 0; libHan
使用 Android 的 WifiManager 扫描可用的 Wifi 网络非常简单。 通过context.getSystemService获取WifiManager句柄 创建 Intent 创建广播
我正在尝试使用 WifiManager (StartScan) 类扫描一些接入点,此扫描发生在触摸事件中,但每次触摸仅进行一次扫描。问题是我需要使这个过程 10、20 或我想要的次数;但是我不知道我该
在 Android 8.1.0 及更高版本上,我遇到了一个主要问题。当使用 enableNetwork 连接到没有互联网的网络时,Android 会在几秒钟后决定将设备放回之前的网络。 我有意连接到所
我需要扫描所有可用的wifi网络,但是方法“wifiManager.startScan()”已被弃用,我找不到其他方法。 有谁知道真正的选择? 我试图在开发人员Android门户中查找更多信息,但是它
我正在搜索可用的 wifi 网络扫描,但 getScanResults() 方法返回空列表。 我包含了所需的所有权限: android.permission.ACCESS_COARSE_LOCATIO
我正在使用 ESP8266,并希望使用 MQTT 来控制它,MQTT 服务器是我的 Synology DS415+。我希望 ESP 位于安装后无法使用串行访问它的地方,因此我需要能够使用 WiFi 配
我在计时器中有这个: if (wManager.startScan()) { try { //Following method is one I call to process the r
我正在尝试连接到一个开放的 wifi 网络。当我打开我的应用程序时,它应该打开 wifi 并连接到如下定义的网络。问题是 WifiManager.getConfiguredNetworks 总是返回一
你们中有人有过 setWifiEnabled() 返回值的经验吗? 文档不清楚,它说: Returns true if the operation succeeds (or if the existi
我的问题很简单。我使用 wifiManager 扫描网络,在 SCAN_RESULTS_AVAILABLE_ACTION 广播接收器中获取结果,然后使用该信息在设备选择页面上连接到我想要连接的网络。我
我在通过代码连接到特定网络(比如 A)时遇到问题。 我的代码 fragment 是: tmpConfig = new WifiConfiguration(); tmpConfig.BSSID = sB
我正在尝试扫描多个无线信号的强度。为此,我使用 WifiManager,在循环中调用 startScan() 并且我有一个广播接收器来获取结果。 我的问题是: 我怎样才能只对某些网络进行扫描?在结果中
作为 Android 编程的新手,我尝试使用 WifiManager 的 getScanResults() 方法获取 SSID 列表,但它仍然是空的,即使我已授予它 ACCESS_COARSE_LOC
我有一台服务器,它是另一台安卓设备。服务器启动 wifi 热点。在我的客户端上,我尝试自动连接到热点。 我在 onStart() 的新线程中调用此函数: private void enableWifi
执行此行后: WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE)); 将显示一个标有“WifiMan
这让我很难受,我们将不胜感激。 我想使用 wifi 管理器连接到开放网络。我遇到的问题是代码声称连接到任何网络——甚至是不存在的网络。下面是使用网络的 SSID 执行和调用的完整代码。无论您将什么字符
我正在使用自 API 级别 21 起在 WifiManager 中可用的新方法 is5GHzBandSupported()。 http://developer.android.com/referenc
在调用 WifiManager.enableNetwork() 时,我看到我的调用线程在 native 代码中挂起。到目前为止,我只能在运行 Android 3.2.1 的 Motorola Xoom
我正在 onResume() 上注册接收器: registerReceiver(wifiConnectivityReceiver, new IntentFilter(W
我是一名优秀的程序员,十分优秀!