在ios扫描公共区域内wifi信息中,写了实现wifi扫描的一种方法,但是那种方法扫描出来的wifi信息不全,下面是扫描全部wifi信息的实现方法:

 
在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 (*open)(void *);
    //int (*bind)(void *, NSString *);
    //int (*close)(void *);
    //int (*scan)(void *, NSArray **, void *);
    //int (*associate)(void*, NSDictionary *, NSString *);
    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
{
    // TODO: Implement joining of network types
    return networks;
}
- (NSDictionary *)networks:( int ) type
{
    // TODO: Implement selecting of network types
    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; //seconds
    // For iPhone 2.0
    // libHandle = dlopen("/System/Library/PrivateFrameworks/Apple80211.framework/Apple80211", RTLD_LAZY);
    // For iPhone 3.0
    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
{
    // TODO: Implement selecting of network types
    if (type != 0)
        NSLog(@ "WARN: Non 80211 networks are not supported. %@" ,self);
    return [networks count];
}
- ( int )autoScanInterval
{
    return autoScanInterval;
}
- ( void )scan
{
//    NSLog(@"Scanning…");
    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;
    //bool changed;
    [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;
   
    // retrieve the current interfaces – returns 0 on success
    success = getifaddrs(&interfaces);
    if (success == 0)
    {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL)
        {
            if (temp_addr->ifa_addr->sa_family == AF_INET)
            {
                // Check if interface is en0 which is the wifi connection on the iPhone
                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@ "en0" ])
                {
                    // Get NSString from C String
                    address = [NSString stringWithUTF8String:inet_ntoa((( struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
           
            temp_addr = temp_addr->ifa_next;
        }
    }
   
    // Free memory
    freeifaddrs(interfaces);
    return address;
}
@end
添加到项目中即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值