ios扫描公共区域内wifi信息
2018年08月03日
⁄ 综合
⁄ 共 8107字 ⁄ 字号
小 中 大
-
在ios扫描公共区域内wifi信息中,写了实现wifi扫描的一种方法,但是那种方法扫描出来的wifi信息不全,下面是扫描全部wifi信息的实现方法:
-
-
#import <CoreFoundation/CoreFoundation.h>
-
#import <Foundation/NSTimer.h>
-
#import <Foundation/Foundation.h>
-
#include <dlfcn.h>
-
#include <ifaddrs.h>
-
#include <arpa/inet.h>
-
@interface MSNetworksManager : NSObject {
-
-
NSMutableDictionary *networks;
-
NSArray *types;
-
int autoScanInterval;
-
bool scanning;
-
bool autoScanning;
-
voidvoid *libHandle;
-
voidvoid *airportHandle;
-
-
int (*open)(voidvoid *);
-
int (*bind)(voidvoid *, NSString *);
-
int (*close)(voidvoid *);
-
int (*associate)(voidvoid *, NSDictionary*, NSString*);
-
int (*scan)(voidvoid *, NSArray **, voidvoid *);
-
-
-
-
-
-
-
int (*getpower)(voidvoid *, charchar *);
-
int (*setpower)(void*, char*);
-
}
-
+ (MSNetworksManager *)sharedNetworksManager;
-
+ (NSNumber *)numberFromBSSID:(NSString *) bssid;
-
- (NSMutableDictionary *)networks;
-
- (NSDictionary *)networks:(int) type;
-
- (NSDictionary *)network:(NSString *) aNetwork;
-
- (id)init;
-
- (void)dealloc;
-
- (int)numberOfNetworks;
-
- (int)numberOfNetworks:(int) type;
-
- (int)autoScanInterval;
-
- (void)scan;
-
- (void)removeNetwork:(NSString *)aNetwork;
-
- (void)removeAllNetworks;
-
- (void)removeAllNetworks:(int) type;
-
- (void)autoScan:(bool)scan;
-
- (bool)autoScan;
-
- (void)scanSelector:(id)param;
-
- (void)setAutoScanInterval:(int) scanInterval;
-
- (int)associateNetwork: (NSDictionary *)bss: (NSString *)password;
-
- (int)getPower: (charchar *)power;
-
- (int)setPower: (charchar *)power;
-
- (NSString *) localIPAddress;
-
-
@end
-
-
-
-
-
-
-
.m文件:
-
-
#import "MSNetworksManager.h"
-
static MSNetworksManager *NetworksManager;
-
-
@implementation MSNetworksManager
-
+ (MSNetworksManager *)sharedNetworksManager
-
{
-
if (!NetworksManager)
-
NetworksManager = [[MSNetworksManager alloc] init];
-
return NetworksManager;
-
}
-
-
+ (NSNumber *)numberFromBSSID:(NSString *) bssid
-
{
-
int x = 0;
-
uint64_t longmac;
-
int MAC_LEN = 6;
-
short unsigned intint *bs_in = malloc(sizeof(short unsigned int) * MAC_LEN);
-
if (sscanf([bssid cStringUsingEncoding: [NSString defaultCStringEncoding]],"%hX:%hX:%hX:%hX:%hX:%hX",&bs_in[0], &bs_in[1], &bs_in[2], &bs_in[3], &bs_in[4], &bs_in[5]) == MAC_LEN)
-
{
-
for (x = 0; x < MAC_LEN; x++)
-
longmac |= (uint64_t) bs_in[x] << ((MAC_LEN – x – 1) * 8);
-
} else {
-
NSLog(@"WARN: invalid mac address! %@",self);
-
}
-
free(bs_in);
-
return [NSNumber numberWithUnsignedLongLong:longmac];
-
}
-
-
- (NSDictionary *)networks
-
{
-
-
return networks;
-
}
-
- (NSDictionary *)networks:(int) type
-
{
-
-
if(type != 0)
-
NSLog(@"WARN: Non 80211 networks are not supported. %@",self);
-
return networks;
-
}
-
-
- (NSDictionary *)network:(NSString *) aNetwork
-
{
-
return [networks objectForKey: aNetwork];
-
}
-
-
- (id)init
-
{
-
self = [super init];
-
NetworksManager = self;
-
networks = [[NSMutableDictionary alloc] init];
-
types = [NSArray arrayWithObjects:@"80211", @"Bluetooth", @"GSM", nil nil];
-
[types retain];
-
autoScanInterval = 5;
-
-
-
-
-
libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);
-
open = dlsym(libHandle, "Apple80211Open");
-
bind = dlsym(libHandle, "Apple80211BindToInterface");
-
close = dlsym(libHandle, "Apple80211Close");
-
scan = dlsym(libHandle, "Apple80211Scan");
-
associate = dlsym(libHandle, "Apple80211Associate");
-
getpower = dlsym(libHandle, "Apple80211GetPower");
-
setpower = dlsym(libHandle, "Apple80211SetPower");
-
-
open(&airportHandle);
-
bind(airportHandle, @"en0");
-
-
return self;
-
}
-
-
- (void)dealloc
-
{
-
close(&airportHandle);
-
[super dealloc];
-
}
-
-
- (int)numberOfNetworks
-
{
-
return [networks count];
-
}
-
- (int)numberOfNetworks:(int) type
-
{
-
-
if(type != 0)
-
NSLog(@"WARN: Non 80211 networks are not supported. %@",self);
-
return [networks count];
-
}
-
-
- (int)autoScanInterval
-
{
-
return autoScanInterval;
-
}
-
-
- (void)scan
-
{
-
-
scanning = true;
-
[[NSNotificationCenter defaultCenter] postNotificationName:@"startedScanning" object:self];
-
NSArray *scan_networks;
-
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
-
[parameters setObject:@"YES" forKey:@"SCAN_MERGE"];
-
scan(airportHandle, &scan_networks, parameters);
-
int i;
-
-
[networks removeAllObjects];
-
for (i = 0; i < [scan_networks count]; i++) {
-
[networks setObject:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"] forKey:[[scan_networks objectAtIndex: i] objectForKey:@"RSSI"]];
-
}
-
NSLog(@"Scan Finished…");
-
}
-
-
- (void)removeNetwork:(NSString *)aNetwork
-
{
-
[networks removeObjectForKey:aNetwork];
-
}
-
-
- (void)removeAllNetworks
-
{
-
[networks removeAllObjects];
-
}
-
-
- (void)removeAllNetworks:(int) type
-
{
-
if(type != 0)
-
NSLog(@"WARN: Non 80211 networks are not supported. %@",self);
-
[networks removeAllObjects];
-
}
-
-
- (void)autoScan:(bool) bScan
-
{
-
autoScanning = bScan;
-
if(bScan) {
-
[self scan];
-
[NSTimer scheduledTimerWithTimeInterval:autoScanInterval target:self selector:@selector (scanSelector:) userInfo:nil repeats:NO];
-
}
-
NSLog(@"WARN: Automatic scanning not fully supported yet. %@",self);
-
}
-
-
- (bool)autoScan
-
{
-
return autoScanning;
-
}
-
-
- (void)scanSelector:(id)param {
-
if(autoScanning) {
-
[self scan];
-
[NSTimer scheduledTimerWithTimeInterval:autoScanInterval target:self selector:@selector (scanSelector:) userInfo:nil repeats:NO];
-
}
-
}
-
-
- (void)setAutoScanInterval:(int) scanInterval
-
{
-
autoScanInterval = scanInterval;
-
}
-
-
- (int)associateNetwork:(NSDictionary *)bss: (NSString *)password
-
{
-
if(bss!=nil) {
-
NSLog(@"associateNetwork");
-
int ret = associate(airportHandle, bss, password);
-
return ret;
-
}else
-
return -1;
-
}
-
-
- (int)getPower: (charchar *)power
-
{
-
return getpower(airportHandle, power);
-
}
-
-
- (int)setPower: (charchar *)power
-
{
-
return setpower(airportHandle, power);
-
}
-
-
- (NSString *) localIPAddress
-
{
-
NSString *address = @"error";
-
struct ifaddrs *interfaces = NULL;
-
struct ifaddrs *temp_addr = NULL;
-
int success = 0;
-
-
-
success = getifaddrs(&interfaces);
-
if (success == 0)
-
{
-
-
temp_addr = interfaces;
-
while(temp_addr != NULL)
-
{
-
if(temp_addr->ifa_addr->sa_family == AF_INET)
-
{
-
-
if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"])
-
{
-
-
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
-
}
-
}
-
-
temp_addr = temp_addr->ifa_next;
-
}
-
}
-
-
-
freeifaddrs(interfaces);
-
return address;
-
}
-
-
@end
-
-
-
-
添加到项目中即可。