Difference between revisions of "MobileWiFi.framework"

From iPhone Development Wiki
Jump to: navigation, search
(Fix example code...)
(Fix signal strength calculation and include the number of bars)
Line 30: Line 30:
  
 
WiFiDeviceClientRef client = (WiFiDeviceClientRef)CFArrayGetValueAtIndex(devices, 0);
 
WiFiDeviceClientRef client = (WiFiDeviceClientRef)CFArrayGetValueAtIndex(devices, 0);
CFNumberRef RSSI = (CFNumberRef)WiFiDeviceClientCopyProperty(client, kWiFiScaledRSSIKey);
+
CFDictionaryRef data = (CFDictionaryRef)WiFiDeviceClientCopyProperty(_device, CFSTR("RSSI"));
 +
CFNumberRef scaled = (CFNumberRef)WiFiDeviceClientCopyProperty(_device, kWiFiScaledRSSIKey);
 +
 
 +
CFNumberRef RSSI = (CFNumberRef)CFDictionaryGetValue(data, CFSTR("RSSI_CTL_AGR"));
 +
 
 +
int raw;
 +
CFNumberGetValue(RSSI, kCFNumberIntType, &raw);
  
 
float strength;
 
float strength;
CFNumberGetValue(RSSI, kCFNumberFloatType, &strength);
+
CFNumberGetValue(scaled, kCFNumberFloatType, &strength);
 +
CFRelease(scaled);
  
strength = strength * 100;
+
strength *= -1;
  
// Round to the nearest integer.
+
// Apple uses -3.0.
strength = ceilf(strength);
+
int bars = (int)ceilf(strength * -3.0f);
 +
bars = MAX(1, MIN(bars, 3));
  
// Convert to a negative number (RSSI is negative).
 
strength = strength * -1;
 
  
NSLog(@"WiFi signal strength: %f dBm", strength);
+
printf("WiFi signal strength: %d dBm\n\t Bars: %d\n", raw,  bars);
  
CFRelease(RSSI);
+
CFRelease(data);
 +
CFRelease(scaled);
 
CFRelease(devices);
 
CFRelease(devices);
 
CFRelease(manager);
 
CFRelease(manager);

Revision as of 15:09, 14 October 2013

MobileWiFi.framework
Private Framework
Availabile 3.0 – present


MobileWiFi is the framework that manages WiFi functionality on iOS. It replaces the obsolete Apple80211 framework.

  • Note: Your program needs the com.apple.wifi.manager-access entitlement to use any of the WiFiManager functions.

Retrieving a list of known networks

#include <MobileWiFi.h>

WiFiManagerRef manager = WiFiManagerClientCreate(kCFAllocatorDefault, 0);

CFArrayRef networks = WiFiManagerClientCopyNetworks(manager);

NSLog(@"networks: %@", networks);

CFRelease(manager);
CFRelease(networks);

Getting the WiFi signal strength

#include <math.h>
#include <MobileWiFi.h>

WiFiManagerRef manager = WiFiManagerClientCreate(kCFAllocatorDefault, 0);
CFArrayRef devices = WiFiManagerClientCopyDevices(_manager);

WiFiDeviceClientRef client = (WiFiDeviceClientRef)CFArrayGetValueAtIndex(devices, 0);
CFDictionaryRef data = (CFDictionaryRef)WiFiDeviceClientCopyProperty(_device, CFSTR("RSSI"));
CFNumberRef scaled = (CFNumberRef)WiFiDeviceClientCopyProperty(_device, kWiFiScaledRSSIKey);

CFNumberRef RSSI = (CFNumberRef)CFDictionaryGetValue(data, CFSTR("RSSI_CTL_AGR"));

int raw;
CFNumberGetValue(RSSI, kCFNumberIntType, &raw);

float strength;
CFNumberGetValue(scaled, kCFNumberFloatType, &strength);
CFRelease(scaled);

strength *= -1;

// Apple uses -3.0.
int bars = (int)ceilf(strength * -3.0f);
bars = MAX(1, MIN(bars, 3));


printf("WiFi signal strength: %d dBm\n\t Bars: %d\n", raw,  bars);

CFRelease(data);
CFRelease(scaled);
CFRelease(devices);
CFRelease(manager);

Scanning for nearby networks

#include <MobileWiFi.h>

static WiFiManagerRef _manager;
static void scan_callback(WiFiDeviceClientRef device, CFArrayRef results, CFErrorRef error, void *token);

int main()
{
	_manager = WiFiManagerClientCreate(kCFAllocatorDefault, 0);

	CFArrayRef devices = WiFiManagerClientCopyDevices(_manager);
	if (!devices) {
		fprintf(stderr, "Couldn't get WiFi devices. Bailing.\n");
		exit(EXIT_FAILURE);
	}

	WiFiDeviceClientRef client = (WiFiDeviceClientRef)CFArrayGetValueAtIndex(devices, 0);

	WiFiManagerClientScheduleWithRunLoop(_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
	WiFiDeviceClientScanAsync(client, (CFDictionaryRef)[NSDictionary dictionary], scan_callback, 0);

	CFRelease(devices);

	CFRunLoopRun();
}

static void scan_callback(WiFiDeviceClientRef device, CFArrayRef results, CFErrorRef error, void *token)
{
	NSLog(@"Finished scanning! networks: %@", results);

	WiFiManagerClientUnscheduleFromRunLoop(_manager);
	CFRelease(_manager);

	CFRunLoopStop(CFRunLoopGetCurrent());
}

References