【问题标题】:How to Scan For Wifi Access Points in C++ on Mac OS X如何在 Mac OS X 上使用 C++ 扫描 Wifi 接入点
【发布时间】:2013-04-03 02:43:21
【问题描述】:

我需要在 Mac OS X Linux 中以 C++ 扫描并收集有关本地 Wifi 接入点的信息。这可能使用Wlan 或类似于WlanScan 的东西。我有类似的代码在 Windows 中运行,但无法翻译。

此代码正在 FireBreath 开发项目中构​​建。

您有在 Mac 上使用 C++ 扫描 Wifi 接入点的示例或建议吗?

【问题讨论】:

    标签: c++ macos network-programming wifi firebreath


    【解决方案1】:

    您不能在纯 C++ 中执行此操作,但您可以使用 Objective-C++(您的源文件只需具有 .mm 扩展名,您可以在 C++ 代码中直接使用 Objective-C)。看看CoreWLAN 框架。 你应该这样写:

    #import <CoreWLAN/CoreWLAN.h>
    
    struct AccessPoint
    {
        string ssid;
        string bssid;
        int rssi;
    };
    
    vector<AccessPoint> ScanAir(const string& interfaceName)
    {
        NSString* ifName = [NSString stringWithUTF8String:interfaceName.c_str()];
        CWInterface* interface = [CWInterface interfaceWithName:ifName];
    
        NSError* error = nil;
        NSArray* scanResult = [[interface scanForNetworksWithSSID:nil error:&error] allObjects];
        if (error)
        {
            NSLog(@"%@ (%ld)", [error localizedDescription], [error code]);
        }
    
        vector<AccessPoint> result;
        for (CWNetwork* network in scanResult)
        {
            AccessPoint ap;
            ap.ssid  = string([[network ssid] UTF8String]);
            ap.bssid = string([[network bssid] UTF8String]);
            ap.rssi = [network rssiValue];
            result.push_back(ap);
        }
    
        return result;
    }
    

    我没有测试这段代码,但我在我的项目中使用了类似的代码,所以它应该可以工作。另请注意,我在这里使用 ARC。如果您遇到一些错误,请随时在 cmets 中提问。
    苹果文档中也有example,但它有些过时(适用于 OS X 10.6)。 OS X 10.7 有一些变化。

    请注意,CoreWLAN 框架需要 OS X 10.6 或更高版本。

    【讨论】:

    • 谢谢@cody。这看起来非常有希望。我看到scanForNetworksWithSSID 正在阻塞。完美,我已经在一个异步线程中。你是说知道我在 FireBreath 中工作我可以使用 Objective-C 吗? (即据您所知,Objective-C 可以在 FireBreath 中工作吗?)
    • 关于 FireBreath 中的 Objective-C,这似乎回答了我的问题:stackoverflow.com/questions/12325559/…
    • 抱歉,我不知道 FireBreath 是什么,但 Objective-C 主要是运行时的,它是 OS X 原生的,所以我认为它会
    • FireBreath 如果您需要为网络浏览器制作跨平台/跨浏览器的 Internet 插件,那就太棒了。一站式购物。
    • @DavidManpearl 你可以向你的界面询问它(CWInterface)。属性名称相同。并且如果接口未连接,则为nil
    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 2014-09-28
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2017-07-30
    相关资源
    最近更新 更多