Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting a list of access points and their signal strength

Tags:

ios

swift

I'm currently trying to build a proof-of-concept iOS app to check if we are able to implement some sort of indoor positioning capability without deploying beacons or any other hardware.

What we have

There is a database containing all registered access points in our building including their X- and Y-coordinates. The coordinates are mapped to a custom-built grid that spans the whole building.

The app will be released using our Enterprise distribution, so there are no constraints concerning any Apple Store requirements. The app will be running exclusively on devices that automatically connect to the proper WiFi using a certificate.

What we'd like to build

In order to improve the usability of the app, we'd like to show the user his current position. Using Apples native CLLocation services is not accurate enough because we are operating inside a building. The basic idea is to fetch all nearby access points including their BSSID and signal strength and calculate a more or less accurate position using both signal strength and the location database for our access points (see above).

What i've tried so far

Using SystemConfiguration.CaptiveNetwork to get the 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 ""
}

This solution works (after setting the proper entitlements), but i'm only able to read the BSSID of the CURRENTLY CONNECTED access point.

Using UIStatusBarDataNetworkItemView to read signal strength

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
}

This one is kind of obvious, it only reads the signal strength for the connected WiFi network, not the access point specific one.

QUESTION

Is there any way to read a list of available access points (not WiFi networks) including their BSSID and signal strength? We cannot jailbreak the devices since they are under device management.

Maybe there is some way to do it using MobileWiFi.framework (see this link), but i couldn't wrap my head around doing it in Swift (kind of a beginner when it comes to iOS development).

like image 367
schaermu Avatar asked Jul 15 '19 12:07

schaermu


People also ask

How can I check my access point signal strength?

If the wireless network is already connected to, use the wireless network icon, click Network and Sharing Center, and then click Wireless Network Connection to check the wireless network signal strength.

How do I find wireless access points on my network?

If you're already connected to the network via WiFi or Ethernet, you can head into your adapter settings menu to find out your wireless access point IP address. Right-click on the network icon in the system tray and select Open Network & Internet settings.

How do I find the strongest Wi-Fi signal in my house?

How to check Wi-Fi signal strength on Android. On Android, download the Wi-Fi Speed Test app. It's a favourite of ours because it's also a handy way to test the connection speed between your phone and your router, rather than your broadband speed. However, here it's useful because it reports signal strength.

How many access points can a network have?

Most wireless access points and wireless routers can theoretically have 255 devices connected at a time.


1 Answers

I am afraid it is not possible to implement this on not jailbroken device.

I found some code for this, but it was outdated. I don't think that you will use it on iOS 3/4 devices.

NEHotspotHelper works only when Settings->Wifi page is active. You can get signal strength there, but I unsure how it will work.

MobileWiFi.framework requires entitlement, which can't be set without jailbreak.

Useful links:
Technical Q&A QA1942

Probably iBeacons or QR (AR) is the only options.

like image 70
Sergey Kuryanov Avatar answered Sep 17 '22 09:09

Sergey Kuryanov