设为首页 收藏本站
查看: 874|回复: 0

[经验分享] 转:ios扫描公共区域内的全部wifi信息

[复制链接]

尚未签到

发表于 2015-10-1 07:06:41 | 显示全部楼层 |阅读模式
  在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) *;
    } 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 ing 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 ing 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 or:@or (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 or:@or (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  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121062-1-1.html 上篇帖子: 获取wifi信号强度 下篇帖子: 蓝牙&WiFi 智能手机无线打印全攻略[转]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表