IOS零碎技术整理(3)-获取wifi列表

1.   该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API。

如果使用这些API可能导致应用不能上app store或者ios版本升级过程中,可能对私有api不兼容,导致程序莫名的挂掉或数据获取失败

2.   终端必须越狱,且必须把程序部署到终端的/Applications目录下取得超级用户权限才能获得wifi的访问权限

代码

#import <Foundation/Foundation.h>

#import <CoreFoundation/CoreFoundation.h>

#include <dlfcn.h>

@interface SOLStumbler : NSObject {

    NSMutableDictionary *networks; //Key: MAC Address (BSSID)

   

    void *libHandle;

    void *airportHandle;

    int (*apple80211Open)(void *);

    int (*apple80211Bind)(void *, NSString *);

    int (*apple80211Close)(void *);

    int (*associate)(void *, NSDictionary*, NSString*);

    int (*apple80211Scan)(void *, NSArray **, void *);

}

- (NSDictionary *)networks;                                                             //returns all 802.11 scanned network(s)

- (NSDictionary *)network:(NSString *) BSSID;                   //return specific 802.11 network by BSSID (MAC Address)

- (void)scanNetworks;

- (int)numberOfNetworks;

@end

 

#import "SOLStumbler.h"

 

@implementation SOLStumbler

 

- (id)init

{

    self = [super init];

   

    networks = [[NSMutableDictionary alloc] init];

    libHandle = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY);

    char *error;

    if (libHandle == NULL && (error = dlerror()) != NULL)  {

       NSLog(@">>>  error %s",error);

       exit(1);

    }

    apple80211Open = dlsym(libHandle, "Apple80211Open");

    apple80211Bind = dlsym(libHandle, "Apple80211BindToInterface");

    apple80211Close = dlsym(libHandle, "Apple80211Close");

    apple80211Scan = dlsym(libHandle, "Apple80211Scan");

    apple80211Open(&airportHandle);

    apple80211Bind(airportHandle, @"en0");

    return self;

}

 

- (NSDictionary *)network:(NSString *) BSSID

{

    return [networks objectForKey:@"BSSID"];

}

 

- (NSDictionary *)networks

{

    return networks;

}

 

- (void)scanNetworks

{

    NSLog(@"Scanning WiFi Channels...");

   

    NSDictionary *parameters = [[NSDictionary alloc] init];

    NSArray *scan_networks; //is a CFArrayRef of CFDictionaryRef(s) containing key/value data on each discovered network

    apple80211Scan(airportHandle, &scan_networks, parameters);

    NSLog(@"===-scan_networks-======%@",scan_networks);

    for (int i = 0; i < [scan_networks count]; i++) {

       [networks setObject:[scan_networks objectAtIndex: i] forKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]];

    }

    NSLog(@"Scanning WiFi Channels Finished.");

}

 

- (int)numberOfNetworks

{

    return [networks count];

}

 

- ( NSString * ) description {

    NSMutableString *result = [[NSMutableString alloc] initWithString:@"Networks State: \n"];

    for (id key in networks){

       [result appendString:[NSString stringWithFormat:@"%@ (MAC: %@), RSSI: %@, Channel: %@ \n",

                            [[networks objectForKey: key] objectForKey:@"SSID_STR"], //Station Name

                            key, //Station BBSID (MAC Address)

                            [[networks objectForKey: key] objectForKey:@"RSSI"], //Signal Strength

                            [[networks objectForKey: key] objectForKey:@"CHANNEL"]  //Operating Channel

                            ]];

    }

    return [NSString stringWithString:result];

}

 

- (void) dealloc {

    apple80211Close(airportHandle);

    [super dealloc];

}

@end

posted @ 2013-09-05 11:15  vvGO  阅读(2916)  评论(0编辑  收藏  举报