在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;
void
*libHandle;
void
*airportHandle;
int
(*open)(
void
*);
int
(*bind)(
void
*, NSString *);
int
(*close)(
void
*);
int
(*associate)(
void
*, NSDictionary*, NSString*);
int
(*scan)(
void
*, NSArray **,
void
*);
int
(*getpower)(
void
*,
char
*);
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: (
char
*)power;
- (
int
)setPower: (
char
*)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
int
*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];
[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: (
char
*)power
{
return
getpower(airportHandle, power);
}
- (
int
)setPower: (
char
*)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
添加到项目中即可。