Qt:阅读MacOS的SSID列表

时间:2016-10-28 21:13:37

标签: macos qt networking

必须有办法使用Qt读取可用的WiFi SSID列表吗?

尝试:

QNetworkConfigurationManager nwkMgr;
// UPDATE:
// Need to call nwkMgr.updateConfigurations() here

// UPDATE this code needs to run in the slot for QNetworkManager::updateCompleted signal
QList<QNetworkConfiguration> nwkCnfList = nwkMgr.allConfigurations();
for(const QNetworkConfiguration &ncnf : nwkCnfList)
{
    qDebug() << ncnf.name() << ncnf.bearerType();
    if (ncnf.bearerType() == QNetworkConfiguration::BearerWLAN)
    {
       // would like to detect WiFi here
       qDebug() << "WiFi:" << ncnf.name();
    }
}

环境是Qt 5.7和OS X El Capitan 10.11.6。输出是:

"en1" 0
"en5" 0
"en2" 0
"bridge0" 0
"p2p0" 0
"awdl0" 0
"gif0" 0
"stf0" 0
"en0" 0
"fw0" 0

更新 上面使用接口而不是SSID的结果是第一次运行代码示例。我为我的跨平台应用程序添加了“刷新”按钮,并尝试在Mac上执行“刷新”,第二次运行在应用启动后几秒显示接口后跟所有的SSID网络可用。那一定是我打算报告的一些Qt bug(?)。

但是在Windows和Linux Ubuntu上面的相同代码输出真正的SSID并找到WiFi。 可以从命令行获取所需的(但我希望所有不仅仅是'首选')WiFi网络列表:

bash-3.2$ networksetup -listpreferredwirelessnetworks en0
Preferred networks on en0:
WiFi-N1
WiFi-N2
WiFi-N3
....
WiFi-NN

我还read从命令行调用机场程序来获取所有WiFi网络,并且有一条很长的路径到框架二进制目录,我不想硬编码。

请建议如何处理它。最坏的情况是在这里处理MacOS API(在C ++中),它也是可接受的。目标是让读取SSID让用户打开与Qt的一个WiFi连接,并通过它启动一些“交换”。如果需要提供密码,我们甚至可以处理“首选”预设连接,但最好以编程方式处理它。

2 个答案:

答案 0 :(得分:0)

错误范围可能是:Qt 5.7和OS X El Capitan 10.11.6,因为有相当多的报告认为类似的代码应该正常工作。

<强>更新 上面使用接口而不是SSID的结果是第一次运行代码示例。我已为我的跨平台应用添加了“刷新”按钮,并尝试执行“刷新”功能。在Mac上以及应用程序启动后几秒钟的第二次运行显示接口后跟所有可用网络的SSID。那一定是我打算报告的一些Qt bug(?)。

基本上,某些事情阻止了OSX上的进程或Qt框架在启动后立即报告SSID,并且启用该功能需要几秒钟。与其他平台的另一个不一致是接口报告为SSID。

<强> UPDATE2:

记住QNetworkConfigurationManager::updateConfigurations电话。只回复我们可以读取实际的SSID列表。

答案 1 :(得分:0)

在Windows中使用命令行参数读取SSID

这将显示配置文件,当前配置文件是连接

Netsh wlan show profiles

其他示例:SSID是当前连接的Wi-Fi。

Netsh WLAN show interfaces

在Linux中带有QProcess,用于运行命令

    QProcess process;
    QStringList arguments;
    QString stdout;
    process.start("ifconfig wlan0 up");
    process.waitForFinished(-1);
    arguments << "-c" << "iw dev wlan0 scan | grep SSID";
    process.start("sh" ,arguments);
    process.waitForFinished();

OR

使用connect();

使用Qt约定方式
process = new QProcess(this);  // create on the heap, so it doesn't go out of scope
    connect (process, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));  // connect process signals with your code
    process->start("netsh WLAN show interfaces");  // start the process


void readData()
{
    QTextStream StdoutStream(process->readAllStandardOutput());
    QString line;
    QString profileStr;

    do {
        line = StdoutStream.readLine();
        if ( line.contains("SSID")) // if ( line.contains("Profile"))
        {
            profileStr =  line;
            process->close();
            break;
        }
    } while (!line.isNull());

}