(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 | 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( | CFNumberGetValue(scaled, kCFNumberFloatType, &strength); | ||
CFRelease(scaled); | |||
strength = | 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( | 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 |
Headers | [headers.cynder.me] |
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