获取接入点及其信号强度的列表



我目前正在尝试构建一个概念验证的iOS应用程序,以检查我们是否能够在不部署信标或任何其他硬件的情况下实现某种室内定位功能。

我们拥有什么

有一个数据库,其中包含我们建筑物中所有注册的接入点,包括它们的 X 和 Y 坐标。坐标映射到跨越整个建筑物的自定义网格。

该应用程序将使用我们的企业发行版发布,因此对任何Apple Store要求没有任何限制。该应用程序将仅在使用证书自动连接到正确WiFi的设备上运行。

我们想要构建什么

为了提高应用程序的可用性,我们希望向用户显示他当前的位置。使用 Apple 的原生CLLocation服务不够准确,因为我们在建筑物内运营。基本思想是获取所有附近的接入点,包括它们的BSSID和信号强度,并使用信号强度和接入点的位置数据库计算或多或少准确的位置(见上文)。

到目前为止我尝试过什么

使用SystemConfiguration.CaptiveNetwork获取 BSSID

import SystemConfiguration.CaptiveNetwork
func getCurrentBSSID() -> String {
guard let currentInterfaces = CNCopySupportedInterfaces() as? [String] else { return "" }
for interface in currentInterfaces {
print("Looking up BSSID info for (interface)") // en0
let SSIDDict = CNCopyCurrentNetworkInfo(interface as CFString) as! [String : AnyObject]
return SSIDDict[kCNNetworkInfoKeyBSSID as String] as! String
}
return ""
}

此解决方案有效(在设置正确的权利后),但我只能读取当前连接的接入点的 BSSID。

使用UIStatusBarDataNetworkItemView读取信号强度

private func wifiStrength() -> Int? {
let app = UIApplication.shared
var rssi: Int?
guard let statusBar = app.value(forKey: "statusBar") as? UIView, let foregroundView = statusBar.value(forKey: "foregroundView") as? UIView else {
return rssi
}
for view in foregroundView.subviews {
if let statusBarDataNetworkItemView = NSClassFromString("UIStatusBarDataNetworkItemView"), view .isKind(of: statusBarDataNetworkItemView) {
if let val = view.value(forKey: "wifiStrengthRaw") as? Int {
rssi = val
break
}
}
}
return rssi
}

这一点很明显,它只读取连接的WiFi网络的信号强度,而不是特定于接入点的信号强度。

问题

有没有办法读取可用接入点(不是WiFi网络)的列表,包括它们的BSSID和信号强度?我们无法越狱设备,因为它们受设备管理。

也许有一些方法可以使用MobileWiFi.framework做到这一点(请参阅此链接),但我无法在 Swift 中做到这一点(在 iOS 开发方面有点初学者)。

恐怕不可能在未越狱的设备上实现这一点。

我为此找到了一些代码,但它已经过时了。我不认为您会在iOS 3/4设备上使用它。

NEHotspotHelper仅在设置->Wifi页面处于活动状态时起作用。你可以在那里获得信号强度,但我不确定它将如何工作。

MobileWiFi.framework需要权利,如果不越狱就无法设置。

有用的链接:
技术问答QA1942

可能iBeacons或QR (AR)是唯一的选择。

尽管许多资源说,在使用Apple">官方"框架时,您只能获得iPhone目前连接的网络的SSID。以下是解决方法:

  1. 您可以使用NEHotspotConfigurationManager类,但首先必须在Xcode中启用热点配置授权(属性列表键)。

  2. 你也可以使用NEHotspotHelper类(尽管它需要Apple的许可)。为此,您需要申请网络扩展授权,然后修改您的预配配置文件以及一些其他操作。查看此SO帖子以获取更多详细信息。

以下是如何使用NEHotspotConfigurationManager的代码片段:

import NetworkExtension
class ViewController: UIViewController {
let SSID = ""
@IBAction func connectAction(_ sender: Any) {
let hotspotConfig = NEHotspotConfiguration(ssid: SSID, passphrase: "", isWEP: false)
NEHotspotConfigurationManager.shared.apply(hotspotConfig) {[unowned self] (error) in
if let error = error {
self.showError(error: error)
} else {
self.showSuccess()
}
}
}
@IBAction func disconnectAction(_ sender: Any) {
NEHotspotConfigurationManager.shared.removeConfiguration(forSSID: SSID)
}
private func showError(error: Error) {
let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert)
let action = UIAlertAction(title: "Darn", style: .default, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
private func showSuccess() {
let alert = UIAlertController(title: "", message: "Connected", preferredStyle: .alert)
let action = UIAlertAction(title: "Cool", style: .default, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
}

以下是如何使用NEHotspotHelper的代码片段:

import NetworkExtension
import SystemConfiguration.CaptiveNetwork
func getSSID() -> String {
if #available(iOS 11.0, *) {
let networkInterfaces = NEHotspotHelper.supportedNetworkInterfaces()
let wiFi = NEHotspotNetwork()
let st = "SSID:(wiFi.SSID), BSSID:(wiFi.BSSID)"
return st
for hotspotNetwork in NEHotspotHelper.supportedNetworkInterfaces() {
let signalStrength = hotspotNetwork.signalStrength
print(signalStrength)
}
} else {
let interfaces = CNCopySupportedInterfaces()
guard interfaces != nil else { 
return "" 
}
let if0: UnsafePointer<Void>? = CFArrayGetValueAtIndex(interfaces, 0)
guard if0 != nil else { 
return "" 
}             
let interfaceName: CFStringRef = unsafeBitCast(if0!, CFStringRef.self)
let dictionary = CNCopyCurrentNetworkInfo(interfaceName) as NSDictionary?
guard dictionary != nil else { 
return "" 
} 
return String(dictionary![String(kCNNetworkInfoKeySSID)])
}
}

您可以在建筑物内使用可移动的差分GPS参考站,并将精度提高到约1-3厘米,然后依靠手机内置GPS。

相关内容

  • 没有找到相关文章

最新更新