【问题标题】:Qt: read the list of SSID for MacOSQt:读取 MacOS 的 SSID 列表
【发布时间】:2016-10-28 21:13:36
【问题描述】:

一定有办法使用 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 错误(?)。

但上面相同的代码在 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 连接并通过它启动一些“交换”。如果需要提供密码,我们甚至可以处理“首选”预设连接,但最好也以编程方式处理。

【问题讨论】:

    标签: macos qt networking


    【解决方案1】:

    在 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();
    

    使用Qt约定方式使用connect();

    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());
    
    }
    

    【讨论】:

    • 请解释一下你的答案。没有任何解释的代码被认为是正确的 SO 答案(来自审查)。
    • 这里我们从命令行参数(netsh WLAN show interfaces)的输出中读取了连接wifi的SSID。这里的命令是使用 QProcess 执行的。并在 SIGNAL readyReadStandardOutput(); 之后读取标准输出;这是我们可以获取已连接 wifi 的 SSID 的一种方法。但不确定它的效果如何。
    【解决方案2】:

    错误范围很可能是:Qt 5.7 和 OS X El Capitan 10.11.6,因为有不少报告称类似的代码应该可以工作。

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

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

    更新 2:

    介意QNetworkConfigurationManager::updateConfigurations 来电。只有回复我们才能读取实际的 SSID 列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-15
      • 2015-04-17
      • 2010-12-21
      • 2012-03-29
      • 2016-02-15
      • 2021-12-16
      • 2015-09-28
      • 2021-02-05
      相关资源
      最近更新 更多